一、Directives 指令

两种写法:

1、声明一个全局指令

Vue.directive('x', directiveOptions)

就可以在任何组件里使用v-x了

例如:声明一个全局指令

c5e031d661ea814b03ee4a64c1ce6d08.png

在App.vue里点击图片,在HelloWorld.vue点击标题。都会打印x

45a130457eb2dbef9f49725cb8fd1ca2.png

452185a2daeabf496beff4a9cc7ad015.png

2、声明一个局部指令

new Vue({
...,
directives: {
"x": directiveOptions
}
})

v-x只能用在该实例中

例如:这个组件就只能在HelloWorld.vue里使用

e0f100008eedb46d105a730799723549.png

directiveOptions

五个函数属性

  • bind(el绑定的元素,info详细的信息, vnode虚拟节点, oldVnode之前的虚拟节点)-类似created;只调用一次,指令第一次绑定到元素时调用。
  • inserted(参数同上)-类似mounted;被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。
  • update(参数同上)-类似updated;
  • componentUpdated(参数同上)-用得不多,参见文档
  • unbind(参数同上)-类似destroyed

自制指令,不用v-on

使用v-on

5a7b16b0037c35b75eebcd72f504554a.png

不使用v-on

d965adbda0bee3494fb2723bd5550c70.png

我们如何得知用户使用的是click呢,使用info

58361383503a4eaf5e83913137a494e4.png

打出info发现

d1ebd88bbcec339488222a5516e30d55.png

5311a7646ccda561a7a41716b12490e5.png

添加了事件监听就要在适当的时机将它删掉,一般会写一个unbind(),当元素消亡的时候就会调用它

4d961e2d33a5c0bb01133131c736816c.png

directiveOptions在某些条件下可以缩写为函数,用得不多,可以看文档

6edc78cba2c2f5addcb99d5b8c42cde6.png

指令的作用

  • 主要用于DOM操作

Vue 实例/组件用于数据绑定、事件监听、DOM更新

Vue指令主要目的就是原生DOM操作

  • 减少重复

如果某个DOM操作你经常使用,就可以封装为指令

如果某个DOM操作比较复杂,也可以封装为指令

二、mixins 混入

混入就是复制,也用来减少重复

类比

  • directives的作用是减少DOM操作的重复
  • mixins的作用是减少data、methods、钩子的重复

举例场景

  • 假设我们需要在每个组件上添加name和time
  • 在created、destroyed时,打出提示,并报出存活时间
  • 一共有五个组件,怎么做?
  • 一、给每个组件添加data和钩子,共五次
  • 二、或者使用mixins减少重复

在Child1上面做以下操作

App.vue

<template>
  <div id="app">
    <Child1/>
    <button>x</button>
    <Child2/>
    <button>x</button>
    <Child3/>
    <button>x</button>
    <Child4/>
    <button>x</button>
    <Child5/>
    <button>x</button>
  </div>
</template>

<script>
import Child1 from "./components/Child1.vue";
import Child2 from "./components/Child2.vue";
import Child3 from "./components/Child3.vue";
import Child4 from "./components/Child4.vue";
import Child5 from "./components/Child5.vue";
export default {
  name: "App",
  data() {
    return{}
  },
  components: {
    Child1,
    Child2,
    Child3,
    Child4,
    Child5
  }
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

528d3bc4d0c0ab622a4be7cb5d925abe.png

e0bdd4c17efb215eb9682db2a02974a3.png

设置默认看得见

f553cf414899ab4bcaac1bad7959488c.png

点击x按钮就设置死亡

f500be03ca8cc8c1922cc79f2845bbe3.png

ce8f41f7b0fe56814a95e416f3d9e88b.png

如果要对其他Child组件也做同样的操作,那么就会重复,因此我们使用mixins,创建目录mixins创建文件log.js来记录生和死,将共同对象复制进去

6e3d9bedb5558947cb0be1b9ecc9ca13.png

把mixins的date(),created(),beforeDestory()复制进去

eb670e4c1e48c5a8914bfd52468e15a7.png

同理对child其他组件也做同样的操作,但name都会是child1,因此

a9592acd6ce36c3518b6f57d13a55b7a.png

在child组件里自行设置name,log里面的data和组件的data会智能合并

8abdee0e496a52fcbeb2688f14679fed.png

5aa7e1875f2b32ce6376672a26e5d3c4.png

三、extends 继承

与mixins同样的需求,不想要每次写一个mixins

创建MyVue.js

4aeaba08aaffb900e2bffb03ab9047e4.png

5cba33f3f6de31c71a0e04acd223e09c.png

和mixins联合使用

注意使用Vue.就是extend,用选项是extends

07f4542a2ce19bca59bb2fb72ef21f03.png

extends是比mixins更抽象的封装

四、provide和inject 提供和注入

应用举例 例子

  • 一键换肤功能:默认蓝色,可以切换为红色
  • 文字大小:默认正常,可以改成大或小

b551134f075fc8771810fc9bc7b7851e.png
<div :class="`app theme-${themeName}`">
此处""是XML的引号 ``是JS的
div有两个class 第一个是app,第二额是theme-${themeName}

d522364fa9e42ac7b207f72297b17263.png

创建一个换肤组件,并引入

cffd670586f02b09fb91bc50b4aef14c.png

a6f06e51127cf586845eb97443a926c2.png

使用provide将themeName提供出去

88e3f53b6b0f0301fbbb9553dab1e38e.png

再将提供的注入组件中

600627ecb272b0c98044889c733dd885.png

c8255b06f9dd36947faabf2a2c312c60.png

尝试修改themeName,发现修改皮肤颜色失败,字符串提供过来后就已经是复制的,而这里我们只是修改的复制的那个字符串

75a4090267213b9f606cd4b20760fcee.png

但我们可以去调用函数

293f60ec27e88ec39fa3e98ad3c216f5.png

8d3564a2a6213cf34e7fc7a1adc3d521.png

则可换肤成功

076738a56142657bbb44310c04f724f4.png

同理修改设置字体大小

f16ea4425667fda6b91c236005852b8e.png

5e4422bf58c3fe4c18ecf0c6f2d741be.png

3e617068505f5655818df8c4ea53cd4a.png

设置好css

0452d7d58fb57a0f852b2181cf09d05e.png

在组件里注入

b2813d9b7d2790a801e4a746dea23f7d.png

总结

  • 作用:大范围的data 和method等共用
  • 注意:不能只传themeName不传changeTheme,因为themeName的值是被复制给provide的

总结

directives指令

  • 全局用Vue.directive('x',{..})
  • 局部用options.directives
  • 作用是减少DOM操作相关重复代码

mixins混入

  • 全局用Vue.mixin({...})
  • 局部用options.mixins:[mixin1,mixin2]
  • 作用是减少options里的重复

extends继承/扩展

  • 全局用Vue.extend({...)
  • 局部用options.extends:{...]
  • 作用跟 mixins差不多,只是形式不同

provide /inject提供和注入

  • 祖先提供东西,后代注入东西
  • 作用是大范围、隔N代共享信息(数据或者方法)
Logo

前往低代码交流专区

更多推荐