Я сделал здесь рабочий пример: https://codesandbox.io/s/magical-flower-o0gyn?file=/src/App.js.
Когда я нажимаю кнопку "Скрыть", я хочу сохранить обновленные данные в localstorage:
- Я нажимаю "Скрыть" в первом столбце:
setValueWithCallback
запускается, устанавливает обратный вызов на ссылку и устанавливает состояние useEffect
срабатывает, вызывает обратный вызов с обновленными даннымиsaveToLocalStorage
вызывается вuseCallback
сdata
, установленным как зависимость
Проблема находится на 3-м шаге, в локальное хранилище сохраняется {visible: true}
для обоих. Я знаю, изменю ли я эту строку:
const saveToLocalStorage = useCallback(() => {
localStorage.setItem(
`_colProps`,
JSON.stringify(data.map((e) => ({ id: e.id, visible: e.visible })))
);
}, [data]);
К этому:
const saveToLocalStorage = localStorage.setItem(
`_colProps`,
JSON.stringify(data.map((e) => ({ id: e.id, visible: e.visible })))
);
Это работает, но я не могу разобраться, почему не работает с первым. Я предполагаю, что это должно быть какое-то завершение, но я этого не вижу.
Если data
уже был обновлен, а useEffect
запустил обратный вызов, почему он не обновляется в массиве зависимостей ?. Да, пример странный, и второе решение совершенно нормально, я просто хотел продемонстрировать проблему. Спасибо за помощь!
useCallback(() => {
не должно бытьuseCallback((data) => {
? Вы передаете аргумент функции обратного вызова, но определение функции обратного вызова не принимает никаких параметров. - person Yousaf   schedule 06.02.2021data
- это локальное состояние компонента, а не аргумент, который вы передаете при вызовеcallbackRef.current(data);
- person Yousaf   schedule 06.02.2021data
в массиве зависимостей не должен быть уже обновлен при срабатывании обратного вызова? Если вы нажмете на другую кнопку после первого щелчка, один объект будет сохранен правильно, поэтому он находится за циклом. - person marchello   schedule 06.02.2021useCallback
работает. Я думал, что когда что-то в массиве зависимостей изменяется, оно генерирует новую функцию с самыми актуальными значениями внутри своего тела. - person marchello   schedule 06.02.2021