You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functioninitData(vm: Component){// 获取data数据letdata=vm.$options.datadata=vm._data=typeofdata==='function'
? getData(data,vm)
: data||{}// 判断数据结构if(!isPlainObject(data)){data={}process.env.NODE_ENV!=='production'&&warn('data functions should return an object:\n'+'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',vm)}// proxy data on instanceconstkeys=Object.keys(data)constprops=vm.$options.propsconstmethods=vm.$options.methodsleti=keys.length// 遍历数据while(i--){constkey=keys[i]// method 属性命名冲突判断if(process.env.NODE_ENV!=='production'){if(methods&&hasOwn(methods,key)){warn(`Method "${key}" has already been defined as a data property.`,vm)}}// props 属性命名冲突判断 优先props if(props&&hasOwn(props,key)){process.env.NODE_ENV!=='production'&&warn(`The data property "${key}" is already declared as a prop. `+`Use prop default value instead.`,vm)}elseif(!isReserved(key)){// 非保留字段// 代理到vm实例proxy(vm,`_data`,key)}}// observe data// 遍历结束 开始监听数据// asRootData:true 代表此处监听为根数据 根数据会进行计数(vmCount++) 后续设值的时候会对 vmCount进行判断observe(data,true/* asRootData */)}
initData
这段代码主要是初始化data中的数据,将数据进行Observer,监听数据的变化,其他的监视原理一致,这里以data为例
相关源码
这段代码主要做了两件事,一是将_data上面的数据代理到vm实例上,另一件事通过observe将所有数据变成observable。
Proxy
接下来看一下proxy代理。
相关源码
这里比较好理解,通过proxy函数将data上面的数据代理到vm上
以实现
this.xxx
进行获取及赋值data
内的数据下一篇会先说一下
defineReactive
和observe
这两个比较重要的方法The text was updated successfully, but these errors were encountered: