SessionStorage 不使用挂载时调用的 useEffect 更新状态
SessionStorage doesn't update state with useEffect called on mount
正在使用 useEffect 从 SessionStorage 中提取数据并尝试将它们一起传递以更新组件装载上的 useState。似乎问题是 WHEN 数据被传递到状态,因为传递一个固定的数字确实正确地更新了状态。
我实际看到的是,在卸载组件然后重新安装后,状态(正确地)重置为初始值,但 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 值更新。
更新
好的,所以我只是注意到,如果我在第一个 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])
我想我在这里遗漏了一些简单的东西
如果在useEffect中unMount的时候想清理一些东西,需要给参数一个空的排列。
JSON.parse句号不好用
useEffect(() => {
const rehydrate1 = parseInt(sessionStorage.getItem('abc123') || '1')
const rehydrate2 = parseInt(sessionStorage.getItem('qwerty') || '1')
setMovieCounter(rehydrate1)
setMovieCounter(rehydrate2) // I think it is also wrong. setMovieCounter was called two times.
return () => {
sessionStorage.setItem('abc123', movieCounter)
sessionStorage.setItem('qwerty', serieCounter)
};
}, [])
好的,正如我所说 "I think I'm missing something simple here"。是这样的。我不小心将同一个 SessionStorage 插槽补水了两次,一次使用正确的更新数据,一次使用 stale/unused 第二个 useState
useEffect(() => {
const rehydrate1 = JSON.parse(sessionStorage.getItem('abc123') || '{}')
const rehydrate2 = JSON.parse(sessionStorage.getItem('qwerty') || '{}')
// here was the problem
setMovieCounter(rehydrate1)
setMovieCounter(rehydrate2)
console.log(rehydrate1 + ' json')
}, [])
我很抱歉 problem/solution 伙计们的平庸
在 useEffect 组件重新呈现时使用 localStorage 而不是 sessionStroage,并且无法保持会话。
console.log(">>>>outside>>",localStorage.getItem('ltk'))
// use local Storage
useEffect(() => {
fetch(url,{
method: 'GET',
headers: {
'x-access-token':localStorage.getItem('ltk')
}
})
.then((res) => res.json())
.then((data) => {
console.log(">>>>>",data)
setUser(data)
})
},[])
正在使用 useEffect 从 SessionStorage 中提取数据并尝试将它们一起传递以更新组件装载上的 useState。似乎问题是 WHEN 数据被传递到状态,因为传递一个固定的数字确实正确地更新了状态。
我实际看到的是,在卸载组件然后重新安装后,状态(正确地)重置为初始值,但 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 值更新。
更新
好的,所以我只是注意到,如果我在第一个 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])
我想我在这里遗漏了一些简单的东西
如果在useEffect中unMount的时候想清理一些东西,需要给参数一个空的排列。
JSON.parse句号不好用
useEffect(() => {
const rehydrate1 = parseInt(sessionStorage.getItem('abc123') || '1')
const rehydrate2 = parseInt(sessionStorage.getItem('qwerty') || '1')
setMovieCounter(rehydrate1)
setMovieCounter(rehydrate2) // I think it is also wrong. setMovieCounter was called two times.
return () => {
sessionStorage.setItem('abc123', movieCounter)
sessionStorage.setItem('qwerty', serieCounter)
};
}, [])
好的,正如我所说 "I think I'm missing something simple here"。是这样的。我不小心将同一个 SessionStorage 插槽补水了两次,一次使用正确的更新数据,一次使用 stale/unused 第二个 useState
useEffect(() => {
const rehydrate1 = JSON.parse(sessionStorage.getItem('abc123') || '{}')
const rehydrate2 = JSON.parse(sessionStorage.getItem('qwerty') || '{}')
// here was the problem
setMovieCounter(rehydrate1)
setMovieCounter(rehydrate2)
console.log(rehydrate1 + ' json')
}, [])
我很抱歉 problem/solution 伙计们的平庸
在 useEffect 组件重新呈现时使用 localStorage 而不是 sessionStroage,并且无法保持会话。
console.log(">>>>outside>>",localStorage.getItem('ltk'))
// use local Storage
useEffect(() => {
fetch(url,{
method: 'GET',
headers: {
'x-access-token':localStorage.getItem('ltk')
}
})
.then((res) => res.json())
.then((data) => {
console.log(">>>>>",data)
setUser(data)
})
},[])