У меня очень тяжелый (вычислительный) функциональный компонент (Parent), который не имеет состояния и имеет несколько дочерних подкомпонентов с локальным состоянием. Дети зависят только от реквизита, отправленного от родителей.
Я передаю функцию одному из потомков (ChildA), чтобы изменить значение переменной в Parent.
Эта переменная является одним из реквизитов другого дочернего компонента (ChildB), который имеет состояние на основе этого реквизита и обновляет его в хуке useEffect.
Компонент ChildB не выполняет повторную визуализацию когда значение, переданное как prop, изменяется в родительском компоненте.
Конечно, введение состояния (ловушка useState) в Parent исправляет это, но перерисовывает родительский элемент снова и снова и убивает производительность, поскольку Parent имеет 500+ вложенных компонентов, которые все повторно визуализируются.
Введение какого-либо магазина (Redux, MobX), вероятно, решит проблему, но это будет излишним.
Упрощенный пример:
import React, { useEffect, useState } from "react";
export default function App() {
return <Parent />
}
const ChildA = ({ onAction }) => {
return <button onClick={onAction}>CLICK</button>;
};
const ChildB = ({ coreValue }) => {
const [value, setValue] = useState(0);
useEffect(() => {
setValue(coreValue);
}, [coreValue]);
return <div>My value: {value}</div>;
};
const Parent = () => {
let calculatedValue = 0;
const changeValue = () => {
calculatedValue += Math.random();
};
return (
<div>
<ChildA onAction={changeValue} />
<ChildB coreValue={calculatedValue} />
</div>
);
};
Вы можете проверить код здесь: https://codesandbox.io/s/vigilant-wave-r27rg
Как мне перерисовать только ChildB при смене реквизита?