到底该如何回答:vue数据绑定的实现原理?

  • Watcher对象:将模板和Observer对象结合在一起生成Watcher实例,Watcher是订阅者中的订阅者。

  • Dep对象:Watcher对象和Observer对象之间纽带,每一个Observer都有一个Dep实例,用来存储订阅者Watcher。

当属性变化会执行主题对象Observer的dep.notify方法, 这个方法会遍历订阅者Watcher列表向其发送消息, Watcher会执行run方法去更新视图。

依赖关系图如下,更能方面我们的理解

接着我们需要补充的是:模板编译过程中的指令和数据绑定都会生成Watcher实例,实例中的watch属性也会生成Watcher实例。

说的这些有没有觉得有点乱,那我们总结一下如何亮点回答

  • 1、在生命周期的initState方法中将data,prop,method,computed,watch中的数据劫持, 通过observe方法与Object.defineProperty方法将相关对象转为换Observer对象。

  • 2、然后在initRender方法中解析模板,通过Watcher对象,Dep对象与观察者模式将模板中的 指令与对象的数据建立依赖关系,使用全局对象Dep.target实现依赖收集。

  • 3、当数据变化时,setter被调用,触发Object.defineProperty方法中的dep.notify方法, 遍历该数据依赖列表,执行器update方法通知Watcher进行视图更新。

  • vue是无法检测到对象属性的添加和删除,但是可以使用全局Vue.set方法(或vm.$set实例方法)。

  • vue无法检测利用索引设置数组,但是可以使用全局Vue.set方法(或vm.$set实例方法)。

  • 无法检测直接修改数组长度,但是可以使用splice

然后写一个使用Object.defineProperty实现监听变量

var obj = {};

var a;

Object.defineProperty(obj, ‘a’, {

get: function() {

console.log(‘get val’);

return a;

},

set: function(newVal) {

console.log(‘set val:’ + newVal);

a = newVal;

}

});

obj.a; // get val

obj.a = ‘saucxs’ //set val

如果上面代码格式出现问题,可以查看下面代码图片

3、进阶回答

因为现在vue已经到3了,不再是停留在2的时候,这个时候,可以把3的原理简单说一下。

这个时候不应该是ES6的proxy特性上场了,proxy是ES6的新增的功能,可以用来定义对象中的操作。

let p = new Proxy(target, handler);

// target 代表需要添加代理的对象

// handler 用来自定义对象中的操作

如果上面代码格式出现问题,可以查看下面代码图片

可以很方便的使用 Proxy 来实现一个数据绑定和监听.

let onWatch = (obj, setBind, getLogger) => {

let handler = {

get(target, property, receiver) {

getLogger(target, property)

return Reflect.get(target, property, receiver);

},

set(target, property, value, receiver) {

setBind(value);

return Reflect.set(target, property, value);

}

};

return new Proxy(obj, handler);

};

let obj = { saucxs: 1 }

let value

let p = onWatch(obj, (v) => {

value = v

}, (target, property) => {

console.log(Get '${property}' = ${target[property]});

})

p.saucxs = songEagle // bind value to songEagle

p.saucxs // -> Get ‘saucxs’ = songEagle

如果上面代码格式出现问题,可以查看下面代码图片

然后在对比vue2和vue3的区别是什么?

以及为啥在数据监听上做了升级?

vue为什么对数组对象的深层监听无法实现,因为组件每次渲染都是将data里的数据通过defineProperty进行响应式或者双向绑定上,之前没有后加的属性是不会被绑定上,也就不会触发更新渲染。

区别:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值