移动端应用白屏报错Type Error: Assignment to constant,网页端正常是什么原因?
错误原因
- 核心问题是你直接对
const声明的变量二次赋值:通过const [access_token, setAccessToken] = useState()解构出的access_token、refresh_token都是只读常量,你在else分支直接执行access_token = xxx、refresh_token = xxx的操作,违反了const的语法规则,必然会抛出Type Error: Assignment to constant错误。 - 网页端能正常运行大概率是两个原因:一是网页端运行时
access_token初始就存在有效值,没有触发else分支的赋值逻辑;二是部分浏览器JS引擎在非严格模式下对这类错误做了降级兼容,没有直接抛出阻断运行的异常,而移动端的JS引擎(比如React Native/小程序的JS核心)语法校验更严格,直接抛出错误导致白屏。 - 如果你使用的是React Native这类跨端移动端框架,额外需要注意:移动端环境本身没有浏览器的
localStorage原生API,直接调用也会触发异常,但你当前的报错首先是常量赋值导致的。
修复方案
修改状态赋值逻辑,不要直接操作const声明的状态变量,使用useState对应的setter方法更新状态,同时将本地存储读写逻辑调整到合理的执行时机,避免每次组件渲染都重复执行:
// 初始化state时直接从本地存储读取默认值,避免后续额外赋值 const [access_token, setAccessToken] = useState(() => { return JSON.parse(localStorage.getItem('access_token')) }); const [refresh_token, setRefreshToken] = useState(() => { return JSON.parse(localStorage.getItem('refresh_token')) }); // 监听token变化,有值时自动同步到本地存储 useEffect(() => { if (access_token) { localStorage.setItem('refresh_token', JSON.stringify(refresh_token)); localStorage.setItem('access_token', JSON.stringify(access_token)); } }, [access_token, refresh_token])
如果你用的是React Native/小程序等无localStorage的移动端环境,需要将上述代码中的
localStorage替换为对应平台支持的存储方案(比如React Native用@react-native-async-storage/async-storage,小程序用wx.setStorageSync等)。
内容的提问来源于stack exchange,提问作者Ndango
相关产品推荐
相关产品推荐

