前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vue2.X是如何利用Object.defineProperty()实现数据绑定的

Vue2.X是如何利用Object.defineProperty()实现数据绑定的

原创
作者头像
伯约同学
发布于 2022-02-15 13:46:18
发布于 2022-02-15 13:46:18
48900
代码可运行
举报
运行总次数:0
代码可运行

Vue2.X是如何利用Object.defineProperty()实现数据绑定的

上一篇文章写到了Object.defineProperty的使用,这篇文章说一下Vue是如何利用这个方法实现数据绑定的。

首先把Vue中的核心方法defineReactive做一些简化

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function defineReactive (obj, key, val, cb) {
    var dep = new Dep();
​
    Object.defineProperty(obj, key, {
        enumerable: true,
        configurable: true,
        get: ()=>{
            /*....依赖收集等....*/  
            dep.depend()
            return val
        },
        set:newVal=> {
            val = newVal;
            /*触发回调*/
            dep.notify()
        }
    })
}

Vue通过defineReactive方法实现对需要观察的对象的每个属性进行监控。

dep对象就相当于一个调度中心的作用,如果有数据用到这个属性,它就会自动收集该属性到调度中心,如果某属性发生了改变,那就会通知调度中心来更新视图。

再看看dep方法和它的功能。相对比较简单:1、存储订阅者2、添加订阅者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Dep () {
  // 所有的watcher 放进这里统一管理
  this.subs = []
}
Dep.target = null;
// 通知视图更新dom的 notify的方法
Dep.prototype.notify  = function () {
  // this.subs 存储 watcher
  this.subs.forEach(sub => {
    // sub 是某个Watcher 具体调用某个Watcher的update 方法
    sub.update()
  })
}
// 添加订阅者的方法
Dep.prototype.addSub = function (sub) {
  this.subs.push(sub)
}

订阅器主要也是了两个方法;1、触发一下属性的获取,顺便把自己加到调度中心去 2、update更新视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 具体的订阅器Watcher
// 传入一个vue 的示例, 监听的属性, 以及处理的回调函数
function Watcher (vm,prop,callback) {
  this.vm = vm;
  this.$prop = prop;
  this.value = this.get();
  this.callback = callback;
 }
// 添加watcher 获得属性的get 方法,当有属性访问/设置 的时候,就产生订阅者 将这个订阅者放进调度中心
Watcher.prototype.get = function () {
  Dep.target = this;
  // 获得属性值
  const value = this.vm.$data[this.$prop];
  return value
}
// 添加watcher的更新视图的方法
Watcher.prototype.update = function () {
  // 当属性值有变化的时候,执行方法,更新试图
  const value = this.vm.$data[this.$prop];
  this.callback(this.value)
}

于是乎

当外界读取数据时会调用watcher,会触发getter把watcher添加到Dep依赖中。(也就是编译过程收集依赖)

当数据发生了变化,会触发setter,从而想Dep中的依赖(watcher)发送通知。(交互过程,调度中心去通知订阅器抓紧更新)。

Watcher 接收到通知后,会向外界发送通知,变化通知到外界可能触发试图更新,也有可能触发用户的某个回调函数等。(订阅器修改对应的值,页面参数随之相应,实现响应)

当然,这才只是单向绑定,双向绑定就是说视图更改数据,这个就比较简单,在编译过程中将标签绑定input方法,修改对应的数据即可。

