响应式数据原理(数据劫持)数据双向绑定

Vue2
Vue 在初始化数据时,会对 data 进行遍历,并使用 Object.defineProperty 把这些属性转为 getter/setter。 每个组件实例都对应一个 watcher 实例,当页面使用对应属性 时,首先会用 getter 进行依赖收集(收集当前组件的 watcher) 如果属性发生变化 setter 触发时会通知相关依赖进行更新操作(发布订阅)。

注意:
  1. Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。
  2. 由于 JavaScript 的限制,Vue 不能检测数组和对象的变化。我们所说的数据双向绑定,一定是对于 UI 控件来说的,非 UI 控件不会涉及到双向绑定Vue 是用数据劫持和发布订阅模式来实现双向数据绑定的,其中数据劫持是利用了 object.defineProprety 这个方法。他给数据对象中的每个属性添加了 set 和 get 的方法。所以在数据写入和读取的时候,都可以触发对应的自定义方法。我们已经知道实现数据的双向绑定,首先要对数据进行劫持监听,所以我们需要设置一个监听器 Observer,用来监听所有属性。如果属性发上变化了,就需要告诉订阅者 Watcher 看是否需要更新。因为订阅者是有很多个,所以我们需要有一个消息订阅器 Dep 来专门收集这些订阅者,然后在监听器 Observer 和订阅者 Watcher 之间进行统一管理的。接着,我们还需要有一个指令解析器 Compile,对每个节点元素进行扫描和解析,将相关指令对应初始化成一个订阅者 Watcher,并替换模板数据或者绑定相应的函数,此时当订阅者 Watcher 接收到相应属性的变化,就会执行对应的更新函数,从而更新视图。因此接下去我们执行以下 3 个步骤,实现数据的双向绑定:<hr> 1.实现一个监听器 Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者。<hr> 2.实现一个订阅者 Watcher,可以收到属性的变化通知并执行相应的函数,从而更新视图。<hr> 3.实现一个解析器 Compile,可以扫描和解析每个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器。

Vue3 响应式数据原理

Vue3.x 改用Proxy替代 Object.defineProperty。因为 Proxy 可以直接监听对象和数组的变化,并且有多达 13 种拦截方法。

既然说到vue3了,那我就在多说一嘴

Vue3 为什么使用 Proxy 代替 Object.definedProperty

Object.definedProperty 只能检测到属性的获取和设置,对于新增和删除是没办法检测的。在数据初始化时,由于不知道哪些数据会被用到,Vue 是直接递归观测全部数据,这会导致性能多余的消耗。
Proxy 劫持整个对象,对象属性的增加和删除都能检测到。Proxy 并不能监听到内部深层的对象变化,因此 Vue 3.0 的处理方式是在 getter 中去递归响应式,只有真正访问到的内部对象才会变成响应式,而不是无脑递归,在很大程度上提升了性能。
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue 是一个前端 JavaScript 框架,它使用双向数据绑定,即当应用的数据改变时,页面也会相应地更新;当页面的内容改变时,应用数据也会相应地更新。双向数据绑定是通过 Vue 的响应式系统实现的,它会根据每个组件的实例数据来动态更新 DOM,而这些更新也会反过来影响到实例数据。 ### 回答2: Vue数据双向绑定是Vue框架的核心特性之一,它能够自动保持数据和视图的同步更新。其原理主要基于以下两个方面: 1.对象劫持(Object.defineProperty):Vue通过使用Object.defineProperty方法来劫持对象的属性。当我们创建一个Vue实例时,Vue会遍历实例的所有属性,对其进行数据劫持。通过这种方式,Vue能够追踪每个属性的变化,并在变化时触发相应的更新。 2.数据观察:Vue会为每个属性创建一个监听器(Watcher),用于监听数据变化。这些观察者会订阅属性的变化,并在变化时更新相应的视图。当数据发生改变时,Vue会通过触发监听器来通知订阅者进行更新,从而实现UI的自动更新。 具体的实现步骤如下: 1. 在Vue实例化的过程中,Vue会将需要双向绑定数据进行劫持。 2. Vue会为每个绑定的数据创建对应的监听器,用于监听数据的变化。 3. 当数据发生变化时,监听器将通知订阅者进行更新。 4. 订阅者接收到更新通知后,会通过调用相应的更新函数来更新视图。 总结来说,数据双向绑定原理就是通过使用对象劫持数据观察的方法来追踪数据的变化,并实时更新视图。这种机制使得我们在修改数据时无需手动更新视图,大大提高了开发效率,使得前端开发更加便捷。 ### 回答3: Vue的数据双向绑定原理是通过使用一种叫做“响应式”的机制来实现的。在Vue中,我们可以使用v-model指令将表单元素与Vue实例的数据属性进行绑定,实现数据的双向同步更新。 首先,当Vue实例创建时,会对数据对象进行遍历并使用Object.defineProperty方法将每个属性转换为“getter”和“setter”。这样一来,当我们访问或修改数据对象的属性时,Vue会拦截这些操作,并在需要的情况下触发相应的更新。 在双向绑定中,当用户在输入框中输入内容时,输入框的“input”事件会被监听到,并且会调用相应的更新函数,将输入的值同步到Vue实例的数据属性中。然后,当数据属性的值发生变化时,Vue会调用相应的“setter”函数更新输入框的值,从而保持数据的同步。 总结起来,Vue数据双向绑定原理是通过Vue实例对数据对象的属性进行拦截和转换,从而实现数据的双向同步更新。这个机制使得我们可以更方便地处理表单输入和数据的变化,提高了开发效率。同时,Vue还提供了一些其他的指令和功能来增强数据双向绑定,如computed属性和watch属性等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值