在我详细介绍如何访问子组件的状态之前,请务必阅读Markus-ipse的回答,了解处理此特定场景的更好解决方案。
如果您确实希望访问组件子组件的状态,您可以ref
为每个子组件分配一个属性。现在有两种方法可以实现引用:使用引用React.createRef()
和回调引用。
使用 React.createRef()
从 React 16.3 开始,这是目前推荐的使用引用的方式(有关更多信息,请参阅文档)。如果您使用的是早期版本,请参阅下面有关回调引用的信息。
您需要在父组件的构造函数中创建一个新引用,然后通过ref
属性将其分配给子组件。
class FormEditor extends React.Component {
constructor(props) {
super(props);
this.FieldEditor1 = React.createRef();
}
render() {
return <FieldEditor ref={this.FieldEditor1} />;
}
}
为了访问这种引用,您需要使用:
const currentFieldEditor1 = this.FieldEditor1.current;
这将返回一个已安装组件的实例,以便您可以使用它currentFieldEditor1.state
来访问状态。
快速说明一下,如果您在 DOM 节点而不是组件(例如<div ref={this.divRef} />
)上使用这些引用,那么this.divRef.current
将返回底层 DOM 元素而不是组件实例。
回调引用
此属性采用一个回调函数,该函数传递了对附加组件的引用。该回调在组件挂载或卸载后立即执行。
例如:
<FieldEditor
ref={(fieldEditor1) => {this.fieldEditor1 = fieldEditor1;}
{...props}
/>
在这些示例中,引用存储在父组件上。要在您的代码中调用此组件,您可以使用:
this.fieldEditor1
然后用于this.fieldEditor1.state
获取状态。
需要注意的一件事,请确保您的子组件在尝试访问之前已呈现 ^_^
如上所述,如果您在 DOM 节点而不是组件(例如<div ref={(divRef) => {this.myDiv = divRef;}} />
)上使用这些引用,那么this.divRef
将返回底层 DOM 元素而不是组件实例。
更多信息
如果你想了解更多关于 React 的 ref 属性,请查看Facebook 的这个页面。
确保您阅读了“不要过度使用参考资料”部分,该部分说您不应该使用孩子的资料state
来“使事情发生”。