如何访问React中的儿童状态?
我有以下结构:
FormEditor
– 保存多个FieldEditor FieldEditor
– 编辑表单的一个字段并保存其状态的各种值
当在FormEditor中单击一个button时,我希望能够收集有关所有FieldEditor
组件中的字段的信息,处于其状态的信息,并将其全部包含在FormEditor中。
我考虑将FieldEditor
状态以外的字段信息存储FieldEditor
,并将其置于FormEditor
的状态。 但是,这将需要FormEditor
来监听它们的每个FieldEditor
组件,因为它们将信息更改并存储在状态中。
我不能只是访问儿童的状态吗? 这是理想的吗?
如果你已经有单独的FieldEditor的onChange处理程序,我不明白为什么你不能只将状态移动到FormEditor组件,只是传递一个callback到FieldEditors,将更新父状态。 对我来说,这似乎是一个更为React-y的方式。
这也许是:
var FieldEditor = React.createClass({ handleChange: function(event) { var text = event.target.value; this.props.onChange(this.props.id, text); }, render: function() { return ( <div className="field-editor"> <input onChange={this.handleChange} value={this.props.value}/> </div> ); } }); var FormEditor = React.createClass({ getInitialState: function() { return {}; }, handleFieldChange: function(fieldId, value) { var newState = {}; newState[fieldId] = value; this.setState(newState); }, render: function() { var fields = this.props.fields.map(function(field) { var props = { id: field, onChange: this.handleFieldChange, value: this.state[field] } return <FieldEditor {...props} /> }, this); return ( <div> {fields} <div>{JSON.stringify(this.state)}</div> </div> ); } }); var App = React.createClass({ render: function() { var fields = ["field1", "field2", "anotherField"]; return ( <FormEditor fields={fields}/> ); } }); React.render(<App/>, document.body);
http://jsbin.com/fabonujenu/8/edit
编辑:而不是将FieldEditor元素作为子元素传递给FormEditor我只需传递一个fieldIds列表,然后在FormEditor中创build它们。 这使得更容易dynamic添加FieldEditor,并使FormEditor的渲染方法减lesswonkey。
如果要访问组件的子项的状态,则可ref
每个子项分配一个名为ref
的属性。 该属性采用一个callback函数,该函数传递一个对附件的引用。 该组件在装载或卸载后立即执行。
例如:
ES5:
<FieldEditor ref={function(fieldEditor1){this.fieldEditor1 = fieldEditor1;}} {...props} />
ES6:
<FieldEditor ref={(fieldEditor1) => {this.fieldEditor1 = fieldEditor1;} {...props} />
在这些例子中,引用存储在父组件上。 要在你的代码中调用这个组件,你可以使用:
this.fieldEditor1
然后使用this.fieldEditor1.state
来获取状态。
有一件事要注意,确保您的子组件在您尝试访问它之前已经呈现^ _ ^
如果你想阅读更多关于React的ref属性,请查看Facebook上的这个页面 。
确保你阅读了“ 不要过度使用参考资料 ”一节,说明你不应该使用孩子的state
来“使事情发生”。
希望这有助于^ _ ^
编辑:改变回答使用callback参考,而不是string参考,因为string参考可能会被删除在未来的React.js版本(请参阅参考文献和DOM的更多细节)。