Vue源码解析 - 响应式原理与实现
2019-05-07 16:40
477 查看
- Vue响应式原理.
- Vue响应式实现.
响应式原理
初学者可能都会有这么一个疑惑. “为什么在data数据发生变化的时候,页面会被重新渲染”. 这个问题的答案是Vue内部会遍历data里面所有的属性,并使用
Object.defineProperty将这些属性全部转换为
getter/setter。将来Vue内部可以通过
Object.defineProperty追踪依赖,当有data里面的属性发生改变时会触发setter,我们可以在里面做响应式操作(例如:数据发生改变通知组件进行更新).
响应式实现
class MyVue { // 接收将来传进来的参数 constructor (options) { this.$options = options; this.$data = options.data; // 数据响应式 this.observe (this.$data); // created生命周期 if(options.created) { options.created.call(this); } } observe (obj) { // 1. 判断传进来的东西是否是我们想要的内容. if (!obj && typeof obj === 'object') { return; } //2. 遍历该对象. 因为data里面可以存放很多个属性. Object.keys (obj).forEach (key => { // 做响应式 this.defineReactive (obj, key, obj[key]); }); } defineReactive (obj, key, value) { Object.defineProperty (obj, key, { get () { // 将来读取 obj.key时将会触发 getter return value; }, set (newVal) { //判断新值与旧值是否一样,一样则不需要进行更新. if (value === newVal) { return; } value = newVal; console.log (`${key}属性更新了,更新的值为${value}`); }, }); } }
使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Document</title> <script src="MyVue1.js"></script> </head> <body> <div id="app"></div> <script> let vm = new MyVue({ el: '#app', data: { name: 'HelloVue!', }, created() { // 3ms之后修改name的值 // 会触发 setter setTimeout(() => { this.$data.name = '你好,Vue'; }, 3000); }, }); </script> </body> </html>
效果演示:
打开html,在控制台窗口等待3秒将会提示
name属性更新了,更新的值为: 你好,Vue
相关文章推荐
- Vue.js 源码全方位深入解析 学精学透 Vue 原理实现
- Vue 源码解析:深入响应式原理
- Vue如何实现组件的源码解析
- Android 带你从源码的角度解析Scroller的滚动实现原理
- Apk源码的加固(加壳)原理解析和实现
- 并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)
- vue双向绑定的原理及实现双向绑定MVVM源码分析
- 基于cglib实现的动态代理原理与源码解析
- vue.js双向数据绑定原理解析及模拟demo的实现
- vue源码--响应式设计原理
- [置顶] Spring-Session实现Session共享实现原理以及源码解析
- Spring-Session实现Session共享实现原理以及源码解析
- 顺序线性表 ---- ArrayList 源码解析及实现原理分析
- vue响应式系统之observe、watcher、dep的源码解析
- Android 从源码的角度解析Scroller的滚动实现原理
- Vue实现双向绑定的原理以及响应式数据
- Vue-lazyload原理详解之源码解析
- Redis 源码解析 string内部实现原理之链表
- 【vuejs深入三】vue源码解析之二 htmlParse解析器的实现
- Vue2.0源码阅读笔记--双向绑定实现原理