• ElementUI使用el-tabs进行路由跳转时动态修改页签的标题


    目录

    需求描述

    分析及尝试

    效果实现


    需求描述

    最近在做使用若依的管理系统框架做项目,在做前端的一个需求的时候发现,在路由跳转时,发现的title只能设置为常量,在进行了不少的搜索依旧没找到如何将title值设置为变量的方法,可是当我需要根据点击的不同链接显示成不同的title应该怎么办呢?后来也发现了可以在vue的生命周期中做些文档,主要的思路就是将要显示的title值也作为参数通过路由传过去,再对其进行title的动态修改。下面说说我的实现过程和遇到的问题。

    分析及尝试

    既然显示的标题是根据路由中的title值决定的,那么在打开的页面修改其中的title值是不是就应该能完成这个需求呢?接下来就开始实现我的想法:

    1. 在路由的js中,将跳转过去的路由地址meta中的title删去,否则导航的面包屑会直接取路由中的名称,
    2. 在beforeCreate中取到当前路由的title,并设置title为路由地址中传过来的变量
    {
      path: '/data',
      component: Layout,
      hidden: true,
      children: [
        {
          path: 'syncData/:myTitle',
          component: (resolve) => require(['@/views/data/syncData'], resolve),
          name: 'SyncData',
          /*将这行代码注释 meta: { title: '固定的标题' } */
        }
      ]
    }
    beforeCreate () {
        this.$route.meta.title = `我的专属名称${this.$route.params.myTitle}`
    }

    但还是出现了第一次点击跳转后,标签的标题会显示为no-name(仅仅只有面包屑处是显示“我的专属名称”),需要关闭标签后再次打开才会显示为我们传的myTitle变量值。而后使用了chrome的vue插件查看后发现在修改了this.$route.meta.title后,实际的tabs组件对应的标签页下title还是没有改变,既然是以为tabs组件下的标签页title没变,那我们就只能再手动修改它了。

    效果实现

    在这之后又想起若依通过vuex将标签组件存放在了Store中,我们可以通过取Store.getters中的tagsView取到组件并修改其下的title变量

    /** 当前文件是getters.js */
    const getters = {
      sidebar: state => state.app.sidebar,
      size: state => state.app.size,
      device: state => state.app.device,
      /* tags中是遍历visitedViews进行展示的 */
      visitedViews: state => state.tagsView.visitedViews,
      cachedViews: state => state.tagsView.cachedViews,
      token: state => state.user.token,
      avatar: state => state.user.avatar,
      name: state => state.user.name,
      introduction: state => state.user.introduction,
      roles: state => state.user.roles,
      permissions: state => state.user.permissions,
      permission_routes: state => state.permission.routes
    }
    export default getters
    /** 当前文件是store下的index.js*/
    import tagsView from './modules/tagsView'
    
    Vue.use(Vuex)
    
    const store = new Vuex.Store({
      modules: {
        // ... ...
        // 还有其他代码,此处无关,不列出
      },
      getters
    })
    export default store

    最终的程序如下

    beforeCreate () {
      // 可有可无,在面包屑中展示
      this.$route.meta.title = `我的专属名称${this.$route.params.myTitle}`
      // 找到当前tab并修改当前tab显示的标题
      let currentView = this.$store.getters.visitedViews[this.$store.getters.visitedViews.findIndex(
        (item) => item.path === this.$route.path
      )]
      if (currentView != null) {
        currentView.title = `我的专属名称${this.$route.params.myTitle}`
      }
    }

    不过依然有美中不足的情况,就是在页面打开后可能会延迟两三秒后才会将title显示为我们最终想显示的值,不过这暂时满足了我们的需求,研究也暂时到这里停止了。如果有更好的方式,希望大家可以留言并纠正我。

    才疏学浅,如文中有错误,感谢大家指出。

  • 相关阅读:
    django QQ认证登录
    python mixin到底是什么 django
    Django View类的解析
    [置顶] 十道海量数据处理面试题
    Epoll简介以及例子
    GCC在C语言中内嵌汇编 asm __volatile__
    在FireBug中计算Javascript 运行时间
    Two Sum
    Longest Consecutive Sequence
    Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/runningRookie/p/14348225.html
Copyright © 2020-2023  润新知