如何在React中访问孩子的状态

我的结构如下:

FormEditor-保存FieldEditor的多个实例
FieldEditor-编辑表单的字段,并在其状态下保存有关该字段的各种值

当在FormEditor中单击一个按钮时,我希望能够从所有FieldEditor组件中收集有关字段的信息、处于其状态的信息,并将其全部保存在FormEditor中

我考虑将有关字段的信息存储在FieldEditor的状态之外,并将其置于FormEditor的状态。但是,这将需要FormEditor在其FieldEditor组件更改并将其信息存储在其状态时侦听它们

我不能直接进入儿童状态吗?理想吗

在我详细介绍如何访问子组件的状态之前,请务必阅读Markus ipse关于处理此特定场景的更好解决方案的回答

如果确实希望访问组件子级的状态,可以为每个子级分配一个名为ref的属性。现在有两种实现引用的方法:使用React.createRef()和回调引用

使用React.createRef()

从React 16.3开始,这是目前推荐的使用参考文献的方法(有关更多信息,请参阅文档)。如果您使用的是早期版本,请参阅下面有关回调引用的内容

您需要在父组件的构造函数中创建一个新引用,然后通过ref属性将其分配给子组件

类FormEditor扩展了React.Component{
建造师(道具){
超级(道具);
this.FieldEditor1=React.createRef();
}
render(){
return<FieldEditor ref={this.FieldEditor1}/>;
}
}

要访问此类ref,您需要使用:

const currentFieldEditor1=this.FieldEditor1.current;

这将返回已安装组件的实例,因此您可以使用currentFieldEditor1.state访问该状态

请注意,如果在DOM节点而不是组件上使用这些引用(例如<div ref={this.divRef}/>),则this.divRef.current将返回底层DOM元素,而不是组件实例

回调引用

此属性接受一个回调函数,该函数传递对附加组件的引用。此回调在装入或卸下组件后立即执行

例如:

<字段编辑器
ref={(fieldEditor1)=>{this.fieldEditor1=fieldEditor1;}
{…道具}
/&燃气轮机;

在这些示例中,引用存储在父组件上。要在代码中调用此组件,可以使用:

this.fieldEditor1

然后使用this.fieldEditor1.state获取状态

需要注意的一点是,在尝试访问子组件之前,请确保其已渲染^_^

如上所述,如果在DOM节点而不是组件上使用这些引用(例如,<div ref={(divRef)=>{this.myDiv=divRef;}}/>),则this.divRef将返回底层DOM元素而不是组件实例

进一步资料

如果您想了解更多关于React的ref属性的信息,请从Facebook查看此页面

确保您阅读了“不要过度使用参考”部分,该部分指出您不应该使用孩子的状态来“使事情发生”

发表评论