学习反应和重复。我正在玩Redux示例,目前正在看todo with undo示例(不认为可以设置沙盒之类的)。在此设置中有一个容器组件(TodoList)及其子组件(Todo)。
我将Todo从功能组件修改为PureComponent类,这样,如果所有prop引用都相同,shouldComponentUpdate()将返回false,因此组件不应更新(但它们仍将重新渲染??)。
当子对象使用componentDidUpdate()方法更新时将代码添加到日志中,以及在重新呈现时将代码添加到日志中,这表明每次向容器添加新Todo时,所有元素都会更新和重新渲染-即使是纯组件-对于每个子级,对新旧道具的粗略比较应该会为新的或更新的子级返回false。
作为Redux建立的一个例子,我怀疑他们更新商店是错误的(不是以不可变的方式),因为这是他们概念的重点,所以我相信我没有完全理解一些事情——
因为
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的比较。