关于在浏览器新标签页重新登录后旧页面没刷新导致一系列问题的解决方法

关键:页面登录标记与本地缓存标记不同,就刷新页面更新标记

起因

我在维护一个老项目,这项目把登录信息存到了本地存储,每个页面在data里获取了来用,这导致了用户开启新标签窗口重新登录,但之前打开的旧页面没刷新,我们知道data里获取的数据会被存储在自己的作用域,直到刷新页面才会重新执行data方法,那么这就导致了这个旧页面的执行的所有操作都是使用的旧信息,导致了一系列用户操作的出错。

第一种

那么我就想到在每个打开的页面上都加一个当前登录人标识,在接口做请求的时候在请求拦截器里对比标识与当前本地存储的真正登录人是否一样,标识不同就弹窗提醒用户刷新页面再执行操作。

第二种

app.vue

python 复制代码
 data() {
    return {
     
      loginUl: JSON.parse(localStorage.getItem("loginUl")),
    
    };
  }, 
 mounted() {
          document.addEventListener("visibilitychange", this.handleAddListener);

  },
  beforeDestroy() {
    document.removeEventListener("visibilitychange", this.handleAddListener);
  },
  methods: {
    handleAddListener(){
      if(!JSON.parse(localStorage.getItem("loginUl"))||(JSON.parse(localStorage.getItem("loginUl"))&&this.loginUl.userId!=JSON.parse(localStorage.getItem("loginUl")).userId)){
             window.location.reload(true);
      }
    },
}

在app.vue加一个页面是否失焦的判断,如果浏览器被最小化或当前标签页不再作为主窗口后就变回主窗口,那么就对比页面路由元信息meta的params的登录人ID与本地存储的登录人ID是否一致,不一致就直接强制刷新页面来获取最新信息,这样比在app.vue里做定时器循环对比要合理的多。

第三种

watch监听本地存储来决定是否刷新页面

可能出现的问题

一些用户在旧页面写满文字后没点击保存,在新标签页重新登录回到旧标签页面刷新后没有了刚才所有写的痕迹,我是之前被测试提过这种类似的bug,解决办法就是把信息短暂的存在了会话存储,回来刷新后再取。但这种全部页面都这样搞太夸张了,询问组长后决定以后这种情况不归为bug。

结局

最终采用第二种解决方法,完美解决了问题。

后续

这种改动影响的范围太多了,出了不少bug,大多是老缓存没有及时清理造成的

需要注意:

1、路由前置守卫加上只要是去登录页就清一遍缓存

2、app.vue里判断没有本地缓存或data里的用户信息没拿到就用reload方法刷新页面(Ctrl+f5的效果)不走缓存

3、切换登录人后跳转页面后刷新页面保证对比不出错,有的webpack版本有一个避免跳重复页面(相同路径)的校验会导致报错,这个时候就判断如果要跳的页面就是当前页面,就直接刷新

if(this.$route.path==ulLi[0].url){

window.location.reload(true);

}else{

this.$router.replace(url).then(() => {

// 重新刷新页面

location.reload()

});

相关推荐
xinyu_Jina18 分钟前
PaperStudio:WYSIWYG文档的Web实现——从CSS Print到客户端PDF生成的技术解析
前端·css·pdf
默默学前端25 分钟前
html列表标签及css列表属性
前端·css·html5
要加油哦~25 分钟前
工具 | vscode 中出现的报错 | 橙色的提示和红色的波浪线代表?| ESLint 和 Prettier 规范问题
ide·vscode·编辑器
毕设源码-朱学姐8 小时前
【开题答辩全过程】以 工厂能耗分析平台的设计与实现为例,包含答辩的问题和答案
java·vue.js
老前端的功夫9 小时前
Vue 3 性能深度解析:从架构革新到运行时的全面优化
javascript·vue.js·架构
天天扭码10 小时前
如何实现流式输出?一篇文章手把手教你!
前端·aigc·ai编程
前端 贾公子10 小时前
vue移动端适配方案 === postcss-px-to-viewport
前端·javascript·html
三天不学习11 小时前
Cursor vs Trae vs VSCode:2025终极IDE横评,谁才是开发者的效率之选?
ide·vscode·编辑器
GISer_Jing11 小时前
AI营销增长:4大核心能力+前端落地指南
前端·javascript·人工智能