常用:vue中的几个高级方法

本文介绍了Vue.js开发中的高级技巧,包括自动注册组件、动态路由配置、权限自定义指令及优化。通过require.context实现组件批量注册,简化路由配置,使用render渲染函数优化模板,以及全局自定义指令处理权限问题。同时,展示了如何局部引入和管理第三方UI框架组件,提升代码组织效率。
摘要由CSDN通过智能技术生成

自动注册组件

目录结构如

-src
--components
---component1.vue
---globalRC.js

​​globalRC.js​​:

import Vue from 'vue'

function changeStr (str){
    return str.charAt(0).toUpperCase() + str.slice(1);
}

const requireComponent = require.context('./',false,/\.vue$/); // './'操作对象为当前目录

requireComponent.keys().forEach(element => {
    const config = requireComponent(element);

    const componentName = changeStr(
        element.replace(/^\.\//,'').replace(/\.\w+$/,'')
    )

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

然后,我们需要在​​main.js​​文件中引入。

import './components/globalRC.js'

 直接使用

<template>
  <div id="app">
    <Component1 />
  </div>
</template>

<script>
export default {
  name: 'App'
}
</script>

自动注册路由

这是我们之前注册路由的方式。如果路由文件多了,会显得特别臃肿。

import Vue from "vue";
import VueRouter from "vue-router";
// 引入组件
import home from "../views/home.vue";
import about from "../views/about.vue";

// 要告诉 vue 使用 vueRouter
Vue.use(VueRouter);

const routes = [
    {
        path:"/",
        component: home
    },
    {
        path: "/about",
        component: about
    }
]

var router =  new VueRouter({
    routes
})

export default router;

在路由文件夹下,这里假设是名为​​router​​​文件夹下,创建一个​​routeModule.js​​文件。

目录结构如:

-src
--router
---index.js
---login.module.js
---routeModule.js

​​routeModule.js​​:

const routerList = [];

function importAll(r){
    r.keys().forEach(element => {
        routerList.push(r(element).default);
    });
}

importAll(require.context('./',true,/\.module\.js/));// 这里自定义为.module.js 结尾的文件
export default routerList

然后,我们只需要创建对应的路由文件,如:​​login.module.js​​。
 

export default {
    path:'/login',
    name:'login',
    component:()=>import('../views/login.vue')
}

最后,在路由配置文件​​index.js​​​中引入​​routeModule.js​​文件即可,
 

import Vue from "vue";
import VueRouter from "vue-router";
import routerList from './routeModule.js'

Vue.use(VueRouter);

var router =  new VueRouter({
    routerList
})

export default router;

注意,require.context是webpack的一个API,所以,需要基于webpack环境才可以使用。

权限自定义指令

平常,我们可能会遇到按钮级别或者页面内操作权限的需求,我们可以写一个全局自定义指令。首先,可以在入口文件​​main.js​​文件中。

import Vue from 'vue'
import App from './App.vue'

function checkArray(key){
    let arr = [1,2,3,4]; // 自定义权限列表
    let index = arr.indexOf(key);
    if(index>-1){
        return true
    }else{
        return false
    }
}

Vue.directive('auth-key',{
  inserted(el,binding){
    let displayKey = binding.value;
    if(displayKey){
      let hasPermission = checkArray(displayKey);
      if(!hasPermission){
        el.parentNode && el.parentNode.removeChild(el);
      }
      else{
        throw new Error('需要key')
      }
    }
  }
})

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

在页面中使用。

<button v-auth-key="8">btn</button>

render渲染函数

我们首先来看下这样一个例子,你会看到模板上特别多的条件判断。

<template>
    <div>
        <h1 v-if="level === 1"></h1>
        <h2 v-else-if="level === 2"></h2>
        <h3 v-else-if="level === 3"></h3>
        <h4 v-else-if="level === 4"></h4>
    </div>
</template>

怎么才能优化呢?接下来,我们可以使用render渲染函数。

Vue.component('anchored-heading', {
  render: function (createElement) {
    return createElement(
      'h' + this.level,   // 标签名称
      this.$slots.default // 子节点数组 挂在节点
    )
  },
  props: {
    level: {
      type: Number,
      required: true
    }
  }
})


Vue.component('blog-post', {
  render: function (createElement) {
    var header = this.$slots.header
    var body   = this.$slots.default
    var footer = this.$slots.footer
    return createElement('div', [
      createElement('header', header),
      createElement('main', body),
      createElement('footer', footer)
    ])
  }
})

局部引入第三方UI框架优化

我们经常使用UI框架,如果我们使用按需加载的话,需要每次都要注册使用一下。就像下面这样:

import Vue from 'vue';
import { Button, Select } from 'element-ui';
import App from './App.vue';

Vue.component(Button.name, Button);
Vue.component(Select.name, Select);
/* 或写为
 * Vue.use(Button)
 * Vue.use(Select)
 */

new Vue({
  el: '#app',
  render: h => h(App)
});

我们可以这样优化一下,创建一个​​uIcompontents.js​​文件。

// 每次只需要在这添加组件即可
import { Button, Select } from 'element-ui';

const components = { Button, Select };

function install(Vue){
    Object.keys(components).forEach(key => Vue.use(components[key]))
}

export default { install }

然后,在​​main.js​​文件中引入。

import Vue from 'vue'
import App from './App.vue';

import uIcompontents from "./uIcompontents.js";
Vue.use(uIcompontents);

new Vue({
  el: '#app',
  render: h => h(App)
});

高级组件注册路由 

const files = require.context('.', true, /\.vue$/)

const router = files.keys().filter(item => /^.\/\w+\/index.vue/.test(item)).map(key => {
  let page = files(key).default,
    obj = {path: '/' + page.name, name: page.name, component: page, meta: {
      keepAlive: false // 需要被缓存
    }}
  if (page.name === 'homePage') {
    obj.meta.keepAlive = true // 需要被缓存
  }
  if (page.name === 'bdiv') {
    obj.meta.keepAlive = true // 需要被缓存
  }
  return obj
})
console.log('router-----------:', router)
export default [
  {path: '/', redirect: '/homePage'},
  ...router,
  {path: '*', redirect: '/homePage'},
]

今天,学会这几个Vue高级实战技巧就够了!_51CTO博客_vue 技巧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值