Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React Native:在道具更改时更新状态,并在内部通过setState()更新状态_Reactjs_React Native - Fatal编程技术网

Reactjs React Native:在道具更改时更新状态,并在内部通过setState()更新状态

Reactjs React Native:在道具更改时更新状态,并在内部通过setState()更新状态,reactjs,react-native,Reactjs,React Native,因此,我有一个父组件,它将数据数组作为道具传递给子组件(子组件将此数组道具保存为其自身状态的一部分),并且我希望当此道具更改时,子组件的状态会更新 我使用了getDerivedStateFromProps: static getDerivedStateFromProps(props, state) { if (props.messages != state.messages) { return { messages : [ ... props.me

因此,我有一个父组件,它将数据数组作为道具传递给子组件(子组件将此数组道具保存为其自身状态的一部分),并且我希望当此道具更改时,子组件的状态会更新

我使用了getDerivedStateFromProps:

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方法

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的情况下工作