跳到主要内容

优化

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])
}