前端技巧|vue双向绑定原理,助你面试成功「建议收藏」

前端技巧|vue双向绑定原理,助你面试成功「建议收藏」在面试一些大厂的时候,面试官可能会问到你vue双向数据绑定的原理是什么?有些小伙伴不知道是什么东西,这样你在面试官的眼里就大打折扣了。今天小千就来给大家介绍一下vue的双向绑定原理,千万不要错过啦。vue双向绑定大家其实对于这个问题不会很陌生,vue中采用mvvm的模式,内置vm将view层与model层两者进行关联,任何一方的变化都会让另外一方受到影响。那回答完后,面试官还会继续追问,请回答一下你理解的双向数据绑定背后的原理是什么?那今天我们就一起探讨一下vue的背后的一些方式实现。所谓要实现双向数

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在面试一些大厂的时候,面试官可能会问到你vue双向数据绑定的原理是什么?有些小伙伴不知道是什么东西,这样你在面试官的眼里就大打折扣了。今天小千就来给大家介绍一下vue的双向绑定原理,千万不要错过啦。

vue双向绑定

大家其实对于这个问题不会很陌生,vue中采用mvvm的模式,内置vm将view层与model层两者进行关联,任何一方的变化都会让另外一方受到影响。那回答完后,面试官还会继续追问,请回答一下你理解的双向数据绑定背后的原理是什么?那今天我们就一起探讨一下vue的背后的一些方式实现。

所谓要实现双向数据绑定,vue中内部采用了发布-订阅模式。内部结合了Object.defineProperty这个ES5的新特性(ie8浏览器可不支持哦…),对vue传入的数据进行了相应的数据拦截,为其动态添加get与set方法。当数据变化的时候,就会触发对应的set方法,当set方法触发完成的时候,内部会进一步触发watcher,当数据改变了,接着进行虚拟dom对比,执行render,后续视图更新操作完毕。

来,直接上图看一下
在这里插入图片描述
好,分析完原理后,我们来看下es5这个方法Object.defineProperty有什么用呢?

上代码运行一下:
在这里插入图片描述
运行的时候,我们不难发现,输入框里面的内容改变的时候,p标签里面的值也会对应的得到变化。原因是因为当输入框的内容发生变化的时候,我们获取到了输入框的值,然后将其赋值给object.msg属性。这样object的msg属性的set方法就会被执行,从而将对应的content值进行了改变。

那后续当我们去修改数据,视图会不会自动更新呢?
在这里插入图片描述
这样,整了一个定时器,过了2s中,修改了对象的数据,对象数据发生变化,从而又会触发set方法,实现了响应的数据改变,视图也会变成了hello-world的值。其实,这就是借助了vue中的Object.defineProperty对于数据的拦截处理的流程。

补充小贴士

vue 2.x中使用的Object.defineProperty对于数据进行拦截,其实还是有缺陷的

1、对象属性的新加或者删除无法监听;

2、数组元素的增加和删除无法监听。

那为啥2.x的时候不解决呢,从两点考虑:

1.性能:通过遍历对象的属性进行监听,但是属性值也是对象就需要深度遍历了,这时候显然能够劫持完整对象更好

2.无法监听数组:属性值改为数组,数组也算是一种特殊的对象,下标其实就是对象的属性,理论上是可以通过

Object.defineProperty来处理的,那尤大大为什么没有采用这种方式呢,猜测源于数组的使用场景,数组的主要操作场景是遍历,如果每一个元素都挂载set和get方法,会产生巨大性能消耗,而且数组下标变化频繁,操作方法居多,一旦数组长度发生变化,在无法自动检测的状态下,手动更新会是一个相当繁琐的工作。

那vue中是如何实现对数组的劫持呢,对7种常用的数组操作进行了重写,分别是push() 、pop() 、shift()、 unshift() 、splice() 、sort()、 reverse(),其中Vue.set()对于数组的处理其实就是调用了splice方法。

针对Object.defineProperty的缺点,ES6 Proxy都能够完美得解决,它唯一的缺 点就是,对IE不友好,所以vue3在检测到如果是使用IE的情况下(没错,IE11都不支持Proxy),会自动降级为Object.defineProperty的数据监听系统。

那么到这一步,恭喜哦!你已经明白了vue2.x的双向数据绑定原理了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183493.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ccs5可以软件仿真吗(ccs软件仿真)

    起因:我用的是C6748板子,在用CCS进行软件仿真和硬件仿真时,发现矩阵的计算结果不同。查看内存,发现软件仿真内存中没有初值,但连接上板子后debug时发现有的内存中存在数据。经过学习与思索,确定是flash中的数据在板子被连接启动时bootbin选择了nor启动,会把nor中的数据传入DDR中,污染了原本的数组,会导致输出错误。解决办法:1:新添加:赋0循环,在使用数组前先都初始化为0,解决…

    2022年4月17日
    57
  • luajit性能优化[通俗易懂]

    luajit性能优化[通俗易懂]本文转载地址:(http://www.cnblogs.com/zwywilliam/p/5992737.html)luajit是目前最快的脚本语言之一,不过深入使用就很快会发现,要把这个语言用到像宣称那样高性能,并不是那么容易。实际使用的时候往往会发现,刚开始写的一些小testcase性能非常好,经常毫秒级就算完,可是代码复杂度一上去了,动辄几十上百毫秒的情况就会出现,性能表现非常飘忽。

    2022年10月6日
    3
  • 多个checkbox复选框触发点击事件

    多个checkbox复选框触发点击事件多个checkbox复选框触发点击事件

    2022年4月23日
    143
  • 微机原理与接口技术实验报告心得_微型计算机原理与接口技术第二版

    微机原理与接口技术实验报告心得_微型计算机原理与接口技术第二版微机原理与接口技术实验总结寒黎实验内容以及设计思路1、=1\*GB3①试编写一程序,比较两个字符串STRING1、STRING2 所含字符是否相同,若相同输出“MATCH”,若不相同输出“NOMATCH”。设计思路:定义一个数据段,在数据段中定义两个字符串作为STRING1、STRING2以及几个用于输入提示的和输出所需内容的字符串,定义一个堆栈段用于存放,定义代码段。关键步骤以…

    2022年10月2日
    3
  • error lnk2019无法解析的外部符号WinMain_计算机二级c语言2019

    error lnk2019无法解析的外部符号WinMain_计算机二级c语言2019我收到了以下错误消息:错误1错误LNK2019:未解析的外部符号“public:void__thiscallArrayIntStorage::sortOwn(void)”(?sortOwn@ArrayIntStorage@@QAEXXZ)在函数_mainG中引用:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\…

    2022年9月26日
    2
  • 基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

    基于thinkphp实现根据用户ip判断地理位置并提供对应天气信息的应用

    2021年10月23日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号