反应输入默认值不随状态更新 [英] React input defaultValue doesn't update with state

查看:27
本文介绍了反应输入默认值不随状态更新的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 React 创建一个简单的表单,但在将数据正确绑定到表单的 defaultValue 时遇到了困难.

我正在寻找的行为是这样的:

  1. 当我打开我的页面时,文本输入字段应填写我数据库中 AwayMessage 的文本.那就是示例文本"
  2. 理想情况下,如果我的数据库中的 AwayMessage 没有文本,我希望在文本输入字段中有一个占位符.

但是,现在我发现每次刷新页面时文本输入字段都是空白的.(尽管我在输入中输入的内容确实会正确保存并保持不变.)我认为这是因为当 AwayMessage 是空对象时,输入文本字段的 html 会加载,但在 awayMessage 加载时不会刷新.此外,我无法为该字段指定默认值.

为了清晰起见,我删除了一些代码(即 onToggleChange)

 window.Pages ||= {}Pages.AwayMessages = React.createClassgetInitialState: ->App.API.fetchAwayMessage(数据)=>@setState awayMessage:data.away_message{离开消息:{}}onTextChange: (事件) ->console.log "VALUE", event.target.valueonSubmit: (e) ->窗口.a = @e.preventDefault()离开消息 = {}awayMessage["master_toggle"]=@refs["master_toggle"].getDOMNode().checkedconsole.log "文本值", @refs["text"].getDOMNode().valueawayMessage["text"]=@refs["text"].getDOMNode().value@离开消息(离开消息)离开消息:(离开消息)->console.log "我正在保存", awayMessageApp.API.saveAwayMessage awayMessage, (data) =>如果 data.status == 'ok'App.modal.closeModal()NotificationActions.notify("离开消息已保存.")@setState awayMessage:awayMessage渲染:->console.log "AWAY_MESSAGE", this.state.awayMessageawayMessageText = if this.state.awayMessage then this.state.awayMessage.text else "Placeholder Text"`<div className="离开消息"><div className="header"><h4>离开消息</h4>

<div className="内容"><div className="输入组"><label for="master_toggle">开启?</label><input ref="master_toggle" type="checkbox" onChange={this.onToggleChange} defaultChecked={this.state.awayMessage.master_toggle}/>

<div className="输入组"><label for="text">Text</label><input ref="text" onChange={this.onTextChange} defaultValue={awayMessageText}/>

<div className="footer"><button className="button2" onClick={this.close}>关闭</button><button className="button1" onClick={this.onSubmit}>保存</button>

我的 AwayMessage 的 console.log 显示如下:

AWAY_MESSAGE 对象 {}AWAY_MESSAGE 对象 {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}

解决方案

另一种解决此问题的方法是更改​​输入的 key.

更新:由于这得到了投票,我不得不说你应该在加载内容时正确设置 disabledreadonly 道具,这样你就不会降低用户体验.

是的,这很可能是一次黑客攻击,但它完成了工作.. ;-)

I'm trying to create a simple form with react, but facing difficulty having the data properly bind to the defaultValue of the form.

The behavior I'm looking for is this:

  1. When I open my page, the Text input field should be filled in with the text of my AwayMessage in my database. That is "Sample Text"
  2. Ideally I want to have a placeholder in the Text input field if the AwayMessage in my database has no text.

However, right now, I'm finding that the Text input field is blank every time I refresh the page. (Though what I type into the input does save properly and persist.) I think this is because the input text field's html loads when the AwayMessage is an empty object, but doesn't refresh when the awayMessage loads. Also, I'm unable to specify a default value for the field.

I removed some of the code for clarity (i.e. 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>

my console.log for AwayMessage shows the following:

AWAY_MESSAGE Object {}
AWAY_MESSAGE Object {id: 1, company_id: 1, text: "Sample Text", master_toggle: false}

解决方案

Another way of fixing this is by changing the key of the input.

<input ref="text" key={this.state.awayMessage ? 'notLoadedYet' : 'loaded'} onChange={this.onTextChange} defaultValue={awayMessageText} />

Update: Since this get upvotes, I will have to say that you should properly have a disabled or readonly prop while the content is loading, so you don't decrease the ux experience.

And yea, it is most likely a hack, but it gets the job done.. ;-)

这篇关于反应输入默认值不随状态更新的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