Не только ваша функция computePriceSummary()
не вызывается нигде в ловушке useEffect
, но вы не увидите никакого повторного рендеринга, даже если вы включили эти 3 состояния в массив зависимостей.
useEffect(() => {
computePriceSummary();
}, [taxes, total, subtotal]);
Вы получите следующее предупреждение:
React Hook useEffect имеет недостающую зависимость: 'computePriceSummary'. Либо включите его, либо удалите массив зависимостей. (react-hooks / excustive-deps)
Вы можете увидеть это в действии в этой демо . Данные изменяются, но повторный рендеринг в этом компоненте не запускается.
Если вы включили computePriceSummary
в массив зависимостей (всего 4), повторный рендеринг сработает.
Но есть новое предупреждение:
Функция computePriceSummary изменяет зависимости хука useEffect (в строке 37) при каждом рендеринге. Переместите его в обратный вызов useEffect. В качестве альтернативы можно заключить определение computePriceSummary в его собственный хук useCallback (). (react-hooks / excustive-deps).
Давайте исправим это, оборачивая функцию с помощью useCallback
hook. useCallback заставляет саму функцию изменяться только при необходимости, имея собственный массив зависимостей.
const computePriceSummary = useCallback(() => {
computeSubtotal();
computeTaxes();
computeTotal();
}, []);
Опять же, вы получаете предупреждение о зависимости, теперь он просит включить все другие функции в качестве зависимостей:
React Hook useCallback не имеет зависимостей: computeSubtotal, computeTaxes и computeTotal. Либо включите их, либо удалите массив зависимостей. (react-hooks / excustive-deps)
И мы исправляем это, снова используя перехватчик useCallback со всеми другими функциями. Передача соответствующего состояния (того, которое используется внутри каждой функции) в их собственный массив зависимостей.
Это становится повторяющимся, не так ли? Возможно, вы захотите выполнить эти задачи в бэкэнде и использовать уменьшенные данные в React.
Здесь вы можете увидеть полную демонстрацию с эмулированной тележкой, которая обновляется при нажатии кнопки. Состояние настроено правильно, предупреждений о зависимостях нет, функционал работает нормально.