在我详细介绍如何访问子组件的状态之前,请确保阅读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
“使事情发生”。
希望这可以帮助^ _ ^
编辑:添加React.createRef()
了创建引用的方法。删除了ES5代码。