vue可复用、自定义指令、插件

85 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情juejin.cn/post/714765…

混入

混入本身是个对象,来分发vue组件中的复用功能。对象可以包含任意组件选项(data,methods等)与其他组件合并,混入使用。
个人理解:假设创建了一个对象(普通的json对象)里面有methods,还有一个组件,该组件本身也有methods,可以将创建对象与该组件混合合并,那么在该组件里也可以使用创建对象里面的methods了

局部混入

  1. 先封装一个混入对象。如下所示:

image.png
2. 在组件里引入混入对象,将混入对象写在组件对象里,调用混入对象里的函数并使用。如下所示:

image.png

注意:当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”

数据对象在内部会进行递归合并,并在发生冲突是以组建数据优先。
意思就是如果组件里的data或methods与混入对象有同名的话,以组件数据优先。

image.png
如果是同名钩子函数的话将合并为一个数组,因此都将被调用。另外,混入对象的钩子函数将在组件自身钩子之前调用。
如下所示:
因为created是钩子函数。 image.png
值为对象的选项,例如methods、components和directives,将被合并为同一个对象,两个对象键名冲突是,取组件对象的键值对。(也是听组件的)

image.png

全局混入(放在入口文件里)

混入也可以全局注册,使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的vue实例。使用恰当是,这可以用来为自定义选项注入处理逻辑。

image.png

自定义指令

指令大部分是对DOM的操作

如何自定义指令

两种:一个是全局注册指令,一个是局部注册指令(区别就是创建的地方不一样,作用域不一样,语法不一样。)
全局指令是直接注册在vue对象上的,通过Vue.directive("指令名称",{放指令相关的钩子函数})注册多个的话就写多个。
示例如下:
image.png

局部指令

在组件对象里面注册的。指令名与指令是键值对的形式,多个指令逗号隔开创建多个键值对即可。

钩子函数

一个指令定义对象可以提供如下几个钩子函数。(均为可选)

  1. bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置。
  2. inserted:被绑定元素插入父节点时调用(只要有父节点,并且放在父节点里面就可以被调用)
  3. update:所在组件的虚拟DOM更新时调用,但也有可能发生在其子虚拟DOM更新之前。指令的值有可能发生改变也有可能没有。(只要组件更新了就会调用,但是值可能并没有发生改变)
  4. componentUpdate:更新之后才调用。指令所在组件的虚拟DOM及子组件全部更新之后调用。
  5. unbind:只调用一次,指令与元素解绑时调用。 示例如下:

image.png image.png

操作参数
  1. el:都能接收到这个参数。能接收到节点,指令所绑定的元素,可以用来直接操作DOM。
  2. binding:一个对象,包含以下属性:
    • name:指令名,不包括v-前缀
    • value:指令绑定的值,例如:v-my-directive=“1+1”中,绑定的值为2.
    • oldValue:指令绑定的前一个值,仅在update和componentUpdate钩子中可用,无论值是否改变都可用。
    • expression:字符串形式的指令表达式。例如:v-my-directive=“1+1”中,表达式为1+1
    • arg:传给指令的参数,可选。例如:v-my-directive:foo中,参数为“foo”
    • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar中,修饰符对象为{foo:true,bar:true}
    • vnode:Vue编译生成的虚拟节点
    • oldVnode:上一个虚拟节点,仅在update和componentUpdate钩子中可用。 示例如下:

image.png image.png 注意 除了el之外,其他参数都应该是只读的,切勿进行修改,如果需要在狗子之间共享数据,建议通过元素的dataset来进行。

注意:全局指令的话指令名作为第一个参数,指令作为directive的第二个参数。
局部指令的话指令名与指令作为键值对的形式。