vue双向数据绑定

Vue 2 中的双向数据绑定详解 双向数据绑定意味着当用户交互改变视图中的值时,这些更改会自动反映到关联的数据模型中;同样地,如果通过代码修改了数据模型,相应的视图也会即时更新。这种机制极大地简化了前端开发工作流,使得开发者可以更加专注于业务逻辑的实现,而不必担心手动管理DOM操作。 阅读详情

双向数据绑定基本原理

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

var obj  = {};
Object.defineProperty(obj, 'name', {
        get: function() {
            console.log('get触发了')
            return value1;
        },
        set: function (Value2) {
            console.log('set触发了')
        }
})
obj.name = 'fei';//在给obj设置name属性的时候,触发了set这个方法
var val = obj.name;//在得到obj的name属性,会触发get方法

已经了解到vue是通过数据劫持的方式来做数据绑定的,其中最核心的方法便是通过Object.defineProperty()来实现对属性的劫持,那么在设置或者获取的时候我们就可以在get或者set方法里假如其他的触发函数,达到监听数据变动的目的,无疑这个方法是最重要、最基础的内容之一。

html 下实现双向数据绑定:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h1 class="demo"></h1>
  <input type="text" class="input">
</body>
<script>

  var obj = {};
  var demo = document.querySelector('.demo')
  var demo_input = document.querySelector('.input') 

  Object.defineProperty(obj, 'name', {
    //当该属性被获取时触发
    get: function () {
      console.log("get触发了")
      return value1;
    },
    //当该属性被赋值时触发
    set: function (Value2) {
      console.log("set触发了")
      demo_input.value = Value2;
      demo.innerHTML = Value2;
    }
  })
  demo_input.addEventListener('input', function (e) {
    // 给obj的name属性赋值,进而触发该属性的set方法
    obj.name = e.target.value;
  });
  obj.name = 'fei';//在给obj设置name属性的时候,触发了set这个方法
</script>
</html>

讲解vue如何实现

原理图:
在这里插入图片描述

  • observer用来实现对每个vue中的data中定义的属性循环用Object.defineProperty()实现数据劫持,以便利用其中的setter和getter,然后通知订阅者,订阅者会触发它的update方法,对视图进行更新。
  • 我们介绍为什么要订阅者,在vue中v-model,v-name,{{}}等都可以对数据进行显示,也就是说假如一个属性都通过这三个指令了,那么每当这个属性改变的时候,相应的这个三个指令的html视图也必须改变,于是vue中就是每当有这样的可能用到双向绑定的指令,就在一个Dep中增加一个订阅者,其订阅者只是更新自己的指令对应的数据,也就是v-model='name’和{{name}}有两个对应的订阅者,各自管理自己的地方。每当属性的set方法触发,就循环更新Dep中的订阅者。

vue代码实现

  1. observer实现,主要是给每个vue的属性用Object.defineProperty(),代码如下:
function defineReactive(obj, key, val) {
    var dep = new Dep();
    Object.defineProperty(obj, key, {
      get: function () {
        //添加订阅者watcher到主题对象Dep
        if (Dep.target) {
          // JS的浏览器单线程特性,保证这个全局变量在同一时间内,只会有同一个监听器使用
          dep.addSub(Dep.target);
        }
        return val;
      },
      set: function (newVal) {
        if (newVal === val) return;
        val = newVal;
        console.log(val);
        // 作为发布者发出通知
        dep.notify();//通知后dep会循环调用各自的update方法更新视图
      }
    })
  }
  function observe(obj, vm) {
    Object.keys(obj).forEach(function (key) {
      defineReactive(vm, key, obj[key]);
    })
  }
  1. 实现compile:

compile的目的就是解析各种指令称真正的html。

