我是如何看Vue源码的

本文详细解读了Vue框架的初始化过程,包括stateMixin、eventsMixin、lifecycleMixin和renderMixin,重点关注initMixin中的_init方法,如何初始化组件状态、设置uid、挂载生命周期方法等。此外,文章探讨了Vue的响应式原理,如Watcher、Computed和Watch的实现,解释了数据响应化、依赖收集和双向绑定的逻辑,以及如何通过定义Reactive和Dep实现数据的变更监听。文章适合前端开发者深入理解Vue的内部工作机制。
摘要由CSDN通过智能技术生成

stateMixin(Vue) // 挂载状态处理方法(挂载data,methods等)

eventsMixin(Vue) // 挂载 事件 的方法( o n , on, on,off等)

lifecycleMixin(Vue) // 挂载 生命周期方法(update,destory)

renderMixin(Vue) // 挂载与渲染有关的方法($nextTick,_render)

每个方法可以按照代码逻辑来看,实现对应功能,这里拿initMixin举例

篇幅有限,所有此处仅解释initMixin逻辑,剩余几个方法大家可以自己探索哦

initMixin

initMixin中仅仅挂载了_init()方法,在_init中,初始化了整个vue的状态:

function _init(option) {

vm._uid = uid++ // 即component id

initLifecycle(vm)

initEvents(vm)

initRender(vm)

callHook(vm, ‘beforeCreate’)

initInjections(vm) // resolve injections before data/props

initState(vm)

initProvide(vm)

callHook(vm, ‘created’)

if (vm.$options.el) {

vm. m o u n t ( v m . mount(vm. mount(vm.options.el) // 开始挂载

}

}

这里我们可以看到几个beforeCreate,createdMount关键字,大概就能够猜到vue实例的部分生命周期方法就是在这里进行了挂载,再结合 vue官方文档的图示

关于初始化整个vue的状态,可以举例来说,例如initLifecycle中就赋值了parent,children,以及一些isMounted,isDestroy的标识符。initRender中就将attrs,listeners响应化,等等,诸如此类。

initMixin=>initState=>initData,便可以看到挂载props,methods,data,computed,watch了,

可以看到,此处先挂载了props,methods,然后是data的顺序,其实再往下探究逻辑就可以知道,如果存在变量重名,优先级是props>methods>data的,这也就解释了为什么初始化的顺序是这样安排的

initData中,先是获取了data数据,判断props,methods变量重名问题,然后是走了一个代理,将变量名代理到vue实例上,这样的话你的vue实例中,使用this.x指向就可以访问到this.data.x,这类代理也用在了propsmethods

initData获取数据中可以看到一个判断typeof data === 'function' ? getData(data, vm) : data || {}, 支持两种方式获取,实际上如果是自己写这样一个逻辑是会藏有隐患的,如果你的data是直接使用对象,而js的复杂数据类型是地址引用,这意味着,你实例化了两个vue对象,实际上他们的data引用地址是同一个地址,对其中一个vue data的修改会触发另一个vue数据的变动,带来的问题是巨大的

export function proxy (target: Object, sourceKey: string, key: string) {

sharedPropertyDefinition.get = function proxyGetter () {

return this[sourceKey][key]

}

sharedPropertyDefinition.set = function proxySetter (val) {

this[sourceKey][key] = val

}

Object.defineProperty(target, key, sharedPropertyDefi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值