Получение данных из SessionStorage с помощью useEffect и попытка передать их для обновления useState при монтировании компонента. Кажется, что проблема в КОГДА , данные передаются в состояние, поскольку передача фиксированного числа действительно корректно обновляет состояние.
Что я на самом деле вижу, так это то, что после размонтирования и последующего повторного монтирования компонента состояние (правильно) сбрасывается к исходному значению, но значение, установленное в SessionStorage, не передается из useEffect.
Может ли быть проблема в том, что useEffect действует как componentDidMount, а не componentWillMount?
На несвязанной заметке SessionStorage не сохраняется при обновлении страницы, что странно, поскольку я думал, что оно исчезает только при закрытии вкладки
const [movieCounter, setMovieCounter] = useState<number>(1)
const [serieCounter, setSerieCounter] = useState<number>(1)
console.log(movieCounter + ' state') // this logs 1 after re-mount
useEffect(() => {
return () => {
//this works
sessionStorage.setItem('abc123', JSON.stringify(movieCounter))
sessionStorage.setItem('qwerty', JSON.stringify(serieCounter))
};
}, [movieCounter, serieCounter])
useEffect(() => {
const rehydrate1 = JSON.parse(sessionStorage.getItem('abc123') || '{}')
const rehydrate2 = JSON.parse(sessionStorage.getItem('qwerty') || '{}')
setMovieCounter(rehydrate1)
setMovieCounter(rehydrate2)
// here if I pass a fixed number i.e. 4 updates state correctly to 4
// on mount
// setMovieCounter(4)
// this logs actual value pulled from sessionstorage
console.log(rehydrate1 + ' json')
}, [])
Состояние при монтировании необходимо обновить из значений SessionStorage.
UPDATE
хорошо, поэтому я просто заметил, что если я передам фиксированное число в возвращаемой функции первого useEffect, значение передается в состояние при каждом монтировании.
// this updates the state to 60 after every re-mount of the component
useEffect(() => {
return () => {
sessionStorage.setItem('abc123', JSON.stringify(60))
sessionStorage.setItem('qwerty', JSON.stringify(60))
};
}, [movieCounter, serieCounter])
Я думаю, мне здесь не хватает чего-то простого