vue的高级使用技巧

 

  1.  全局组件注册

一般组件应用弊端,比较笨拙繁琐低效,比如我们写了一些组件,需要引用上的时候就通过import导入,那如果是高频繁需要使用的组件,则需要在每个使用的时候都需要引入并注册

假设现在有两个组件

0fb503ace61070bbecc659cb89516c0e.png

275abde22b3d4b277d805dc027d1896f.png

 

    很明显,如果我们有n个组件,那么就需要多次的import导入并注册,如果是高频繁使用的,就会显得非常繁琐,那么如何优化呢?我们可以利用webpack的一个api:require.context

 

新建一个文件global.js

//global.js

import Vue from 'vue';

function changeStr(str) {

    return str.charAt(0).toUpperCase() + str.slice(1);

}

/**

 * context有三个参数

 * 第一个是跟目录

 * 第二个是false,代表是否使用下面的子目录,如果该目录下有子目录并且该子目录下有组件,则需要为ture

 * 第三个是一个正则,匹配文件

 */

const requireComponent = require.context('.', false, /\.vue$/ );

requireComponent.keys().forEach(fileName => {

    //./child1.vue

    const config = requireComponent(fileName);

    //取组件名

    const componentName = changeStr(

        fileName.replace(/^\.\//, '').replace(/\.\w+$/,'')

    )

    console.log(componentName);

    Vue.component(componentName, config.default || config)

});

 

然后在main.js引入

import global from './components/global.js';

 

完成后现在的组件引用就不需要再写components:{}了

//之前的HelloWorld.vue

import Child1 from './child1'

import Child2 from './child2'

export default {

  name: 'HelloWorld',

  props: {

    msg: String

  },

  components: {

    Child1,

    Child2

  }

}
//优化后的HelloWorld.vue

export default {

  name: 'HelloWorld',

  props: {

    msg: String

  }

}

 

由此,我们全局注册组件已经实现了,我们注册的这个组件现在是可以在全局任何的这个Helloworld组件里面调用,比之前的要逐个import要变得简洁高效。所以你可以把你**高频繁使用**的组件都放在同一个目录下并配置一个全局js进行统一的引入

注:如果不是频繁并且有许多组件引入的情况没必要用此方法,要分具体应用场合

 

  2.路由动态引入之路由分区

  什么是路由分区?

  所谓的路由分区就是在router文件夹下新建你要分区的路由模块,比如登录模块

那么如何配置呢?其配置方式与vue组件全局注册是一样的道理,

也是通过vue里面集成的webpack的api:require.context

 

首先我们先新建几个vue组件

83b44c6b8e7d667eb56406136d436aa6.png

 

如果是按照我们以前的写法,都是先导入,然后配置routes,如果路由少的话并没有太大的问题,但是,如果有一个项目里有几百个页面的时候,会有很长一串的import,routes文件内容也会很冗长,而且也不好维护,即使代码块可以折叠

dd227d47c75f7a539c30eabb315486b6.png

  

  接下来就进行优化

  •  分区

    先在router文件夹下新建两个文件login.routes.js 和index.routes.js

        09b35c8f4b2b7bb956af67eec3e158bf.png

  然后再文件里面写上路由信息

 

 //login.routes.js

        export default {

        path: '/login',

        name: 'login',

        component: () => import('../views/login.vue'),

        children: []

    }

 

  • 引用
 import Vue from 'vue'

        import Router from 'vue-router'

        import Home from './views/home.vue'

        import Index from './views/index.vue'

        // import Login from './views/login.vue'

        import Login from './router/login.routes'

        Vue.use(Router)

        export default new Router({

            routers: [

                {

                    path: '/',

                    name: 'home',

                    compoment: Home

                },

                {

                    path: '/index',

                    name: 'index',

                    component: Index

                },

                // {

                //     path: '/login',

                //     name: 'login',

                //     component: Login

                // }

                Login

            ]

        })

 

    接下来我们再继续优化

    在router/index.js里定义一个方法

const routerList = [];

    function importAll(r){

      r.keys().forEach((key) => routerList.push(r(key).default));

    }

    importAll(require.context('./router',true, /\.router\.js/))
 //router.js

    import Vue from 'vue'

    import Router from 'vue-router'

    import Home from './views/home.vue'

    Vue.use(Router)

    const routerList = [];

    function importAll(r){

        r.keys().forEach((key) => routerList.push(r(key).default));

    }

    importAll(require.context('./router',true, /\.router\.js/))

    export default new Router({

        routes: [

            {

                path: '/',

                name: 'home',

                component: Home

            },

            ...routerList

        ]

    })

 

    到此路由的分区就完成了

 

posted @ 2020-02-18 10:54  LamWei  阅读(3666)  评论(0编辑  收藏  举报