我尝试用react创建一个简单的表单,但是很难将数据正确绑定到表单的defaultValue。
我要寻找的行为是这样的:
1.当我打开我的页面时,文本输入字段应该用我的数据库中我的AwayMessage的文本填充。也就是“示例文本”
1.理想情况下,如果数据库中的AwayMessage没有文本,我希望在Text输入字段中有一个占位符。
然而,现在,我发现每次刷新页面时,Text输入字段都是空的(尽管我输入的内容确实能正确保存并持久化)。我认为这是因为当AwayMessage是空对象时,输入文本字段的html会加载,但当awayMessage加载时不会刷新。此外,我无法为该字段指定默认值。
为清楚起见,我删除了一些代码(例如onToggleChange)
window.Pages ||= {}
Pages.AwayMessages = React.createClass
getInitialState: ->
App.API.fetchAwayMessage (data) =>
@setState awayMessage:data.away_message
{awayMessage: {}}
onTextChange: (event) ->
console.log "VALUE", event.target.value
onSubmit: (e) ->
window.a = @
e.preventDefault()
awayMessage = {}
awayMessage["master_toggle"]=@refs["master_toggle"].getDOMNode().checked
console.log "value of text", @refs["text"].getDOMNode().value
awayMessage["text"]=@refs["text"].getDOMNode().value
@awayMessage(awayMessage)
awayMessage: (awayMessage)->
console.log "I'm saving", awayMessage
App.API.saveAwayMessage awayMessage, (data) =>
if data.status == 'ok'
App.modal.closeModal()
notificationActions.notify("Away Message saved.")
@setState awayMessage:awayMessage
render: ->
console.log "AWAY_MESSAGE", this.state.awayMessage
awayMessageText = if this.state.awayMessage then this.state.awayMessage.text else "Placeholder Text"
`<div className="away-messages">
<div className="header">
<h4>Away Messages</h4>
</div>
<div className="content">
<div className="input-group">
<label for="master_toggle">On?</label>
<input ref="master_toggle" type="checkbox" onChange={this.onToggleChange} defaultChecked={this.state.awayMessage.master_toggle} />
</div>
<div className="input-group">
<label for="text">Text</label>
<input ref="text" onChange={this.onTextChange} defaultValue={awayMessageText} />
</div>
</div>
<div className="footer">
<button className="button2" onClick={this.close}>Close</button>
<button className="button1" onClick={this.onSubmit}>Save</button>
</div>
</div>
我的控制台日志显示以下内容:
AWAY_MESSAGE Object {}
AWAY_MESSAGE Object {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}
9条答案
按热度按时间bis0qfac1#
另一种解决方法是更改输入的
key
。更新:由于这得到了upvotes,我不得不说,你应该适当地有一个
disabled
或readonly
prop ,而内容正在加载,所以你不会降低用户体验。是的,它很可能是一个黑客,但它完成了工作。-)
mi7gmzs62#
defaultValue仅适用于初始加载
如果你想初始化输入,那么你应该使用defaultValue,但是如果你想使用state来改变值,那么你需要使用value。就我个人而言,如果我只是初始化它,我喜欢只使用defaultValue,然后在我提交时只使用refs来获得值。在react文档https://facebook.github.io/react/docs/forms.html和https://facebook.github.io/react/docs/working-with-the-browser.html上有更多关于refs和input的信息。
下面是我将如何重写您的输入:
另外,你也不想像以前那样传递占位符文本,因为那样实际上会将值设置为'placeholder text'。你仍然需要传递一个空值到输入中,因为undefined和nil会将值转换为defaultValue,本质上是. https://facebook.github.io/react/tips/controlled-input-null-value.html。
getInitialState无法进行API调用
你需要在getInitialState运行后调用API。对于你的情况,我会在componentDidMount中调用它。下面是https://facebook.github.io/react/tips/initial-ajax.html的例子。
我还建议阅读react.https://facebook.github.io/react/docs/component-specs.html中的组件生命周期。
用修改和加载状态重写
就我个人而言,我不喜欢在渲染中使用if else then逻辑,而更喜欢在我的状态中使用“loading”,在表单加载之前渲染一个字体很棒的微调器http://fortawesome.github.io/Font-Awesome/examples/。这里重写一遍来告诉你我的意思。如果我搞砸了cjsx的滴答声,那是因为我通常只是像这样使用coffeescript。
这应该涵盖了它。现在,这是一种使用状态和值的表单的方法。你也可以使用defaultValue代替value,然后在提交时使用refs来获取值。如果你走这条路,我建议你使用一个 shell 组件(通常称为高阶组件)来获取数据,然后将其作为 prop 传递给表单。
总的来说,我建议大家阅读react文档,做一些教程。有很多博客在那里,http://www.egghead.io有一些很好的教程。我的网站上也有一些东西,http://www.openmindedinnovations.com。
66bbxpm53#
这非常简单,使defaultValue和key相同:
这是www.example.com上推荐的方法之一https://reactjs.org/blog/2018/06/07/you-probably-dont-need-derived-state.html#recommendation-fully-uncontrolled-component-with-a-key
snz8szmq4#
也许这不是最好的解决方案,但是我会做一个像下面这样的组件,这样我就可以在代码的任何地方重用它。
该组件可能如下所示:
其中,change by array是一个通过数组表示的路径访问散列的函数
kxe2p93d5#
要强制defaultValue重新呈现,您需要做的就是更改输入本身的键值。
nwo49xxi6#
相关问题
在控件上设置
defaulValue
不会更新state
。执行反向操作非常有效:
state
设置为默认值,控件UI会正确更新,就像给定了defaulValue
一样。代码:
sqxo8psd7#
1.定义默认值的状态
1.使用
div
和key
属性包围输入1.将键值设置为与输入的defaultValue相同的值。
1.调用在步骤1中定义的
setDefaultValue
以重新呈现组件0yg35tkg8#
为参数“placeHolder”赋值。例如:-
rsaldnfx9#
使用
value
代替defaultValue
,并使用onChange
方法更改输入值。