提问者:小点点

当容器的状态树中只有一个子级的状态被修改时,为什么容器的所有PureComponent子级都在更新?


学习反应和重复。我正在玩Redux示例,目前正在看todo with undo示例(不认为可以设置沙盒之类的)。在此设置中有一个容器组件(TodoList)及其子组件(Todo)。

我将Todo从功能组件修改为PureComponent类,这样,如果所有prop引用都相同,shouldComponentUpdate()将返回false,因此组件不应更新(但它们仍将重新渲染??)。

当子对象使用componentDidUpdate()方法更新时将代码添加到日志中,以及在重新呈现时将代码添加到日志中,这表明每次向容器添加新Todo时,所有元素都会更新和重新渲染-即使是纯组件-对于每个子级,对新旧道具的粗略比较应该会为新的或更新的子级返回false。

作为Redux建立的一个例子,我怀疑他们更新商店是错误的(不是以不可变的方式),因为这是他们概念的重点,所以我相信我没有完全理解一些事情——


共2个答案

匿名用户

因为

export default class TodoList extends Component {
  render() {
    return (
      <ul>
        {this.props.todos.map((todo, index) =>
          <Todo {...todo}
                key={index}
                onClick={() => this.props.onTodoClick(index)} />
        )}
      </ul>
    );
  }
}

这将总是导致孩子重新渲染,即使它试图根据道具比较优化渲染。

匿名用户

PureComponent并不意味着它不会更新,它只是意味着React将通过实现shouldComponentUpdate和浅层的prop和state比较来为您处理props和state的比较。