前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vue中的双向数据绑定原理_vue nodejs

vue中的双向数据绑定原理_vue nodejs

作者头像
全栈程序员站长
发布2022-11-08 11:44:26
1.3K0
发布2022-11-08 11:44:26
举报
文章被收录于专栏:全栈程序员必看

简述

    每当面试官问到Vue数据双向绑定原理的时候,我们都会简单的说:Vue 内部通过 Object.defineProperty 方法属性拦截的方式,把data 对象里每个数据的读写转化成 getter / setter,当数据变化时通知视图更新。虽然一句话把大概原理概括了,但是其内部的实现方式还是值得深究的,本文就以通俗易懂的方式剖析 Vue 内部双向数据绑定原理的实现过程

思路

    所谓MVVM数据双向绑定,即主要是:数据变化更新视图,视图变化更新数据。如图:

在这里插入图片描述
在这里插入图片描述

    也就是说,输入框内容变化时,data 中的数据同步变化。即 view —> model 的变化。data 中的数据变化时,文本节点的内容同步变化。即 model —> view 的变化

原理

    Vue 实现的双向数据绑定,是采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。要实现mvvm的双向绑定,就必须要实现以下几点:

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象

在这里插入图片描述
在这里插入图片描述

1. 实现一个数据监听器 Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者

2. 实现一个指令解析器 Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数

3. 实现一个 Watcher,作为连接 Observer 和 Compile 的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图

4. 将 MVVM 作为数据绑定的入口,整合 Observer,Compile 和 Watcher 三者

实现简单的双向绑定

代码语言:javascript
复制
<body>
<input type="text" id="inp">
<div id="demo"></div>
<script>
var demo = document.querySelector('#demo')
var inp = document.querySelector('#inp')
let obj = { 
}
inp.addEventListener('input', function(e) { 

// 给 obj 的 name 属性赋值,进而触发该属性的 set 方法
obj.name = e.target.value
})
Object.defineProperty(obj, 'name', { 

set: function(newVal) { 

inp.value = newVal
demo.innerHTML = newVal
console.log('更新了obj的name:' + newVal)   // name 属性值被修改时触发
},
get: function() { 

console.log('获取obj数据name')
}
})
obj.name    // 获取 data 数据 name
</script>
</body>

Vue实现双向绑定

1. 实现 Observer

2. 实现 Compile

3. 实现 Watcher

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月9日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简述
  • 思路
  • 原理
  • 实现简单的双向绑定
  • Vue实现双向绑定
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档