zoukankan      html  css  js  c++  java
  • Vue-cli项目与element导航菜单控件的结合使用以及遇到的问题

    1、基本使用

    • 第一种常用写法:导航菜单与 router-view 的配合使用
      • 将所用的导航菜单数据编写成一个数组的形式,提高维护性;
        • 在utils工具文件夹中建立utils.js文件;
          import merge from 'webpack-merge'
          /**
           * 工具类Class
           */
          class testUtils {
              constructor() { }
              //当前默认语言
              static currentLang = 'zh-CN'
              //支持国际化语言
              static supportLangs = ['zh-CN', 'en-US']
          
              /**
               * [mergeI18nFiles 根据url里的language获取国际化文件]
               * @param  {[JSON]} i18nParams  [i18n参数]
               * @return {[JSON]}             [国际化配置]
               */
              mergeI18nFiles(i18nParams) {
                  return require('@/pages/' + i18nParams.module + '/config/lang/' + i18nParams.lang + '/index')
              }
              /**
               * [getLanguageFromUrl 通过url里的language匹配当支持国际化的language,如果匹配到,返回匹配的language,匹配不到,返回默认language]
               * @return {[String]}               [匹配的language]
               */
              getLanguageFromUrl() {
                  for (let val of adrsUtils.supportLangs) {
                      let url = window.location.href
                      let hashBackUrl = url.substring(url.indexOf('#/') + 2)
                      const urlLang = hashBackUrl.substring(0, hashBackUrl.indexOf('/'))
                      if (adrsUtils.supportLangs.includes(urlLang)) {
                          return urlLang
                      } else {
                          return adrsUtils.currentLang
                      }
                  }
              }
          }
          
          export default new testUtils()
          export { testUtils }
          View Code
        • 在app.js文件中引入国际化:
          import Vue from 'vue'
          import VueI18n from 'vue-i18n'
          import testUtils from '@/utils/utils'
          Vue.use(VueI18n)
          
          //获取url中的language
          const language = testUtils.getLanguageFromUrl()
          //根据url里的language动态加载language配置文件
          let i18nParams = { module: 'index', lang: language }
          const messages = testUtils.mergeI18nFiles(i18nParams).default
          const i18n = new VueI18n({
              locale: language,
              messages
          })
          View Code
        • 在global文件夹中,建立locale.js文件;
          import testUtils from '@/utils/utils'
          export default {
              install(Vue) {
                  const language = testUtils.getLanguageFromUrl()
                  Vue.$language = language
                  Vue.prototype.$language = language
              }
          }
        • 在JS文件夹下面建立data.js文件;
          import Vue from 'vue'
          const language = Vue.$language
          const testingLocale = require(`../../config/lang/${language}/testing_${language}`).default
          
          //导航数据   title为导航的内容   iconName是导航图标
          export const menuData = [
              {
                  title: testingLocale[language].message.testing.test1,
                  iconName: require('../../assets/images/test1.png'),
                  route: {
                      path: 'test1',
                  },
              },
              {
                  title: testingLocale[language].message.testing.test2,
                  iconName: require('../../assets/images/test2.png'),
                  route: {
                      path: 'test2',
                  },
              }
          }
          View Code
      • 在导航菜单中进行循环;
         <el-menu
               :default-active="defaultActive"
                router
                class="el-menu-vertical-demo"
                @select="selectRouter"
         >
             <el-menu-item
                 :index="value.route.path"
                 v-for="(value, index) in menuData"
                 :key="index"
              >
                <img :src="value.iconName" style="28px;height:25px;margin:0 0.5rem" />
                <span slot="title">{{value.title}}</span>
             </el-menu-item>
        </el-menu>
      • 在data属性中设置默认的打开菜单;
         defaultActive: "test1", //默认开启导航
      • 在点击菜单的时候,如果存在跳转的条件,可以添加select事件
        /**
         * [selectRouter 菜单栏选择时的回调  否则可能无法跳转过去]
         * params  index 选中的菜单路径   是一个字符串
         * params  indexPath 选中的菜单路径   是一个数组
         * @return {[type]} [description]
        */
          selectRouter(index, indexPath) {
          //未对路由跳转的提交进行限制
            router.beforeEach((to, from, next) => {
              
            });
         },
        View Code
    • 第二种:导航菜单与子组件的配合使用
      • 同样将数据提取出来,设置数组的形式
        export const menuData =
            [
                { //导航
                    index: 'register',
                    name: "导航一",
                    children: [{ index: 'register', name: '选项一' }],
                    imgsrc: require('@/pages/index/assets/images/home/register.png')
                }, {
                    index: 'mediationCase',
                    name: "导航二",
                    imgsrc: require('@/pages/index/assets/images/home/auditing.png'),
                    children: []
                }
            ]
        View Code
      • 在vue中进行循环
        <el-menu
               class="el-menu-vertical-demo"
               router
               :default-active="activeIndex"
               unique-opened
               text-color="#fff"
        >
              <div v-for="item in menuData" :key="item.index">
              <el-menu-item
                   :index=" '/' + $route.params.language + '/home/' + item.index"
                   v-if="item.children.length == 0"
              >
                  <img :src="item.imgsrc" width="18px" />
                  <span slot="title" style="padding-left: 0.5rem;">{{item.name}}</span>
              </el-menu-item>
              <el-submenu :index="item.index" v-if="item.children.length > 0">
                   <template slot="title">
                     <img :src="item.imgsrc" width="18px" />
                     <span style="padding-left: 0.5rem;">{{item.name}}</span>
                   </template>
                   <el-menu-item-group>
                       <div v-for="i in item.children" :key="i.index">
                         <el-menu-item
                            :index=" '/' + $route.params.language + '/home/' + i.index"
                         >{{i.name}}</el-menu-item>
                       </div>
                  </el-menu-item-group>
               </el-submenu>
           </div>
        </el-menu>
        View Code
      • 不采用router-view,而采用子组件进行匹配
        <test v-show="defaultActive == 'test'"></test>

    2、遇到的问题

    • 在使用elementUI构建vue项目的时候会遇到,页面刷新的时候路径为刷新之前的子路由,内容也为刷新之前的子路由内容,但是导航栏的高亮却显示在data属性中设置的默认导航栏上;
      • 解决方法:在mounted钩子函数中,添加以下代码
        this.defaultActive = window.location.hash.split("/")[3];

        这样在渲染之前先把当前的路由设置给导航栏的默认的路由,则刷新也是显示的当前路由的内容,并且导航栏高亮的也是当前路由的那个选项了

    • 在使用Element UI 时点击同一个路由,控制台报错,错误信息如下
      • 解决方法:
        • 经过多次尝试发现原因可能是在重新下载依赖包时,安装的vue-router还是之前出错的那个版本,解决方法也很简单,在项目目录下运行 npm i vue-router@3.0 -S 即可;

        • 在引用vue-router的文件中添加以下代码
          // 解决在使用Element UI 时点击同一个路由,控制台报错的问题
          const originalPush = Router.prototype.push;
          Router.prototype.push = function push(location) {
            return originalPush.call(this, location).catch(err => err);
          };
  • 相关阅读:
    4.12 IDEA 如何新建 Java 项目 (图文讲解, 良心教程)
    4.11 AndroidStudio快捷键总结
    4.9 Android AndroidX的迁移
    4.8 build.gradle中正确地导入RecyclerView依赖
    4.6 构建之法7
    4.5 构建之法6
    4.4 构建之法5
    4.3 构建之法4
    4.2 构建之法3
    4.1 构建之法2
  • 原文地址:https://www.cnblogs.com/wxh0929/p/11527375.html
Copyright © 2011-2022 走看看