有来有回,实现了双向绑定。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解vue2.x双向数据绑定原理
在面试中会经常问到vue2.x双向数据绑定是怎么实现的,大多数面试者都会回答Object.defineProperty()方法对属性进行拦截,把data中的每个数据的读写都转化成getter/setter,当数据发生变化时候通知试图进行更新。本文将详细论述双向数据绑定的原理是怎么实现。
can4hou6joeng4
2023/11/29
2140
Vue.js 双向数据绑定基本实现认知
对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》
山河已无恙
2024/05/10
2490
Vue.js 双向数据绑定基本实现认知
vue源码分析-响应式系统工作原理
上一章,我们讲到了Vue初始化做的一些操作,那么我们这一章来讲一个Vue核心概念响应式系统。
yyzzabc123
2022/10/19
4930
vue 的双向绑定原理「建议收藏」
vue 在实例化的时候,使用 Object.definePropery() 方法或 Proxy 构造函数,对 data 进行 getter 和 setter 的处理。在组件渲染时,若用到 data 里的某个数据,这个数据就会被依赖收集进 watcher 里。当数据更新,如果这个数据在 watcher 里,就会收到通知并更新,否则不会更新——vue 采用“数据劫持”+“观察者模式(发布者-订阅者模式)”相结合的方式实现了双向绑定——vue 的响应式原理。
全栈程序员站长
2022/09/27
1.2K0
Vue双向绑定原理,教你一步一步实现双向绑定
当今前端天下以 Angular、React、vue 三足鼎立的局面,你不选择一个阵营基本上无法立足于前端,甚至是两个或者三个阵营都要选择,大势所趋。
六小登登
2018/11/15
1K0
深入浅出Vue响应式原理
Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。这使得状态管理非常简单直接,不过理解其工作原理同样重要,这样你可以避开一些常见的问题。----官方文档 本文将针对响应式原理做一个详细介绍,并且带你实现一个基础版的响应式系统。本文的代码请猛戳Github博客
浪里行舟
2019/07/11
9790
深入浅出Vue响应式原理
VUE源码解读之响应式系统及Watcher的调度实现
鉴于目前 vue3 还没有正式发布,而且 vue2 里面的一些实现思想还是很有参考价值的,于是这篇原理性讲解还是 vue2 的,希望对你有启发~
winty
2020/04/01
9620
vue源码分析-响应式系统工作原理_2023-03-01
上一章,我们讲到了Vue初始化做的一些操作,那么我们这一章来讲一个Vue核心概念响应式系统。
用户10377014
2023/03/01
4620
~<Strong>-要-模-拟</Strong> Vue 响应式原理
https://juejin.cn/post/6946120511713705992
zz_jesse
2021/05/07
5010
Vue源码之数据响应式原理
本文写了好久(个人菜+没时间),看了很多博客,才写完这篇博客。如果对你有所帮助,希望点赞一波。
赤蓝紫
2023/01/05
1.4K0
Vue源码之数据响应式原理
vue数据双向绑定原理-observer
​​ 1)vue 数据双向绑定原理-observer ​2)vue 数据双向绑定原理-wather​ 3)vue 数据双向绑定原理-解析器 Complie
chuchur
2022/10/25
7830
vue数据双向绑定原理-observer
vue的双向绑定原理及实现_vue的数据绑定怎么实现
​ 所谓双向绑定,指的是vue实例中的data与其渲染的DOM元素的内容保持一致,无论谁被改变,另一方会相应的更新为相同的数据。(数据变化更新视图,视图变化更新数据)
全栈程序员站长
2022/11/02
9890
手摸手带你理解Vue响应式原理
响应式原理作为 Vue 的核心,使用数据劫持实现数据驱动视图。在面试中是经常考查的知识点,也是面试加分项。
WahFung
2020/08/24
9580
vue响应式原理的实现
Vue的数据双向绑定,响应式原理,其实就是通过Object.defineProperty()结合发布者订阅者模式来实现的。
全栈程序员站长
2022/08/14
6080
vue响应式原理的实现
vue数据双向绑定原理-watcher
​​ 1)vue 数据双向绑定原理-observer ​2)vue 数据双向绑定原理-wather​ 3)vue 数据双向绑定原理-解析器 Complie
chuchur
2022/10/25
5000
vue数据双向绑定原理-watcher
【前端词典】Vue 响应式原理其实很好懂
这是十篇 Vue 系列文章的第三篇,这篇文章我们讲讲 Vue 最核心的功能之一:响应式原理。
小生方勤
2019/06/13
8390
图解 Vue 响应式原理
最近部门分享,有同学提到了 Vue 响应式原理,大家在讨论时,发现一些同学对这一知识理解还不够深入,不能形成一个闭环,为了帮助大家理解这个问题,我重新过了一下 Vue 源码,并整理了多张流程图,便于大家理解。
全栈程序员站长
2022/08/12
2270
图解 Vue 响应式原理
vue双向数据绑定原理
目前几种主流的mvc(vm)框架都实现了单向数据绑定,而我所理解的双向数据绑定无非就是在单向绑定的基础上给可输入元素(input、textare等)添加了change(input)事件,来动态修改model和 view,并没有多高深。所以无需太过介怀是实现的单向或双向绑定。 实现数据绑定的做法有大致如下几种:
念念不忘
2019/03/29
2.2K0
vue双向数据绑定原理
实现一个自己的MVVM
vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,那么vue是如果进行数据劫持的,我们可以先来看一下通过控制台输出一个定义在vue初始化数据上的对象:
前端迷
2019/12/05
5500
实现一个自己的MVVM
彻底明白vue双向绑定底层原理(源码分析)
vue是一个mvvm框架,双向绑定是vue的一个核心功能,所谓双向绑定就是当试图发生改变的时候传递给VM(ViewModel ),让数据得到更新,当数据发生改变的时候传给VM(ViewModel ),使得视图发生变化!概念都知道,但是vue怎么做到的呢?看下面的一张图(图是搬运别人的)
全栈程序员站长
2022/10/05
7820
彻底明白vue双向绑定底层原理(源码分析)
推荐阅读
相关推荐
深入理解vue2.x双向数据绑定原理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验