手动实现 mini-vue
目标
目标就是手动实现vue的响应式功能,模板解析功能等,后续如果有精力在实现诸如生命周期,计算属性这些功能。
初始化
一开始是准备用纯静态文件搞,但是文件多了不太好分离,而且不能用`import`,`export`等,感觉很别扭,最终还是准备用webpack打包。
初始化没啥好说的,就是一些webpack简单配置,分文件等,我准备了一份基础目录,你用的时候可以直接clone下来,然后跟着看就行
[基础目录](https://github.com/xiaofeng-bm/mini-vue/tree/init)
observer响应式
源码 说一下vue
的响应式原理,这是一道很经典的面试题,学过vue
的,或者说专门准备过vue
面试的,对这道题或多或少都会有一些理解。
有些人会知道,vue
响应式原理的核心就是通过Object.defineProperty
这个api来实现的,但是可能对于内部具体的实现原理不是太清楚,这节我就一点一点的带你理清vue
中响应式的实现方式。
从结果出发
我们在初始化vue
的时候,都是通过new Vue({})
,传入一个对象来实现的。我们通过cdn引入vue
,并且将vm实例打印出来看看具体都有些什么。
打印出的vm有很多属性,我们重点关注图中标红的两个地方
既然用的时候是通过new Vue({})
,那源码中肯定有个Vue构造函数,下面为了方便,用ES6的类来实现,简化代码如下:
现在data
中的数据有了,下一步就是如何将其变为响应式数据。代码如下,我配一些注释,很好理解:
在main.js
中我们进行初始化,代码如下:
测试看一下效果:
改变一下数据看看:
结构优化
上面我们将所有的方法都写到了Vue
这个构造函数内,不利于维护,所以将其拆分出来,新建一个observer.js
文件,将observer
和defineReactive
这俩方法copy过去。
修改vue.js
内容如下:
总结
以上代码就实现了简单的数据响应式,但是瑕疵很多,比如我们在日常开发中获取data
中的数据,都是直接通过this.msg
这种方式获取,但上面这种需要通过vm._data.msg
才能获取到,中间夹杂了一个_data
,下一节我们就要讲如何将_data
中的数据代理到Vue实例中,方便我们更好的操作数据
评论