React+JWT鉴权从/:id路径登出报setRefreshCheckLogin不是函数错误
根因分析
报错的核心原因是路由切换触发组件提前卸载,导致props引用失效,只有/:id路径触发的原因如下:
- 你在
logout函数中先执行logoutApi,而logoutApi内部调用了window.history.replaceState修改页面路径 - 首页路径本身就是
/,修改路径为/不会触发路由重渲染,LeftMenu组件不会被卸载,因此setRefreshCheckLoginprops正常可用 - 个人页路径为
/:id,修改路径为/会立即触发路由切换,如果你的LeftMenu是写在/:id对应的路由组件内部(而非全局公共布局),路由切换时/:id路由组件会连带LeftMenu一起卸载,后续执行setRefreshCheckLogin时,组件已经销毁,props引用失效就会抛出「不是函数」的错误
解决方案
按优先级从高到低选择即可:
- 调整执行顺序:先更新状态,再执行路由跳转
修改logout函数的执行顺序,把状态更新操作放到路由跳转前面,避免组件提前卸载导致props失效:
const logout = () => { // 先执行状态更新,触发App.js的登录态校验逻辑 setRefreshCheckLogin(true); // 再执行登出、路由跳转逻辑 logoutApi(); }
- 调整LeftMenu渲染位置
把LeftMenu放到全局公共布局层(比如App.js内的公共外层结构),所有路由共享同一个LeftMenu实例,路由切换时组件不会被卸载,从根源避免props失效问题。 - 增加调用防护
给方法调用加上可选链运算符,就算props异常也不会阻断登出流程:
setRefreshCheckLogin?.(true);
- 校验props传递完整性
排查所有渲染LeftMenu的父组件,确认都正确传递了setRefreshCheckLogin属性,避免部分路由漏传导致的undefined问题。
内容的提问来源于stack exchange,提问作者Antonio contreras
相关产品推荐
相关产品推荐

