【问题标题】:React Native : Updating state when props change and internally through setState()React Native:当道具改变时更新状态,并通过 setState() 在内部更新状态
【发布时间】:2020-07-20 19:25:11
【问题描述】:

所以我有一个父组件将数据数组作为道具传递给子组件(子组件将此数组道具保存为自己状态的一部分),并且我希望在此道具更改时更新子组件的状态.

我这样使用 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 的孩子状态?

我的限制:

  • 我无法将数据的所有权隔离给父母或子女之一
  • 我希望其他人使用这个组件,所以我不希望他们必须从父组件传递一个函数作为道具来更新子组件中父组件的数据源

【问题讨论】:

标签: reactjs react-native


【解决方案1】:

您的父状态作为道具传递给子组件。尝试在子组件中使用 shouldComponentUpdate 方法。

shouldComponentUpdate(nextProps){
if(nextProps.messages.length > this.props.messages.length)
    return true
return true;
}

现在使用 componentDidUpdate 更新您的状态:

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 中的 nextProps.messages 和 componentDidUpdate 中的 this.props.messages 应该匹配:/
  • 哦,确实匹配!但似乎 this.setState({messages : this.props.messages)} 没有使用新道具正确更新状态 - 状态更改仅在下次道具因某种原因更改时发生
  • 我建议您将子组件转换为功能组件。这样您就可以轻松地在函数组件中更新您的状态: const [messages, setMessages] = useState([]) useEffect(() => { setMessages(props.messages) }, [props.messages])
  • 当我们设置状态时,我们没有返回 true,这不会导致它更新。它现在应该可以在没有 forceUpdate 的情况下工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 2020-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多