公司有个需求,我们的项目是微服务项目,每个tab里面的内容都是 iframe,现在需求是点击刷新 F5 等刷新,iframe 还保留在原来的页面。

1. iframe 子页面 router.js 中监听路由变化,并存储当前页面的路由

router.beforeEach((to, from, next) => {
  sessionStorage.setItem('routerName', to.path) //存储当前路由
  next()
})

2.在 iframe App.vue mounted 下,监听页面刷新,判断是否存有路由,如果存在,跳转到存的这个路由,否则去主页面

 mounted () {
    window.addEventListener('beforeunload', e => {
      sessionStorage.setItem('beforeunload', 1);
    });
    // 监听页面刷新
    if (sessionStorage.getItem('beforeunload') == 1) {
      let name = sessionStorage.getItem("routerName");
      if (name) {
        this.$nextTick(function () {
          this.$router.push({ path: name }); //如果sessionStorage存在路由,去缓存的路由
        })
      }else{
        this.$nextTick(function () {
         this.$router.push({ path: '/' });  //不存在存储,去主页
        }
      }
    }
  },

3.补充:这种写有个问题,当关闭tab的时候,routerName,缓存没有删除,所以下次重新打开这个iframe的时候可能会跳转 sessionStorage 中存储的路由,根据实际情况进行改写

在关闭tab的方法中,用 postMessage 像子页面 iframe 传递数据, targetKey 是当前关闭的key,比如关闭的targetKey 是 0006

**框架中的代码你自己组件的代码位置 **

 //关闭应用窗口,
    const removeApp = (targetKey) => {
      const frame = document.querySelector("#iframe");
      setTimeout(() => {
        frame.contentWindow.postMessage(targetKey, "*") //传递数据给子页面
      })
  }

iframe 子页面中代码

APP.vue 中 mounted 事件中,这里的代码写在,监听刷新上面,因为要在刷新前判断有没有被清空

  mounted () {
    //关闭tab时,清空保存的路由
    window.addEventListener("message", function (e) {
      console.log('iframe传值',e);
      if(e.data == '0006'){ //如果传过来的值是0006 清空 sessionStorage
        sessionStorage.removeItem('routerName')
      }
    })
}
Logo

前往低代码交流专区

更多推荐