优化
2023年01月12日
一、value 状态提升
因为 context
会根据引用标识来决定何时进行渲染(本质上是 value
属性值的浅比较),所以这里可能存在一些陷阱,当 provider
的父组件进行重渲染时,可能会在 consumers
组件中触发意外的渲染。举个例子,当每一次 Provider
重渲染时,由于 value
属性总是被赋值为新的对象,以下的代码会重新渲染下面所有的 consumers
组件:
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 (
<MyContext.Provider value={this.state.value}>
<Toolbar />
</MyContext.Provider>
);
}
}
二、Memoization 缓存优化
调用了 useContext
的组件总会在 context
值变化时重新渲染。如果重渲染组件的开销较大,你可以通过使用 memoization
来优化。
2.1 通过 Memo
function Button() {
let appContextValue = useContext(AppContext);
let theme = appContextValue.theme;
return <ThemedButton theme={theme} />
}
const ThemedButton = memo(({ theme }) => {
return <ExpensiveTree className={theme} />;
});
2.2 通过 useMemo
function Button() {
let appContextValue = useContext(AppContext);
let theme = appContextValue.theme;
return useMemo(() => {
return <ExpensiveTree className={theme} />;
}, [theme])
}