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


prtyaa
prtyaa 2023-12-26 17:16:55 63486
分类专栏: 资讯

今天,我们来分享几个不可不知的vue高级实战技巧。

技巧

自动注册组件

我们平时可能这样引入注册组件。每次都得需要在头部引入,然后注册,最后在模板上使用。

<template>
  <div id="app">
    <HelloWorld msg="Welcome to Your Vue.js App"/>
  </div>
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

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

那么,有没有更加方便快捷的方法呢?我们不妨这样。

创建一个名为globalRC.js文件,假设我们这里与组件平级,即存放在组件文件夹中。

目录结构如:

-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>
注意,require.context是webpack的一个API,所以,需要基于webpack环境才可以使用。

自动注册路由

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

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
    }
  }
})

局部引入第三方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)
});

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=30908
赞同 0
评论 0 条
prtyaaL0
粉丝 1 发表 2554 + 关注 私信
上周热门
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  1327
银河麒麟打印带有图像的文档时出错  1239
银河麒麟添加打印机时,出现“server-error-internal-error”  1026
统信桌面专业版【如何查询系统安装时间】  954
统信操作系统各版本介绍  947
统信桌面专业版【全盘安装UOS系统】介绍  906
麒麟系统也能完整体验微信啦!  892
统信【启动盘制作工具】使用介绍  502
统信桌面专业版【一个U盘做多个系统启动盘】的方法  444
信刻全自动档案蓝光光盘检测一体机  389
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!