前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue-router的二次封装

vue-router的二次封装

作者头像
切图仔
发布2022-09-08 16:28:05
7920
发布2022-09-08 16:28:05
举报
文章被收录于专栏:生如夏花绚烂

本文介绍对vue-router的二次封装通过对vue-router的二次封装,即可实现通过component自动生成path和name值,不用频繁的进行重复引用 如下 未封装前

代码语言:javascript
复制
{
    path:'/login',
    name:'login',
    component:()=>import('../../views/login')
    component:'login/index'
},

封装后

代码语言:javascript
复制
{
    component:'login/index'
}

经过封装后代码简化了许多,但功能却一样,这在路由较多时好处非常大 接下来我们来封装vue-router 我们要实现的功能

  1. 通过component自动生成path,name
  2. 当指定了pathname值程序不会自动生成
  3. 当component存在indexpathname自动屏蔽如 component:login/index对应name值为 login path值为 \login

首先我们在src目录新建配置文件commom/config/router.js 这个配置文件用于声明项目中使用到的路由 暂时键入

代码语言:javascript
复制
let routes = [
    {
        path:'/login',
        name:'login',
        component:()=>import('../../views/login')
        component:'login/index'
    },
]

在src目录新键router.js 键入如下

代码语言:javascript
复制
import Vue from 'vue';
import Router from 'vue-router';
import routes from './common/config/router.js'
Vue.use(Router);
export default new Router({
    routes
})

在main.js文件引入router.js

代码语言:javascript
复制
import Vue from 'vue'
import App from './App.vue'
import './plugins/element.js'
import router from './router.js'
Vue.config.productionTip = false

new Vue({
  router,    
  render: h => h(App),
}).$mount('#app')

接下来我们完善commom/config/router.js

1.定义获取路由方法

代码语言:javascript
复制
//获取路由信息
let getRoutes = function(){
    //生成路由详细信息
    createRoute(routes)
    return routes;
}

2.定义生成路由方法

代码语言:javascript
复制
function createRoute(arr){
        for(let i=0;i<arr.length;i++){
            /*没有component的路由 如path='*'*/
            if(!arr[i].component)return
            //去除index
            let value = getValue(arr[i].component)
            //生成name(login/text==login_text)
            arr[i].name = arr[i].name || value.replace(/\//g,'_')    
            //生成path
            arr[i].path = arr[i].path || `/${value}`
            //自动component
            let componentFun =  import(`../../views/${arr[i].component}.vue`)
            arr[i].component = ()=>componentFun
            //递归生成子路由
            if(arr[i].children && arr[i].children.length>0){
                createRoute(arr[i].children)
            }

        }
        
    }

3.去除index后缀方法

代码语言:javascript
复制
function getValue(str){
        //获取最后一个‘/’的索引
        let index = str.lastIndexOf('/')
        //获取反斜杠后面的值
        let val = str.substring(index+1,str.length)
        //判断是不是index结尾
        if(val==='index'){
            //login/index == login
            return str.substring(index,-1)
        }else{
            return str;
        }
    }

4.导入routes

代码语言:javascript
复制
export default getRoutes()

接下来我们就可以在通过component自动生成path和name值了

代码语言:javascript
复制
let routes = [
        {
            path:'/',
            name:'layout',
            redirect:{name:'index'},
            component:()=>import('../../views/layout.vue'),
            component:'layout',
            children:[
                {
                    component:'index/index'
             /*
                 生成后:
                 path:/index
                 name:index
                 */
                },
                {
                    component:"shop/goods/list"
                    /*
                    生成后:
                    path:/shop/goods/list
                    name:shop_goods_list
                    */
                }
            ]
        },
        {
            component:'login/index'
            /*
            生成后
            path:/login
            name:login
            */
        },
        {
            path:'*',
            redirect:{name:'index'}
        }
    ]
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档