function Compile(node, vm) {
    if (node) {
      this.$frag = this.nodeToFragment(node, vm);
      return this.$frag;
    }
  }
  Compile.prototype = {
    nodeToFragment: function (node, vm) {
      var self = this;
      var frag = document.createDocumentFragment();
      var child;
      while (child = node.firstChild) {
        console.log([child])
        self.compileElement(child, vm);
        frag.append(child); // 将所有子节点添加到fragment中
      }
      return frag;
    },
    compileElement: function (node, vm) {
      var reg = /\{\{(.*)\}\}/;
      //节点类型为元素(input元素这里)
      if (node.nodeType === 1) {
        var attr = node.attributes;
        // 解析属性
        for (var i = 0; i < attr.length; i++) {
          if (attr[i].nodeName == 'v-model') {//遍历属性节点找到v-model的属性
            var name = attr[i].nodeValue; // 获取v-model绑定的属性名
            node.addEventListener('input', function (e) {
              // 给相应的data属性赋值,进而触发该属性的set方法
              vm[name] = e.target.value;
            });
            new Watcher(vm, node, name, 'value');//创建新的watcher,会触发函数向对应属性的dep数组中添加订阅者,
          }
        };
      }
      //节点类型为text
      if (node.nodeType === 3) {
        if (reg.test(node.nodeValue)) {
          var name = RegExp.$1; // 获取匹配到的字符串
          name = name.trim();
          new Watcher(vm, node, name, 'nodeValue');
        }
      }
    }
  }
  1. watcher实现
function Watcher(vm, node, name, type) {
    Dep.target = this;
    this.name = name;
    this.node = node;
    this.vm = vm;
    this.type = type;
    this.update();
    Dep.target = null;
  }

  Watcher.prototype = {
    update: function () {
      this.get();
      this.node[this.type] = this.value; // 订阅者执行相应操作
    },
    // 获取data的属性值
    get: function () {
      console.log(1)
      this.value = this.vm[this.name]; //触发相应属性的get
    }
  }
  1. 实现Dep来为每个属性添加订阅者
function Dep() {
    this.subs = [];
  }
  Dep.prototype = {
    addSub: function (sub) {
      this.subs.push(sub);
    },
    notify: function () {
      this.subs.forEach(function (sub) {
        sub.update();
      })
    }
  }

总结

首先我们为每个vue属性用Object.defineProperty()实现数据劫持,为每个属性分配一个订阅者集合的管理数组dep;然后在编译的时候在该属性的数组dep中添加订阅者,v-model会添加一个订阅者,{{}}也会,v-bind也会,只要用到该属性的指令理论上都会,接着为input会添加监听事件,修改值就会为该属性赋值,触发该属性的set方法,在set方法内通知订阅者数组dep,订阅者数组循环调用各订阅者的update方法更新视图。

Vue2和Vue3的双向数据绑定对比 Vue2和Vue3的监控数据类比​ ​​Vue2​​: 用Object.defineProperty监控数据,像是一个只能盯着​​固定门窗​​的保安。它只能监控已有的属性,如果家里突然多开一扇窗户(新增属性)或拆掉一堵墙(删除属性),它就懵了,得手动告诉它(用Vue.set方法) ​​Vue3​​: 改用Proxy监控数据,像装了一套​​全屋智能监控​​。不管新增窗户、拆墙,还是挪家具(数组长度变化),它都能自动发现,不用手动提醒 阅读详情

相关推荐

抖音直播小风车跳转企业微信全攻略:企业号申请+落地页配置详解

本文详细解析了抖音直播小风车跳转企业微信的全流程,包括企业号申请、小风车配置和落地页优化。通过实战指南,帮助企业高效实现私域流量沉淀,提升直播转化率,特别适合电商和营销从业者参考。

weixin_29289821的博客 614

vue双向数据绑定原理

vue双向数据绑定原理

Czc1357618897的博客 7455

飞塔防火墙CVE-2022-40684漏洞复现:手把手教你搭建靶场环境(附调试技巧)

本文详细指导如何搭建Fortinet飞塔防火墙CVE-2022-40684认证绕过漏洞的靶场环境,涵盖虚拟机部署、网络配置、调试模式开启及漏洞原理分析。通过手把手教程,读者可掌握漏洞复现与深度调试技巧,深入理解该认证绕过漏洞的利用与防御。

