-
Notifications
You must be signed in to change notification settings - Fork 0
Vue 学习
LanSa edited this page Jul 16, 2018
·
16 revisions
在已熟练使用 react 的基础上,对 Vue 进行触类旁通学习。整个学习过程围绕以下三个方面进行:
- 理解 mvvm 模式,辅助 vue 设计原理进行理解
- 通过查阅 API 实现页面及组件,掌握组件的生命周期,基础知识体系。
- 收集有关 vue 的面试题,学习并思考它在实际工作中可能遇到的问题。
-
概念
MVVM,即 Model-View-ViewModel,一种程序架构设计思想,通过抽象 View 的状态及行为,将开发过程中的 UI 和业务逻辑分开为 View 和 Model,而 View 及 Model 的通信则由 ViewModel 来桥接:
- Model: 数据层,纯数据对象
- View: 视图层,用户所看见的页面
- ViewModel: 数据层与视图层的桥接层,通过向 Model 层取数据进行业务逻辑处理后通知 View 进行绘制,当 View 状态发生变化时,ViewModel 将这种状态变化通知到 Model。
图例:
- 原生 JS 实践
<待续...>
vue 是使用 MVVM 模式的典范,ViewModel 通过对数据进行劫持,并向 View 暴露数据接口及指令,当数据发生变化时,会触发劫持时绑定的方法,完成对 View 的更新。
原理:
- Observer 观察者,遍历data 数据对象的属性,用 Object.defineProperty 将它们转换为 getter 及 setter, 即劫持监听所有属性,当某一属性发生变化时,通知订阅者 watcher
- Compile 指令解析器,扫描并解析每个节点的指令,根据指令模板替换数据,并绑定相应的状态更新函数。
- Watcher 订阅者,订阅并接收每个属性变动的通知,执行指令绑定的相应回调函数
- Dep 消息订阅器,通过内部维护的数组来收集订阅者,数据变动触发 notify 函数,再调用订阅者的 update 方法
图例:
- https://github.com/Ma63d/vue-analysis/issues/1
- https://github.com/xitu/gold-miner/blob/master/TODO%2Fapproaching-android-with-mvvm.md
- https://blog.csdn.net/u014346301/article/details/53812770
vue 实例被创建时执行, 相当于 react 的 componentDidMount
例如,监听事件并执行回调
created () {
EventBus.$on('someEvent', (messages) => {
// do something
})
}
- components: 注册该组件可能需要使用的子组件。
- props: 接收由父组件传递而来的数据。
- data: function, 以返回值形式存放组件渲染所需的数据, 可在此对数据进行数据变换,如调用枚举等。
- methods: object, 定义组件需要执行的方法及处理函数,如 button 的点击事件等。
- computed: object, 存放需要计算的属性,该属性拥有两种方法:
- getter: 返回经过计算的属性。
- setter: 接收一个参数,当对该属性赋值时,将会调用该方法,与该属性存在计算关系的其他属性将会受到影响。
- watch: object, 监听某一属性,当该属性发生变化时,触发 callback。通常用在数据变化引起异步执行或开销较大的计算当中,如发送网络请求等。
注意:
- computed vs methods:computed 类的属性具有缓存功能,即所依赖的属性不发生变化时,该属性的 callback 也不会被调用,即其不会发生变化。
- computed vs watch: computed 类的属性依赖其他属性,当所依赖的属性发生变化时,该属性的 callback 主动触发;watch 是监听已定义好的属性,当该属性发生变化时,触发 callback,需要变化的属性相应地得到改变。
- v-if:
- v-on:
- v-bind:
- v-for:
- v-show:
- v-model:
- 组件间的事件通信机制: https://alligator.io/vuejs/global-event-bus/