У меня есть контекст и 2 компонента: один отображает то, что находится в контексте, другой обновляет его.
Имея следующий код в компоненте средства обновления, он будет повторно отображаться при изменении контекста .
const [, setArray] = React.useContext(context);
setArray(prevArray => { return [...prevArray, []] }
Это означает, что infit ie перерисовывает. Мне нужно этого избежать. Поскольку средство обновления не использует данные в контексте, оно не должно обновляться.
Полный пример: я сохраняю и отображаю данные профилировщика о компоненте.
https://codesandbox.io/s/update-react-context-without-re-rendering-the-component-making-the-update-k8ogr?file= /src/App.js
const context = React.createContext();
const Provider = props => {
const [array, setArray] = React.useState([]);
const value = React.useMemo(() => [array, setArray], [array]);
return <context.Provider value={value} {...props} />;
};
const Metrics = () => {
const [array] = React.useContext(context);
return <TextareaAutosize value={JSON.stringify(array, null, 2)} />;
};
const Component = () => {
const [, setArray] = React.useContext(context);
const onRenderCallback = (id, _phase, actualDuration) => {
setArray(prevArray => {
return [...prevArray, [id, actualDuration]];
});
};
return (
<React.Profiler id="1" onRender={onRenderCallback}>
<div />
</React.Profiler>
);
};
export default function App() {
return (
<div className="App">
<Provider>
<Metrics />
<Component />
</Provider>
</div>
);
}