已經與React.js了兩天,我已經寫了我的大部分格式,如:工作後,以下(如official tutorial爲例):創建豐富的表單組件暴露值父組件
React.createClass({
handleSubmit: function (event) {
event.preventDefault();
var value = React.findDOMNode(this.refs.text).value;
// do something with the value
},
render: function() {
return (
<form onSubmit={this.handleSubmit}>
<input type="text" ref="text" defaultValue="foo" />
<input type="submit" value="Save"/>
</form>
);
}
}
不過,我發現recenctly這種方法的弱點在那裏,我不能寫在那些建立了由這樣的組件,如表格中使用豐富的形式組成:
var RichInput = React.createClass({
render: function() {
return (
<div className="someStyle">
<input type="text" ref="text" defaultValue="foo" />
</div>
);
}
}
React.createClass({
handleSubmit: function (event) {
event.preventDefault();
var value = React.findDOMNode(this.refs.text).value;
// do something with the value
},
render: function() {
return (
<form onSubmit={this.handleSubmit}>
<RichInput />
<input type="submit" value="Save"/>
</form>
);
}
}
現在我想知道。通過現有資源尋找後,我發現下面的方法來克服這個限制:
var RichInput = React.createClass({
render: function() {
return (
<div className="someStyle">
<input type="text" value="foo" onChange={this.props.callback} />
</div>
);
}
}
React.createClass({
handleSubmit: function (event) {
event.preventDefault();
var value = this.state.text
// do something with the value
},
getInitialState() {
return {text: 'foo'};
}
updateText: function(value) {
this.setState({text: value});
}
render: function() {
return (
<form onSubmit={this.handleSubmit}>
<RichInput callback={this.updateText} />
<input type="submit" value="Save"/>
</form>
);
}
}
這是規範的解決方案,編寫模塊化形式組件?我想知道這對我來說似乎有很多開銷。我需要編寫額外的功能和我需要使組件處於完全狀態,這使我無法適應此解決方案。另外,我想知道性能,因爲我不需要更新每次更改的價值,但僅限於(以及在)提交表單的情況下。
一種可能性,我發現是使用:
React.findDOMNode(this.refs.rich.refs.text);
鑑於RichInput
已ref="rich"
上定義。但是React的文檔再次表示refs不應該被認爲是傀儡API,並且可以在組件之外訪問。
你也可以做'this.refs.rich.getDOMNode()value'。也不確定你的問題是什麼?你問你應該如何處理這些行爲? – knowbody
這對我的示例嘗試使用時不起作用。我想知道在React中閱讀孩子的表單值是什麼規範的方法。 –