Javascript JSON分析错误:意外标识符“0”;“未定义”;使用本地存储
我一直在使用useContext从一个页面到另一个页面获取变量,我实现了localStorage,所以我刷新了页面。但是,当我刷新我的Javascript JSON分析错误:意外标识符“0”;“未定义”;使用本地存储,javascript,reactjs,local-storage,use-context,Javascript,Reactjs,Local Storage,Use Context,我一直在使用useContext从一个页面到另一个页面获取变量,我实现了localStorage,所以我刷新了页面。但是,当我刷新我的门户时 第页我收到了这个错误: JSON解析错误:意外标识符“未定义” 奇怪的是,如果我刷新它的子页面editPortal,就不会出错 有人能帮我吗 _app.tsx: 从“../context/PortalContext”导入{PortalContext}; 函数MyApp({Component,pageProps}){ const[portal,setPort
门户时
第页我收到了这个错误:
JSON解析错误:意外标识符“未定义”
奇怪的是,如果我刷新它的子页面editPortal
,就不会出错
有人能帮我吗
_app.tsx:
从“../context/PortalContext”导入{PortalContext};
函数MyApp({Component,pageProps}){
const[portal,setPortal]=useState();
const[loading,setLoading]=useState(true);
useffect(()=>{
const portal=localStorage.getItem('portal');
如果(门户){
setPortal(JSON.parse(portal));
}
设置加载(假);
}, []);
功能选择门户(门户:门户){
setPortal(portal);
如果(窗口类型!==“未定义”){
setItem('portal',JSON.stringify(portal));
}
}
返回(
);
}
portals.tsx
导出默认功能入口(){
const router=useRouter();
const{choosePortal}=useContext(PortalContext);
const baseName=Array.isArray(router.query.baseName)
?router.query.nomeBase[0]
:router.query.nomeBase;
const portal:portal=GetPortals(baseName);
选择门户(门户);
如果(门户){
返回portal.title
}
非常感谢!谢谢你们的考虑和问题 我相信我存储了一个未定义的
门户
,它发生在完成之前
在设置本地存储之前,我只添加了一个额外的验证和&portal
:
function choosePortal(portal: Portal) {
setPortal(portal);
if (typeof window !== 'undefined' && portal) {
localStorage.setItem('portal', JSON.stringify(portal));
}
}
在您尝试解析
portal
之前,您是否检查了它的值?这可能是因为您的本地存储项中包含的值未定义
,该值不是有效的JSON。有效的JSON以{
开始,以}结束
。每个键都应该是一个字符串,每个值都应该是一个数组/对象/字符串/整数。@DimitarDev-JSON不必以{
开头,以}
[1]结尾,就像“1”
(带实际引号)和1
(后两者在几年前被认为是JSON的“片段”)一样,都是有效的JSON但是这个概念很早就消失了。顶级数组一直都是有效的。)那么.setItem()
将把一个“real”undefined
值转换为字符串“undefined”
,因此在初始化属性时可能有什么问题。当.getItem()时
被调用,它将返回该字符串,并且if(portal)
测试将成功。由于从getItem
获得的唯一可能的值是null
和一个字符串,我猜您不小心将字符串“undefined”
存储在本地存储器中(可能是通过将未定义的
存储在那里;它将自动转换为字符串)。由于未定义的
是真实的,因此它会传递您的if(门户)
test。但它不是有效的JSON,因为它的字符串值只是JSON词汇表中没有的undefined
。您最好的办法可能是查找存储undefined
的位置。