reactjs - 父母如何改变孩子状态和孩子如何改变父母状态反应
问题描述
假设在当前项目中,我们没有设置 redux。我们在层次结构中有这些组件:
- p1
-- p2
--- p3
---- p4
----- c1
我希望 p3 组件改变 c1 的状态,而 c1 改变 p3 的状态。有没有简单的方法来实现这一目标?
解决方案
从 P3 改变 C1 的状态:
p3 组件可以通过改变它向下传递给 p4 的 props 来改变 c1 的状态,p4 必须改变它向下传递给 c1 的 props。在 c1 中,您将通过 componentWillReceiveProps 检测道具更改,并在此函数中根据从 p3 一直向下传递的道具设置新的 c1 状态:
// in c1
componentWillReceiveProps(newProps) {
this.setState({ someC1Data: newProps.someP3Data });
}
从 C1 更改 P3 的状态:
这可以通过使用回调来完成。c1 的 props 将是一个回调,比如 changeParent3State(someC1Data),所以在 c1 中,只要你想改变 p3 的状态,你就可以调用 this.props.changeParent3State(someC1Data)。您将在 p4 中具有相同的函数回调,以便 p4 接收 c1 的函数调用,并且 p4 再次通过 this.props.changeParent3State(someC1Data) 对 p3 进行相同的调用父树。p3 组件现在已经接收到 c1 的数据,并且在函数实现中可以根据 c1 的数据更改其状态,如果提供了任何数据:
// in p3
changeParent3State(someC1Data) {
this.setState({ someP3Data: someC1Data});
}
推荐阅读
- java - java - 如何在Java中没有Random类的情况下创建每个字符的随机字符顺序并且不重复
- python - 序列化器字段可能命名不正确,并且与 `list` 实例上的任何属性或键都不匹配
- javascript - 如何使用 easyimage ckeditor 将照片上传到本地服务器?
- haskell - convert list of Tupel into list of lists
- android - 在 VS2017 中无法让 Admob 在我的 Cordova Android 应用程序中工作
- html - YouTube 视频上的敲除文本
- c - 使用凯撒密码在 C 中进行加密
- android - Exoplayer 正在使用 PageTransformer 删除预览
- android - 如何为安卓应用程序创建一个单独的目录,如whatsapp
- python - 如何检查浮点数列表加起来是否为整数?