React 中的 Context 会有重复渲染的 Bug 情况,如何解决?
当Provider提供的值,发生改变时,会导致Provider的子组件也会跟着渲染,也就是多渲染了一次,这种情况怎么解决?
因为 context 会使用参考标识(reference identity)来决定何时进行渲染,
这里可能会有一些陷阱,当 provider 的父组件进行重渲染时,可能会在 consumers 组件中触发意外的渲染。
举个例子,当每一次 Provider 重渲染时,以下的代码会重渲染所有下面的 consumers 组件,
因为 value 属性总是被赋值为新的对象:
class App extends React.Component {
render() {
return (
<MyContext.Provider value={{something: 'something'}}>
<Toolbar />
</MyContext.Provider>
);
}
}为了防止这种情况,将 value 状态提升到父节点的 state 里:
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
value: {something: 'something'},
};
}
render() {
return (
<Provider value={this.state.value}>
<Toolbar />
</Provider>
);
}
}