h6i7j8的博客 695

Vue 双向数据绑定原理

原理 1、vue双向数据绑定原理,又称vue响应式原理,是vue的核心,双向数据绑定是通过数据劫持结合发布者订阅者模式的方式来实现的,通过Object.defineProperty()来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调来渲染视图。也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变 2、vue实现双向数据绑定的核心是Object.defineProperty()方法 3、Object.defineProperty(obj

Huang_DW的博客 9834

看完这篇爽文我终于学会了示波器(一)

示波器基础篇的介绍,希望对你有用,下次分享一下如何测试。

qq_45508321的博客 974

【读代码】TradingAgents:基于多智能体LLM的金融交易框架深度解析

TradingAgents是由Tauric Research团队开源的创新型金融交易框架,其核心思想是通过多智能体协作系统模拟专业交易机构的决策流程。项目采用模块化设计,整合了LLM、实时数据分析、风险控制等组件,实现了从市场分析到交易执行的完整闭环。

kakaZhui的博客 2004

Vue 双向数据绑定的原理

Vue 的双向数据绑定机制基于响应式系统和事件监听。Vue 通过(Vue 2)和Proxy(Vue 3)实现数据的劫持,使得数据变化时能够通知视图更新。通过v-model,Vue 在数据和视图之间建立了双向绑定,在数据变化时更新视图,在视图变化时更新数据。这种机制极大地提高了开发效率,简化了数据和界面同步的复杂度。

ZT_LJ的博客 2122

第51节:cesium 范围查询(含源码+视频)

cesium 范围查询

qq_29384639的博客 1498

vue双向数据绑定的原理解析

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

关注最新技术问题并持续维护更新 4268

Figma 设计稿转前端代码:Cursor 实现 UI 还原的 4 种精准映射方法

揭示 Figma 设计稿转前端代码失效的根本原因在于四层语义未对齐(像素→布局、视觉→样式、交互→行为、意图→架构),提出以语义标注为核心的结构化喂数据方法,详解通过图层命名、Description 字段和 Markdown 上下文锚点实现高精度 React 组件生成,并给出可落地的避坑指南与实测提

weixin_42545292的博客 139

基于Qt C++开发一套大疆农业无人机的AI飞控系统

如果需要补充**多机协同作业代码**、**农田测绘数据导出**、**作业数据统计大屏**或**移动端地面站适配**功能,可以告知具体需求,我会针对性完善。"开启" : "关闭") << "喷洒,流量:" << flowRate << "L/min";emit errorOccurred(QString("SDK初始化失败,错误码:%1").arg((int)ret));report += QString("问题区域数量:%1\n").arg(info.problemAreas.size());

寒寒豆豆软件公司的博客 382

深入解析Vue中的双向数据绑定机制

单向绑定是将模型(Model)的数据绑定到视图(View)上,当模型数据发生变化时,视图会自动更新。而双向绑定在此基础上增加了视图到模型的反馈机制,即视图状态的变化也能自动反映到模型数据上。双向绑定是MVVM(Model-View-ViewModel)架构的核心特性之一。在MVVM中,ViewModel负责将模型和视图关联起来,实现数据的双向流动。以表单输入为例,当用户在输入框中填写信息时,视图的状态发生变化,如果这种变化能实时更新到模型数据,那么就实现了双向绑定。

全栈若城,专注知识分享 6万+

Vue3 - Element Plus上传组件el-upload上传多个文件时,让on-change监听事件仅执行一次并获取最终文件列表方法(开启多选文件并手动上传,拿到文件列表统一循环调用接口上传)

vue3,elementplus,Upload上传,el-upload,文件上传组件,上传组件on-change里执行多次,取消自动上传后change重复执行问题,upload上传多个文件后导致on-change执行多次拿不到最终文件列表,Element-plus的upload组件on-change不断执行怎么办,上传多个文件多次执行调用,上传多个文件时如何只执行一次on-change方法拿到最终的文件列表,vue3elementplus上传组件开启多个上传后导致change方法执行好几次,仅调用一

