NextJS 中的 LocalStorage , useEffect 问题
Posted
技术标签:
【中文标题】NextJS 中的 LocalStorage , useEffect 问题【英文标题】:LocalStorage in NextJS , useEffect problem 【发布时间】:2021-11-13 15:23:59 【问题描述】:我在 localStorage 中获取和设置数据时遇到问题,我使用 NextJs,然后我一开始无法使用 localStorage。
我尝试使用 useEffect 解决,但我有一个无限循环,我知道它是针对依赖项的。我不知道使用 useCallback 或 useMemo 或 useRef 解决问题的最佳方法。
我粘贴了部分有问题的代码。
const [ meetings, setMeetings] = useState([]) // meetings= [meeting1,meeting2]
useEffect(() =>
if(localStorage.getItem('meetings') === undefined ||
localStorage.getItem('meetings') === '' ||
localStorage.getItem('meetings') === null
)
localStorage.setItem('meetings', JSON.stringify([]))
if( JSON.parse(localStorage.getItem('meetings')).length === 0)
const meetingsInLocalStorage = JSON.parse(localStorage.getItem('meetings'))
setMeetings([...meetings, meetingsInLocalStorage])
,[meetings])
【问题讨论】:
是否有理由需要在依赖项数组中包含meetings
?
【参考方案1】:
您可以将此条件缩短为
localStorage.getItem('meetings') === undefined || localStorage.getItem('meetings') === '' || localStorage.getItem('meetings') === null
这个
!localStorage.getItem('meetings')
这个sn-p的代码没有意义,因为如果localStorage中的数据是空的
if (JSON.parse(localStorage.getItem('meetings')).length === 0)
这也是空的
const meetingsInLocalStorage = JSON.parse(localStorage.getItem("meetings"));
当你传播会议数组时,你不会传播meetingsInLocalStorage
,而是继续将空数组推入meetings
状态。
setMeetings([...meetings, meetingsInLocalStorage]);
您的数据将类似于[ [], [], ...]
,并且会议变量发生变化,因此useEffect
再次运行导致无限循环。
终于
如果localStorage
中有一些会议状态,我假设您想更新会议状态
所以你的支票应该是
if (JSON.parse(localStorage.getItem("meetings")).length > 0)
const meetingsInLocalStorage = JSON.parse(localStorage.getItem("meetings"));
setMeetings([...meetings, ...meetingsInLocalStorage]);
【讨论】:
以上是关于NextJS 中的 LocalStorage , useEffect 问题的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apollo 客户端在 nextJs 中传递授权标头的最佳方法? ReferenceError: localStorage 未定义
如何在 NextJS s-s-r 中存储和获取 access_token
无法从 nextjs 中的 api 获取图像-TypeError:无法读取未定义的属性(读取“地图”)NEXTJS