最后,我解决了我的问题。这是一个痛苦的调试:
// Child Component
// instead of this
// this.props.onMyDisptach([...myPropsState])
// dispatching true value since myPropsState contains only numbers
this.props.onMyDispatch([...myPropsState, true])
这是因为,我有两个条件:1)复选框更改(组件)2)按下重置按钮(子组件)
按下重置按钮时,我需要重置状态。因此,在将状态分派给重置按钮的props时,我使用了一个布尔值来知道这是重置后的更改。您可以使用任何您喜欢的东西,但需要对其进行跟踪。
现在,在组件中,我在调试控制台输出后发现了一些关于 componentWillReceiveProps 和 getDerivedStateFromProps 之间差异的提示。
// Component
static getDerivedStateFromProps(props, state) {
const { myPropsState: myState } = props
// if reset button is pressed
const true_myState = myState.some(id=>id===true)
// need to remove true value in the store
const filtered_myState = myState.filter(id=>id!==true)
if(true_myState) {
// we need to dispatch the changes to apply on its child component
// before we return the correct state
props.onMyDispatch([...filtered_myState])
return {
myState: filtered_myState
}
}
// obviously, we need to return null if no condition matches
return null
}
这是我发现控制台输出的结果:
每当props发生变化时,getDerivedStateFromProps 立即记录
componentWillReceiveProps 仅在 child 传播 props 更改后记录
getDerivedStateFromProps 不响应props更改(我的意思是示例代码中的调度更改)
componentWillReceiveProps 响应 props 的变化
因此,我们需要在使用 getDerivedStateFromProps 时提供对子组件的更改。
在我需要的状态中粘贴真值的过程,因为 getDerivedStateFromProps 处理所有更改,而 componentWillReceiveProps 仅处理子组件将更改分派到 props。
顺便说一句,您可以使用自定义属性来检查它是否已更改并在 getDerivedStateFromProps 时更新值,但由于某种原因,我必须调整此技术。
我的措辞可能有些混乱,但我希望你能理解。