持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情juejin.cn/post/714765…
混入
混入本身是个对象,来分发vue组件中的复用功能。对象可以包含任意组件选项(data,methods等)与其他组件合并,混入使用。
个人理解:假设创建了一个对象(普通的json对象)里面有methods,还有一个组件,该组件本身也有methods,可以将创建对象与该组件混合合并,那么在该组件里也可以使用创建对象里面的methods了
局部混入
- 先封装一个混入对象。如下所示:
2. 在组件里引入混入对象,将混入对象写在组件对象里,调用混入对象里的函数并使用。如下所示:
注意:当组件和混入对象含有同名选项时,这些选项将以恰当的方式进行“合并”
数据对象在内部会进行递归合并,并在发生冲突是以组建数据优先。
意思就是如果组件里的data或methods与混入对象有同名的话,以组件数据优先。
如果是同名钩子函数的话将合并为一个数组,因此都将被调用。另外,混入对象的钩子函数将在组件自身钩子之前调用。
如下所示:
因为created是钩子函数。
值为对象的选项,例如methods、components和directives,将被合并为同一个对象,两个对象键名冲突是,取组件对象的键值对。(也是听组件的)
全局混入(放在入口文件里)
混入也可以全局注册,使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的vue实例。使用恰当是,这可以用来为自定义选项注入处理逻辑。
自定义指令
指令大部分是对DOM的操作
如何自定义指令
两种:一个是全局注册指令,一个是局部注册指令(区别就是创建的地方不一样,作用域不一样,语法不一样。)
全局指令是直接注册在vue对象上的,通过Vue.directive("指令名称",{放指令相关的钩子函数})注册多个的话就写多个。
示例如下:
局部指令
在组件对象里面注册的。指令名与指令是键值对的形式,多个指令逗号隔开创建多个键值对即可。
钩子函数
一个指令定义对象可以提供如下几个钩子函数。(均为可选)
- bind:只调用一次,指令第一次绑定到元素时调用,在这里可以进行一次性的初始化设置。
- inserted:被绑定元素插入父节点时调用(只要有父节点,并且放在父节点里面就可以被调用)
- update:所在组件的虚拟DOM更新时调用,但也有可能发生在其子虚拟DOM更新之前。指令的值有可能发生改变也有可能没有。(只要组件更新了就会调用,但是值可能并没有发生改变)
- componentUpdate:更新之后才调用。指令所在组件的虚拟DOM及子组件全部更新之后调用。
- unbind:只调用一次,指令与元素解绑时调用。
示例如下:
操作参数
- el:都能接收到这个参数。能接收到节点,指令所绑定的元素,可以用来直接操作DOM。
- 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钩子中可用。
示例如下:
注意 除了el之外,其他参数都应该是只读的,切勿进行修改,如果需要在狗子之间共享数据,建议通过元素的dataset来进行。