🏆 前端领域优质创作者 1万+

Vue的双向数据绑定

一、什么是双向数据绑定 数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。 二、vue里面的双向数据绑定 在vue里面使用v-model实现双向数据绑定,代码非常的方便简单 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-wi

CSH_lucky的博客 2369

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

前端开发,Vue的双向数据绑定的原理

Vue的双向数据绑定的原理是利用了Object.defineProperty()这个方法。它可以定义一个属性,对属性的读取和修改都可以进行自定义处理。

杨荧的优快云博客 1689

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Vue3的双向数据绑定原理是什么

Vue3的双向数据绑定原理可以说是Vue框架的灵魂所在。它使得在Vue中,数据的变化能够自动反映到视图中,同时视图的变化也能够同步到数据中。这种双向数据绑定的机制,大大简化了前端开发中的数据处理和更新操作,提高了开发效率和用户体验。

有我更精彩的博客 1819

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Vue双向数据绑定原理

VUE双向数据绑定原理 vue双向数据绑定是通过 数据劫持,并结合 发布-订阅模式的方法来实现的,也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变 核心:关于vue实现双向数据绑定,其核心是Object.defineProperty()方法 介绍一下Object.defineProperty()方法 Object.defineProperty(obj,prop,descriptor)这个语法内有三个参数,分别是obj(要定义其上属性的对象) prop (要定义或

weixin_46734347的博客 4842

andorid view如何附带数据_Vue 双向数据绑定原理分析

关于双向数据绑定当我们在前端开发中采用MV*的模式时,M – model,指的是模型,也就是数据,V – view,指的是视图,也就是页面展现的部分。通常,我们需要编写代码,将从服务器获取的数据进行“渲染”,展现到视图上。每当数据有变更时,我们会再次进行渲染,从而更新视图,使得视图与数据保持一致。也就是:而另一方面,页面也会通过用户的交互,产生状态、数据的变化,这个时候,我们则编写代码,将视图对数...

weixin_39762348的博客 66

Vue -- 双向数据绑定

1. Vue--双向数据绑定 Vue.js是一个MVVM框架, 即数据双向绑定, 即当数据发生变化的时候, 视图也就发生变化, 当视图发生变化的时候,数据也会跟着同步变化。这也算是Vue.js的精髓之处了。 1.1 在表单中使用双向数据绑定 你可以用v-model指令在表单、及元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。尽管有些神奇, 但v-model本质上不过是语法糖。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。 注意:v-model会忽略所有表单元素

天行健 君子以自强不息,地势坤 君子以厚德载物。 3295

VueJS的v-model双向数据绑定

/2.创建model。

m0_63911352的博客 288

vue双向数据绑定的原理

有关双向数据绑定的原理 最近两次面试的时候,被问到了vue中双向数据绑定的原理,因为初学不精,只是使用而没有深入研究,所以答不出来。之后就在网上查找了别人写的博客,学习一下。 下面是博客园一篇博客,以及MDN上讲解Object.defineProperty()方法的地址。 文章链接:vue的双向绑定原理及实现 Mozilla 开发者服务:Object.defineProperty...

境界线上的地平线 3万+

理解vue双向数据绑定(MVVM模型)

什么是MVVM? MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自动传递给 View,即所谓的数据双向绑定。 Vue.js 是一个提供了 MVVM 风格的双向数据绑定的 Javascript 库,专注于View 层。它的核心是 MVVM 中的 VM...

weixin_44209472的博客 2465

Vue前端框架——单向数据绑定与双向数据绑定

单向数据绑定:数据只能从 data 流向页面。双向数据绑定:数据不仅能从 data 流向页面,还能从页面流向 data。双向绑定一般都应用在表单类元素上(如:input、select等)

weixin_45661229的博客 3920
上一篇: React Native搭建开发环境并创建一个示例项目
下一篇: 前端面试题2021及答案
SSWmouse
博客等级 码龄7年 25粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值