2015-12-25 35 views
1

我正在研究一個簡單的流星+反應CRUD應用程序。在下面的代碼中,我的this.setState()似乎對<textarea>沒有任何影響。因此,當我點擊一個鏈接並且表單重新呈現時,即使console.log清楚地顯示所有字段都有內容,功能clickLoadForm(appId)也會正確更新<input>元素的狀態,但不會更正<textarea>的狀態。我做錯了什麼?對textarea的反應setState忽略

App = React.createClass({ 
    mixins: [ReactMeteorData], 

    getMeteorData() { 
    return { 
     applications: Applications.find({}, {sort: {createdAt: -1}}).fetch(), 
     currentApplication: Applications.findOne({_id:this.props.router.params.appid}, {sort: {createdAt: -1}}), 
    } 
    }, 
    getInitialState: function() { 
    return this.loadForm(this.props.router.params.appid); 
    }, 
    loadForm(appId) { 
    var currentApp = Applications.findOne({_id:appId}); 
    if(!currentApp) currentApp = {}; 
    return currentApp; 
    }, 
    clickLoadForm(appId) 
    { 
    var currentApp = this.loadForm(appId); 
    var state = new Object(); 
    var refs = this.refs; 
    Object.keys(refs).map(function(prop,index){ 
     state[prop] = typeof currentApp[prop] == 'undefined' ? "" : currentApp[prop]; 
    }); 
    console.log(state); 
    this.setState(state); 
    }, 
    renderListApplications() { 
    var _this = this; 
    return this.data.applications.map(function(applicationform,i) { 
     return <li key={"li"+i}><a onClick={_this.clickLoadForm.bind(_this,applicationform._id)} href={Meteor.absoluteUrl()+'application/' +applicationform._id} key={"a"+i}>Version {applicationform._id}</a></li>; 
    }); 
    }, 
    handleSubmit(event) { 
    event.preventDefault(); 
    var refs = this.refs; 
    var formVals = new Object(); 
    Object.keys(refs).map(function(prop, index){ 
     if(refs[prop].nodeName.match(/(INPUT|SELECT|TEXTAREA)/).length > 0) 
     formVals[prop] = refs[prop].value; 
    }); 

    Meteor.call("saveApplication", formVals); 

    }, 
    handleChange: function(e) { 
    if(!e.target.id) return; 
    if(typeof e.target.id == 'undefined') return; 
    var state = new Object(); 
    state[e.target.id] = e.target.value; 

    this.setState(state); 
    }, 
    render() { 
    return (
     <div className="container"> 
      <ul> 
      {this.renderListApplications()} 
      </ul> 
      <div>{JSON.stringify(this.data.currentApplication)}</div> 
      <form className="new-task" onSubmit={this.handleSubmit} > 
      <input ref="input_36" id="input_36" type="text" value={this.state.input_36} onChange={this.handleChange} /> 
      <input ref="input_37" id="input_37" type="text" value={this.state.input_37} onChange={this.handleChange} /> 
      <textarea ref="input_38" id="input_38" onChange={this.handleChange}>{this.state.input_38}</textarea> 
      <textarea ref="input_39" id="input_39" onChange={this.handleChange}>{this.state.input_39}</textarea> 
      <button type="submit">Submit</button> 
      </form> 
     </div> 
    ); 
    } 
}); 

回答

2

其實我想通了。我改變

<textarea ref="input_38" id="input_38" onChange={this.handleChange}>{this.state.input_38}</textarea> 
<textarea ref="input_39" id="input_39" onChange={this.handleChange}>{this.state.input_39}</textarea> 

<textarea ref="input_38" id="input_38" onChange={this.handleChange} value={this.state.input_38} /> 
<textarea ref="input_39" id="input_39" onChange={this.handleChange} value={this.state.input_39} /> 
+1

太好了!對未來讀者的一點注意:這裏提到的理由(這裏是文檔)(http://facebook.github.io/react/docs/forms.html#why-textarea- value)。 –

+0

目前,我更喜歡它,因爲當我第一次使用DOM時,我發現不時檢查innerHTML,其他時間值,其他時間選項[options.selectedIndex] .value等等。 – John