Reactjs React Native:在道具更改时更新状态,并在内部通过setState()更新状态
因此,我有一个父组件,它将数据数组作为道具传递给子组件(子组件将此数组道具保存为其自身状态的一部分),并且我希望当此道具更改时,子组件的状态会更新 我使用了getDerivedStateFromProps:Reactjs React Native:在道具更改时更新状态,并在内部通过setState()更新状态,reactjs,react-native,Reactjs,React Native,因此,我有一个父组件,它将数据数组作为道具传递给子组件(子组件将此数组道具保存为其自身状态的一部分),并且我希望当此道具更改时,子组件的状态会更新 我使用了getDerivedStateFromProps: static getDerivedStateFromProps(props, state) { if (props.messages != state.messages) { return { messages : [ ... props.me
static getDerivedStateFromProps(props, state) {
if (props.messages != state.messages) {
return {
messages : [ ... props.messages]
};
}
return null;
}
但是,我还希望能够通过setState()
更新子级中的状态。
但是,当我调用setState()
来更新this.state.messages
时,更改不会反映出来(可能是因为只有当道具更改时才会发生对this.state.messages的更改,因为我已经覆盖了getDerivedStateFromProps()
)
当道具发生变化时,以及当我想在孩子体内更新道具时,是否有任何方法可以更新孩子的this.state.messages
状态
我的限制:
- 我无法将数据的所有权仅隔离给父级或子级中的一个
- 我希望其他人使用这个组件,所以我不希望他们必须从父组件传递一个函数作为道具来更新子组件中父组件的数据源
shouldComponentUpdate(nextProps){
if(nextProps.messages.length > this.props.messages.length)
return true
return true;
}
现在使用组件diddupdate更新您的状态:
componentDidUpdate(prevProps) {
// Typical usage (don't forget to compare props):
if (this.props.messages.length !== prevProps.messages.length) {
this.setState({
messages: this.props.messages
)}
}
}
检查这个例子,您可能会发现一些有用的东西,这几乎可以正常工作,但出于某种原因,子组件是一个道具转换后面(当道具处于状态x时,子组件的道具值处于状态x-1)有什么想法吗?shouldComponentUpdate中的nextrops.messages和componentdiddupdate中的this.props.messages应该匹配:/噢,实际上它确实匹配!但是,这个.setState({messages:this.props.messages)}似乎没有用新的道具正确更新状态-状态更改只在下次道具更改时发生。出于某种原因,我建议您将子组件转换为功能组件。通过这种方式,您可以轻松地更新函数组件中的状态:const[messages,setMessages]=useState([])useffect(()=>{setMessages(props.messages)}[props.messages])当我们设置state时,我们没有返回true,这并没有导致它更新。它现在应该可以在没有forceUpdate的情况下工作