深入理解vue核心之一数据响应式

14 篇文章 0 订阅
13 篇文章 0 订阅

vue响应式在初始化的时候混入响应式initState文件,利用的是Object.defineProerty进行数据劫持在改方法里面绑定get方法和set方法,每一个组件会生成一个Watcher,它主要是保存更新函数 值发生变化调用更新函数updateComponent 再进行diff算法 对比实现更新 具体可以查看源码 下面实现小demo说明响应式。

// 第一步 定义一个对象
const obj = { foo: ‘foo’, bar: ‘bar’, baz: { a: 1 }}
// 第二步 实现响应式更新函数
observe(obj)

function observe(obj) {
// 如果要对数组做响应式 必须覆盖数组默认方法
if (typeof obj !== ‘object’ || obj == null) {
// 希望传入的是obj
return
}
Object.keys(obj).forEach(key => {
defineReactive(obj, key, obj[key])
})
}

function defineReactive(obj, key, val) {
// 递归 因为有可能val是对象
observe(val)

// 对传入obj进行访问拦截
Object.defineProperty(obj, key, {
get() {
console.log('get ’ + key);
return val
},
set(newVal) {
if (newVal !== val) {
console.log('set ’ + key + ‘:’ + newVal);
// 如果传入的newVal依然是obj,需要做响应化处理
observe(newVal)
val = newVal
}
}
})
}
// 第三步 然后再对改对象进行更新
obj.foo = ‘xxxx’;

下期预告:这里只是数据响应式, 如何实时将数据动态显示在页面 需要编写一个编译器 下期带来编译器的deom

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值