【发布时间】:2020-06-06 00:16:04
【问题描述】:
我有父组件,它在其状态中包含一个全局值。此值的更改必须触发子组件的状态更改,如下例所示:
function Parent(props) {
const [parentState, setParentState] = useState(someState);
return (
<button onClick={() => setParentState(newState)>Button</button>
<ChildComponent parentState={parentState} />
}
function Child(props) {
const [childState, setChildState] = useState(getState(props.parentState));
}
点击本例中的按钮应该会触发 Child 组件中状态的非平凡变化(它使用 parentState 作为参数来生成自己的状态)。
我想这个问题的第一个答案是提升状态 - 但是我不想这样做,因为通过 .map 函数生成了许多 Child - 我需要将它们的状态保留在一个数组中并将其传播到所有子组件。父组件中的值是与所有子组件相关的全局值,并且当 parentState 发生变化时,所有子组件都必须更改其状态。
有没有什么好的方法可以在不提升子组件状态的情况下实现这一目标?我希望我已经足够好地描述了这个问题 - 如果没有,我很乐意更新信息。
【问题讨论】:
-
您能否详细说明一下父级的全局值是如何应用于子级的?您是否将整个
parentState应用于孩子?如果是这样,孩子们甚至需要自己的状态吗?我认为您的问题暗示父母会根据需要“重置”孩子,但是孩子可能会偏离父母并在状态上有所不同,直到父母的下一次“重置”将孩子恢复为与父母相同.我在正确的轨道上吗? -
Aurélien:我已经将父母的状态转移给孩子,问题是孩子的状态是在初始化时设置的(请参阅孩子状态)并且不会随着父母状态的后续变化而改变。 @WGriffing:孩子根据父母的状态(比如用户的全局设置)和它自己的非衍生状态(组件的设置)加载一组数据。这两个因素作为返回子数据的函数的参数传递。
标签: javascript reactjs state