天天看点

关于Vue源码解析

v-model底层原理

非侵入式

是通过Object.defineProperty(obj,key,{set:,get:}) 是通过里面的get(getter),set(setter)来实现

get中通过dep.depend()来依赖收集,set中通过dep.notify()来触发数组更新

这个函数中含有get和set两个属性,当区访问key(value)时便会去调用get()和set()两个方法,getter和setter需要变量周转才能正常工作

import observe from ‘./observe.js’

function defineReactive(data,key,val){ //利用闭包属性来去操作(val是新值)

let child = observe(obj)

Object.defineproperty(obj,‘a’,{

get(){

console.log(‘a属性’)

return val //变量周转

}

set(newValue){

console.log(‘新a属性’,newValue)

if(val === newValue){return}

val = newValue

child = observe(newValue)

}

export const def = function(obj,key,value,enumerable){

Object.defineProperty(obj,key,{

value,enumerable,writable:true,configurable:true

})

}

import {def}