【vue原理】响应式原理(数据双向绑定)

vue数据双向绑定的原理:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

以上属于官方说法,听得似懂非懂,只知道vue的双向绑定采用了js中的Object.defineProperty方法,其中get方法是值读取时触发函数,set是设置值时触发函数,当监听到数据变化时把变化的消息通知订阅者,触发相应的监听回调。

但是发布者订阅者是谁?相应的监听回调又是什么?

我查了很多资料,这个vue的双向绑定原理及实现 - canfoo#! - 博客园是最详细的,还有代码进行参考。以下我就来班门弄斧以下,具体实现可以看链接里面的内容。

实现数据的双向绑定简单的分为三步:

1.实现一个监听器Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者

2.实现一个订阅者Watcher,可以收到属性的变化通知并执行相应的函数,从而更新视图

3.实现一个解析器Compile,可以扫描和解析每个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器。

注意事项:

1.由于javaScript的限制,vue不能监听数组和对象的变化

关于对象:Vue 无法检测 property 的添加或移除。由于 Vue 会在初始化实例时对 property 执行 getter/setter 转化,所以 property 必须在 data 对象上存在才能让 Vue 将它转换为响应式的

 使用Vue.set(vm.someObject, 'b', 2)或者this.$set(this.someObject,'b',2)解决

关于数组:Vue 不能检测以下数组的变动:

  1. 当你利用索引直接设置一个数组项时,例如:vm.items[indexOfItem] = newValue
  2. 当你修改数组的长度时,例如:vm.items.length = newLength

 解决方式Vue.set(vm.items, indexOfItem, newValue),vm.$set(vm.items, indexOfItem, newValue)或者vm.items.splice(indexOfItem, 1, newValue),vm.items.splice(newLength)

2.vue的更新是异步的。

Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新,简单来说,Vue 在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。

 以下需要使用nextTick常见情况:

 就情况二举个例子:

1、点击按钮显示原本以 v-show = false 隐藏起来的输入框,并获取焦点。

showsou(){
  this.showit = true //修改 v-show
  document.getElementById("keywords").focus()  //在第一个 tick 里,获取不到输入框,自然也获取不到焦点
}

修改为:

showsou(){
  this.showit = true
  this.$nextTick(function () {
    // DOM 更新了
    document.getElementById("keywords").focus()
  })
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue数据响应式原理是通过使用ES5的`Object.defineProperty()`法来实现的。当在Vue实例中定义一个数据属性时,Vue会将这个属性转化为getter和setter,并且在这些getter和setter中添加了依赖追踪和通知机制。 当我们在模板中使用一个数据属性时,Vue会追踪这个属性的依赖关系,并建立一个依赖关系图。当这个属性的值发生变化时,Vue会通知依赖关系图中的所有订阅者,告知它们需要进行更新。 双向绑定原理是基于数据响应式的基础上实现的。在Vue中,我们可以使用`v-model`指令来实现双向数据绑定。它会将输入框的值和Model层的数据进行双向的绑定。在Model层数据发生变化时,视图会自动更新,而在视图中输入框的值发生变化时,Model层的数据也会跟着更新。 双向绑定的实现原理是通过在输入框中添加一个事件监听器,当输入框的值发生变化时,它会触发一个input事件,然后通过这个事件将变化的值传递给Model层的数据,更新数据的同时也触发了数据响应式原理中的依赖追踪和通知机制,让视图进行更新。 总结来说,Vue数据响应式原理是通过将数据属性转化为getter和setter,并在其中实现依赖追踪和通知机制来实现的。而双向绑定原理是在数据响应式的基础上,通过事件监听器将输入框的变化传递给Model层的数据,实现视图和数据双向绑定

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值