Когда вы передаете значение в useState
, это значение используется для инициализации состояния. Он не устанавливается каждый раз, когда компонент перезапускается, поэтому в вашем случае path
устанавливается только при монтировании компонента.
Даже если реквизиты меняются, состояние path
не будет.
Поскольку ваше начальное состояние зависит от опоры, все, что вам нужно сделать, это вытащить соответствующую опору из вашего реквизита и передать ее функции, которая вычисляет начальное значение path
:
const Figure = (props) => {
// get relevant prop
const { importantProp } = props;
// path will never change, even when props change
const [path] = useState(calculatePath(importantProp));
return(
<G>
<Path d={path} />
</G>
)
}
Однако функция calculatePath
по-прежнему оценивается при каждом рендеринге, даже если значение path
не инициализируется повторно. Если calculatePath
является дорогостоящей операцией, рассмотрите возможность использования useMemo
вместо этого:
Вы можете убедиться, что path
обновляется только при изменении указанного c реквизита, добавив этот реквизит в массив зависимостей:
const Figure = (props) => {
const { importantProp } = props;
const path = useMemo(() => calculatePath(importantProp), [importantProp]);
return(
<G>
<Path d={path} />
</G>
)
}
И в этом случае вам вообще не нужно состояние.
Добавление importantProp
в массив зависимостей useMemo
означает, что каждый раз, когда importantProp
изменяется, React пересчитает вашу переменную path
.
Использование useMemo
предотвратит оценку дорогостоящих вычислений при каждом рендеринге.
Я создал Пример CodeSandbox где в консоли видно, что путь пересчитывается только при изменении указанного пропеллера important
. Если вы измените любой другой реквизит, path
не будет пересчитан.