使用 complex/nested 状态更新重新渲染 React child 组件

Rerender React child component with a complex/nested state update

下面是我实际代码的示例版本。

// parent component
this.state = {
  ...,
  dummies: [
    {id: 1, name: "nothing"},
    {id: 2, name: "nothing"},
    {id: 3, name: "nothing"}
  ],
  ...
};

render(){
  return <ChildComponent dummies={this.state.dummies} />;
};

// ChildComponent
this.state = {
  ...,
  dummies: this.props.dummies
};
...
{
  this.state.dummies.map((eachDummy) => {
    return <GrandChild id={eachDummy.id} dummy={eachDummy} />
  });
}

经过一些互动,我正在更新 parent 状态下的假人,如下所示

this.setState({
  ...this.state,
  dummies: [
    {id: 1, name: "something"}, // observe change in name property
    {id: 2, name: "nothing"},
    {id: 3, name: "nothing"}
  ]
})

真正的问题来了。当 dummiess 的名称属性发生微小变化时,如何让我的 Child 和 GrandChild 组件呈现?我认为 React 的浅比较无法识别变化,但我需要 Child 和 GrandChild 来重新渲染和更新 UI。 我怎样才能做到这一点? (请注意,我无法避免状态中的 objects 数组)

为了在更新父组件状态时重新渲染孙组件,它最终必须通过 props 在其渲染方法中使用父组件的状态。在您的子组件的渲染方法中,您从子组件的 state 而不是它的 props 传递给孙组件 'dummies'。

以下是您所描述的工作示例:

class Parent extends Component {
  constructor() {
    super();
    this.state = {
      dummies: [
        {id: 1, name: "nothing"},
        {id: 2, name: "nothing"},
        {id: 3, name: "nothing"}
      ]
    }
  }

  render() {
    return <div>
      <button onClick={() =>
        this.setState({
          dummies: [
            {id: 1, name: "nothing"},
            {id: 2, name: "nothing"},
            {id: 3, name: "something"}
          ]
        })
      }>
        Update state
      </button>
      <Child dummies={this.state.dummies} />
    </div>
  }
}

class Child extends Component {
  render() {
    return this.props.dummies.map(dummy => <GrandChild name={dummy.name} />);
  }
}

class GrandChild extends Component {
  render() {
    return <p>{this.props.name}</p>;
  }
}

ReactDOM.render(<Parent />, document.getElementById('root'));