Directive指令、Mixin混入、Extends继承扩展、provide和Inject提供和注入
创建一个Vue实例,我们需要了解下面这些:
const VM = new Vue(options)
- 把Vue实例命名为VM是尤雨溪的习惯,我们应该沿用
- VM对象封装了对视图的所有操作,包括数据读写,事件绑定、DOM更新
- VM的构造函数是Vue,按照ES6的说法,VM所属的类是Vue
- options是new Vue的参数,一般称为选项或构造选项
首先先了解options里有什么?
有五类属性
- **数据:**data、props、propsData、computed、methods、watch
- **DOM:**el、template、rander、randerEeror
- **生命周期钩子:**beforeCreate、created、beforeMount、mounted、beforeUpdata、updated、actived、deactived、boforeDestroy、destroyed
- **资源:**directives、filters、compopents
- **组合:**parent、mixins、extends、provide、inject
下面先了解一下入门属性:
1.el挂载点
可以用$mount代替
2.data内部数据
支持对象函数,优先使用函数
为了组件的复用,使得每一份组件都可以有一份data的拷贝,防止不同组件修改数据使被相互覆盖,如果是对象,一个组件用两次这个数据,那么第二次用的数据就是第一次已经修改过的数据
3.methods方法
事件处理函数或者是普通函数
4.components
Vue组件,注意大小写
5.四个钩子
created:实例出现在内存中
mounted:实例出现在页面中
updated:实例更新了
destroyed:实例从页面和内存中消亡了
6.props外部数据也叫属性
message="n"传入字符串
:message="n"传入this.a数据
:fn="add"传入this.add函数
下面进入到我们这篇文章的重点
Vue进阶构造属性-Directive指令、Mixin混入、Extends继承扩展、provide和Inject提供和注入
1.Directive指令
指令的主要作用是:
- 用于DOM操作:Vue实例或组件用于数据绑定、DOM更新、事件监听;指令主要目的就是原生DOM操作
- 减少重复:如果某个DOM操作,经常使用,就可以封装成指令;如果某个DOM操作比较复杂,也可以封装成指令
两种写法:
1.声明一个全局指令,你可以在任何组件中使用v-x
Vue.directive('x', directiveOptions)
2.声明一个局部指令,只能在该实例中使用v-x
new Vue({
...,
directives: {
"x": directiveOptions
}
})
directiveOptions的五种属性:
bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。unbind:只调用一次,指令与元素解绑时调用。
详情请看官网:
实例(自己创建一个v-on指令),重点代码展示:
new Vue({
directives: {
on2: {
// bind 可以改为 inserted
bind(el, info) {
el.addEventListener(info.arg, info.value);
// Vue 自带的 v-on 并不是这样实现的,它更复杂,用了事件委托
},
unbind(el, info) {
el.removeEventListener(info.arg, info.value);
}
}
},
template: `
<button v-on2:click="hi">点我</button>
`,
methods: {
hi() {
console.log("hi");
}
}
}).$mount("#app");
2.Mixin混入
混入大概可以理解成复制
利用类比的想法:directives的作用是减少DOM操作的重复;mixins的作用就是减少data、methods、钩子的重复
事例:
场景描述:假设我们需要在每个组件上添加name和time;在created、destroyed时,打出提示,并报存活时间;一共五个组件,要怎么做?
1.给每个组件添加data和钩子,共五次
2.或者用mixins减少重复
事例链接:
brave-dijkstra-memmm - CodeSandboxcodesandbox.io
3.Extent继承
和mixins同样的需求,但是不想每一次都写一次mixins,应该怎么办?
这时候可以使用Vue.extend或options.extends
const MyVue = Vue.extend({
data(){ return {name:'',time:undefined} },
created(){
if(!this.name){console.error('no name!')}
this.time = new Date()
},
beforeDestroy(){
const duration = (new Date()) - this.time
console.log(`${this.name} ${duration}`)
}
})
然后就可以使用new MyVue(options)了
extends就是比mixins更抽象一点的封装,如果嫌写5次mixins麻烦就可以考虑extends一次,不过工作中用的很少
4.provide和inject提供和注入
需求:一键换肤功能,原来是蓝色,一键切换成红色
文字大小:默认正常,可以改大改小
完成事例代码:
fragrant-rain-h8lm6 - CodeSandboxcodesandbox.io
祖先栽树(provide),后人乘凉(inject)
总结:大范围的data和method公用,大范围,隔N代共享信息
注意:事例中不能只传themeName,不传changeTheme,因为themeName的值是被复制给provide的
