1.Vue的生命周期函数(钩子函数)
注意有没有ed
2.MVVM
vueObserver 数据监听器,把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用Object.defineProperty()方法把这些属性全部转成setter、getter方法。当data中的某个属性被访问时,则会调用getter方法,当data中的属性被改变时,则会调用setter方法。Compile指令解析器,它的作用对每个元素节点的指令进行解析,替换模板数据,并绑定对应的更新函数,初始化相应的订阅。Watcher 订阅者,作为连接 Observer 和 Compile 的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数。Dep 消息订阅器,内部维护了一个数组,用来收集订阅者(Watcher),数据变动触发notify 函数,再调用订阅者的 update 方法。执行流程如下:
从图中可以看出,当执行 new Vue() 时,Vue 就进入了初始化阶段,一方面Vue 会遍历 data 选项中的属性,并用 Object.defineProperty 将它们转为 getter/setter,实现数据变化监听功能;另一方面,Vue 的指令编译器Compile 对元素节点的指令进行解析,初始化视图,并订阅Watcher 来更新视图, 此时Wather 会将自己添加到消息订阅器中(Dep),初始化完毕。当数据发生变化时,Observer 中的 setter 方法被触发,setter 会立即调用Dep.notify(),Dep 开始遍历所有的订阅者,并调用订阅者的 update 方法,订阅者收到通知后对视图进行相应的更新。
比喻一下,放在一个谍战片里,View相当于一个任务,Data是变化的情况;Observer相当于一个卧底,Dep相当于传令官,Compile是个司令官,而watcher就是司令官指定的与卧底交接的上级。
那么初始化的时候:卧底首先在收集情报,整理归纳(转化为getter或setter);同时司令员发布任务命令(初始化视图),并指定上级作为卧底的上级,同时上级将自己加入传令员的情报网。
在情况有变的时候,卧底将情况报告给传令员,传令员报告给上级,上级将更新任务。
3.computed 中的getter & setter
fullName: {
// getter
get: function () {
return this.firstName + ' ' + this.lastName
},
// setter
set: function (newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
4.watch监听对象如果只是监听obj内的某一个属性变化,可以直接obj.key进行监听。
'obj.question': function (newQuestion, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
this.debouncedGetAnswer()
}
}
如果对整个obj深层监听
obj: {
handler: function (newQuestion, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
this.debouncedGetAnswer()
},
deep: true,
immediate: true
}
}
immediate的作用:当值第一次进行绑定的时候并不会触发watch监听,使用immediate则可以在最初绑定的时候执行。
三种watcher:
-
computed的watcher:b()
每一个 computed 属性,最后都会生成一个对应的 watcher 对象,但是这类 watcher 有个特点,我们拿上面的 b 举例:属性 b 依赖 a,当 a 改变的时候,b 并不会立即重新计算,只有之后其他地方需要读取 b 的时候,它才会真正计算,即具备 lazy(懒计算)特性 -
watch里用于监听属性的watcher:a()
我们在 watch 中定义的,都属于这种类型,即只要监听的属性改变了,都会触发定义好的回调函数 -
用于页面更新的watcher:created()
每一个组件都会有一个 render-watcher,
function () {
vm._update(vm._render(), hydrating);
}, 当 data/computed
中的属性改变的时候,会调用该 render-watcher 来更新组件的视图 -
执行顺序:
computed-render -> normal-watcher -> render-watcher
5.Vue组件的几种通信方式
(01)父组件给子组件通信:props
子组件定义props:[‘message’]
父组件< child message=“hello”> </ child>