你不可不知的vue那些事

全局组件注册

高频率使用的组件,我们不要再傻傻的用import单个引入了,弊端:既笨拙,繁琐又低效

我们要对高频率使用的组件放在一个单独文件下,用单独的js文件管理3343

index.js

// 首字母大写,返回整个字符串
function changeStr(str) {
    return str.chartAt(0).toUpperCase() + str.slice(1);
}
// 通过webpack的API
// false 是否匹配同级下的子目录,查找vue结尾的文件
const requireComponent = require.context('./', false, /\.vue$/);

// 返回当前目录文件下带vue的文件
const install = (Vue) => {
    requireComponent.keys().forEach(fileName => {
        // 获取第i个组件
    let config = requireComponent(fileName);
  
    // 获取组件名字
    let component = changeStr(
        fileName.replace(/^\.\//, '').replace(/\.\w+$/, '');
    )
  
    Vue.component(componentName, config.default || config);
    });
}
export default {
    install,
}

main.js文件

import index from '@/components/component/index.js';

// 全局注册
Vue.use(index);

路由文件引入配置

对于业务逻辑很强大,有很多子页面,路由配置都按模块单独分开写,还可实现页面懒加载,当要使用当前页面文件时,才加载,不会项目一启动就全部加载出来

index.routes.js

export default {
    path: './index',
  name: 'index',
  component: () => import('@/views/index.vue'),
  childer: [], // 配置子路由
}

router.js

import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from '@/views/Home.vue';

Vue.use(VueRouter);

// 分区存放路由功能模块
const routerList = [];
function importAll(r) {
    r.keys().forEach(
    (key) => routerList.push(r(key).default); // 拿到页面类的default
  )
}
importAll(require.context('../index.router.js', true, /\.routes\.js/));

// 存放核心路由文件
const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
  },
  ...routerList,
]

Render函数

弥补template的不足而生的,在template里面,存在一值多判断

如下文件示例,就是傻瓜式低级操作

Render.vue

<template>
    <div class="render">
    <button v-if = "value === 1">按钮一</button>
    <button v-else-if = "value === 2"> 按钮二</button>
    <button v-else> 按钮三</button>
  </div>
</template>
<script>
  export default {
    data() {
        return {
        value: 1,
      }
    }
  }
</script>

如下文件,高级骚操作

Render.vue

<template>
    <div class="render">
    <Button :type="type" :text="text" @myEvent="parDom"/>
  </div>
</template>
<script>
  import Button from './button.vue';
  export default {
    data() {
        return {
        value: 1,
        type: 'success',
        text: '成功按钮',
      };
    },
    components: {
        Button,
    },
    methods: {
        parDom() {
        console.log('我要飞机');
      },
    },
  };
</script>

button.vue

<script>
  export default {
    props: {
        type: {
        type: String,
        default: 'normal',
      },
      
      text: {
        type: String,
        default: 'normal',
      },
    },
    // h 是用来创建dom的
    render(h) {
      // render 与template创建的dom的区别
      // 同点:都是类编辑器
      // 不同点:template制造的是虚拟dom,在转译时,转译成vNode节点
      //         render函数直接生成真实节点,免去了转译过程
        return h('button', {
        // 等同于:class
        class: {
          // 使用.btn的样式
           btn: true,
          'btn-success' : this.type === 'success',
          'btn-warning' : this.type === 'warning',
          'btn-danger' : this.type === 'danger',
          'normal' : !this.type,
        },
        // dom属性
        domProps: {
            innerText: this.text || '默认按钮',
        },
        // 绑定方法
        on: {
            click: this.handleClick,
        }
      })
    },
    data() {
        return {
      };
    },
    methods: {
        handleClick() {
        this.$emit('myEvent');
      },
    },
  };
</script>
<style>
  .btn {
    width: 100px;
    height: 30px;
    color: #fff;
  }
  .btn-success {
    background: green;
  }
  .btn-warning {
    background: yellow;
  }
  .btn-danger {
    background: red;
  }
</style>

组件权限判断组件显隐

组件显隐,用display: block/none; 太low啦,任何一个会F12的,有可能一改,如果后台逻辑处理的不够好,就会造成系统崩溃

array.js

export function checkArray(key) {
    let arr = ['success', '2', '3', '4', 'demo'];
  let index = arr.indexOf(key);
  if (index > -1) {
    return true;
  } else {
    return false;
  }
}

main.js

import checkArray from '../array';
Vue.directive('display-key', {
    inserted (el, binding) {
        let displayKey = binding.value;
        if (displayKey) {
            let hs = checkArray(displayKey);
            if (!hs) {
                el.parentNode && el.parentNode.removeChild(el);
            } else {
        // 抛出异常
        throw new Error('need Key! Like v-display-key = "displayKey"');
      }
        }
    }
})

button.vue

<template>
    <div class="render">
    <Button v-display-key="'success'" :type="type" :text="text" @myEvent="parDom"/>
  </div>
</template>
<script>
  import Button from './button.vue';
  export default {
    data() {
        return {
        value: 1,
        type: 'success',
        text: '我是权限成功按钮',
      };
    },
    components: {
        Button,
    },
    methods: {
        parDom() {
        console.log('我要飞机');
      },
    },
  };
</script>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容

  • 基于Vue的一些资料 内容 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 element★...
    尝了又尝阅读 1,137评论 0 1
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    随行者pgl阅读 3,267评论 0 15
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    小姜先森o0O阅读 9,364评论 0 72
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    流觞小菜鸟阅读 1,733评论 2 8
  • UI组件 element- 饿了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的组件库 m...
    柴东啊阅读 15,838评论 2 140