reactjs - 从父级到子级的状态更改未反映到 React Hook 中的 TextField
问题描述
我将组件 (C) 作为道具传递给父组件 (A) 内的子组件 (B)。A 的状态也传递给 C 并映射到 C 的状态。但是当我相应地更新 A 的状态和 B 的状态时,C 的状态不会更新。
我的代码如下所示:(省略了导入语句)
const Parent = (props) => {
.............(other state)
const [info, setInfo] = React.useState(props.info);
const handleDataChanged = (d) => { setInfo(d); }
return (
<div>
........(other stuffs)
<MyModal
..........(other props)
body={ <MyComp data={ info } updateData={ handleDataChanged } /> }
/>
</div>
);
}
const MyModal = (props) => {
..........(other state)
const [content, setContent] = React.useState(props.body);
React.useEffect(() => { setContent(props.body); }, [props]);
return (
<Modal ...>
<div>{ content }</div>
</Modal>
);
}
const MyComp = (props) => {
const [data, setData] = React.useState(props.data);
React.useEffect(() => { setData(props.data); }, [props]);
return (
data && <TextField value={ data.name }
onChange={ e => {
let d = data;
d.name = e.target.value;
props.updateData(d); }} />
);
}
当我在 TextField 中输入内容时,我看到Parent
'已info
更改。useEffect
of没有被MyModal
解雇。而且data
inMyComp
没有更新。
更新:经过更多检查上面的代码和下面的解决方案,问题仍然存在,但我看到data
inMyComp
确实得到了更改Parent
,但 TextField 没有反映它。
有人请告诉我如何更新data
并将MyComp
其反映到Parent
. 非常感谢!
解决方案
实际上,您似乎正在尝试重新创建子 API https://reactjs.org/docs/react-api.html#reactchildren。
如果你使用 props.children 来组合你的组件而不是上下传递 props 会容易得多。
const MyModal = (props) => {
...(other state)
return (
<Modal>
<div>{ props.children }</div>
</Modal>
);
}
然后您可以直接在父级中处理功能,而无需将道具映射到状态(强烈建议不要这样做)......
const Parent = (props) => {
...(other state)
const [info, setInfo] = React.useState(props.info);
const handleDataChanged = d => setInfo(d);
return (
<div>
...(other stuffs)
<MyModal {...props}>
<MyComp data={ info } updateData={ handleDataChanged } />
</MyModal>
</div>
);
}
这种方法的好处是开销要少得多。而不是将状态 A 传递给 C 并映射到 C 的状态,您可以从状态 A(父组件)执行所有操作。不需要映射,你有一个状态的真实来源,并且更容易思考和构建。
或者,如果您想坚持当前的方法,那么只需像这样直接删除React.useEffect(() => { setContent(props.body); }, [props]);
并MyModal
映射道具
<Modal>
<div>{ props.body }</div>
</Modal>
推荐阅读
- javascript - 正则表达式忽略文本中间的破折号或连字符
- python - 如何使用 Python 中的机器人在 Discord 中发送某人的姓名
- spring - Spring Cloud 配置响应
- python - 使用 sqlalchemy 回滚执行的查询
- python - 我想在 python 中运行多个“或”函数,但不知道该怎么做
- python - 用opencv检测插头上的榫头
- windows - 如何为双向 TLS 分发客户端范围的证书?
- c++ - CoInitializeEx() 和 COINIT_APARTMENTTHREADED 或 COINIT_MULTITHREADED 用于使用 COM C++ 的 MS-Word 自动化
- javascript - 我的 .append 不起作用,但它将数据保存在本地存储中
- appium - 由于底部中心屏幕 Appium + Android 上的覆盖按钮,无法滚动