vue 双向数据绑定

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

  _init(options) {
    this.$options = options
    this.$el = document.querySelector(options.el)
    this.$data = options.data
    this.$methods = options.methods

    this._watchers = {}
    this._proxy(this, '$data') //this为vue实例
    this._observer(this.$data)
    this._complie(this.$el)
  }
  //代理
  _proxy(vm, strKey) {
    Object.keys(vm[strKey]).map((key) => {
      Object.defineProperty(vm, key, {
        enumerable: true,
        configurable: true,
        get() {
          console.log(vm[strKey][key])
          return vm[strKey][key]
        },
        set(val) {
          console.log(vm[strKey][key], val)
          vm[strKey][key] = val
        }
      })
    })
  }
  //劫持
  _observer(obj, objKey) {
    for (const key in obj) {
      let value
      if (obj.hasOwnProperty(key)) {
        let watchers
        if(objKey) {
          watchers = this._watchers[objKey][key] = []
        } else {
          watchers = this._watchers[key] = []
        }

        value = obj[key]

        if(typeof value === 'object') {
          this._observer(value, key);
        }
        
        Object.defineProperty(obj, key, {
          enumerable: true,
          configurable: true,
          get() {
            console.log(`获取${value}`)
            return value
          },
          set(newVal) {
            console.log(`更新${value}`)
            if (value !== newVal) {
              value = newVal;
              //通知watcher
              watchers.forEach(function (item) {
                item.update();
              })
            }
          }
        })
      }
    }
  }
  //解析指令
  _complie(root) {
    let nodes = root.children

    for(let i = 0, l = nodes.length; i < l; i++) {
      let childNodes = nodes[i]
      if(childNodes.length) {
        this._complie(childNodes)
      }

      if(childNodes.hasAttribute('v-click')) {
        let attrVal = childNodes.getAttribute('v-click')
        childNodes.onclick = getExpArr(this.$methods, attrVal).bind(this)
      }

      if(childNodes.hasAttribute('v-model') && (childNodes.tagName == 'INPUT' || childNodes.tagName == 'TEXTAREA')) {
        let attrVal = childNodes.getAttribute('v-model')
        childNodes.addEventListener('input',(() => {
          getExpArr(this._watchers, attrVal).push(new Watcher(
            'input',
            childNodes,
            this,
            attrVal,
            'value'
          ))
          return () => {
            getExpArr(this, attrVal) = childNodes.value
          }
        })())
      }

      if(childNodes.hasAttribute('v-text')) {
        let attrVal = childNodes.getAttribute('v-text')
        getExpArr(this._watchers, attrVal).push(new Watcher(
          'text',
          childNodes,
          this,
          attrVal,
          'innerHTML'
        ))
      }
    }
  }
}
//将obj['a.b']变为obj['a']['b']
function getExpArr(obj, attrVal) {
  return attrVal.split('.').reduce((pre, cur) => {
    return pre[cur]
  }, obj)
}

class Watcher {
  constructor(name, el, vm, expression, attr) {
    this.name = name;         //指令名称,例如文本节点,该值设为"text"
    this.el = el;             //指令对应的DOM元素
    this.vm = vm;             //指令所属myVue实例
    this.expression = expression;           //指令对应的值,本例如"number"
    this.attr = attr;         //绑定的属性值,本例为"innerHTML"

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

相关推荐

Unity集成抖音小游戏:从IL2CPP配置到SDK接入全流程解析

本文详细解析了使用Unity开发抖音小游戏的完整流程。从关键的IL2CPP编译后端配置、PlayerSettings设置,到StarkSDK的接入与资源优化(如AutoStreaming),再到激励视频广告、录屏分享等核心功能的代码实现,提供了从环境准备到打包上传的全方位实战指南,帮助开发者高效完成技术适配。

weixin_27943395的博客 691

你知道this.$options吗?(Vue)

我们在Vue项目中会有很多情况下需要用到this.$options,所以接下来我们介绍几个场景会用到$options,我们想第一个问题当我们在template经常使用filter,那么你可以直接在methods里边用过滤器吗?我们在表单输入一般可不可以直接清空啊回到起点,我们在一个别人已经写的代码的复杂组件中,他们的功能在最后没有重置数据的初始值那么我们自己新加的功能需要用数据怎么初始值呢?。。。

2201_75705263的博客 2568

四旋翼无人机数学模型推导

本周开始进行四旋翼无人机的学习工作,首先来进行四旋翼无人机的数学模型推导工作。。 四旋翼动力学数学模型 坐标变换 介绍四旋翼数学模型之前,首先引入坐标变换的概念,定义两个坐标系惯性坐标系{E},以及机体坐标系{B},惯性坐标系就相当于在地面建立的、静止不动的坐标系,也是我们操纵无人机所在的空间,而机体坐标系是建立于四旋翼机体之上,随着四旋翼姿态变换而变化,所以建立一种地面上的惯性坐标系与四旋翼机体坐标系之间的转换关系,就有这个必要。 对于惯性坐标系{E},以及机体坐标系{B},它们之间的转换关系

BiuBiuSun的博客 1万+

vue双向数据绑定原理

vue双向数据绑定原理

Czc1357618897的博客 7455

大华事件检测智能服务器,大华股份:高速公路智能事件检测 解决方案

1方案背景随着我国基础设施建设的飞速发展,公路尤其是高速公路的总里程数年年攀升。交通运输部统计数据显示,截止2017年底全国公路总里程477.35万公里,其中高速公路13.65万公里,位居世界第一。高速公路的运营和管理作为全国交通管理的重要组成部分日益受到严峻挑战,交通拥堵和事故频发已成为高速公路上非常突出的问题。抛洒物、行人、车辆不规则行驶等事件是导致以上结果的重要原因。基于视频分析的高速公路智...

weixin_39523887的博客 1822

别再模拟IIC了!用STM32F103C8T6的硬件IIC驱动AT24C64,CubeMX配置+避坑指南

本文详细介绍了如何使用STM32F103C8T6的硬件IIC驱动AT24C64 EEPROM,通过CubeMX配置和HAL库函数解析,提供从模拟IIC到硬件IIC的完整解决方案。内容包括硬件IIC与模拟IIC的核心差异、CubeMX工程配置详解、HAL库驱动实战以及典型问题诊断与优化,帮助开发者构建更稳定高效的存储系统。

weixin_27038245的博客 188

Vue 双向数据绑定原理

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

Huang_DW的博客 9834

Unity3D Pico VR 手势交互实战:基于MRTK3实现抓握与射线控制

本文针对Pico VR原生手势交互功能不足的问题,提供了基于MRTK3实现高级手势交互的实战解决方案。通过将MRTK3成熟的交互框架与Pico的手势追踪能力相结合,详细讲解了从环境配置、SDK导入、核心适配到真机调试的全流程,帮助开发者高效实现抓握与射线控制等复杂交互,有效提升Pico VR应用的开发效率与体验。

weixin_29011667的博客 391

Vue 双向数据绑定的原理

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

ZT_LJ的博客 2122

S7-1200g2运动控制实战:从轴组配置到程序调试

本文详细介绍了S7-1200g2运动控制功能的实战应用,从轴组配置到程序调试的全流程。通过TIA Portal中的工艺对象配置,实现单轴、同步轴组等运动控制模型,并分享常见问题排查与性能优化经验,帮助工程师快速掌握中小型自动化设备的运动控制技术。

weixin_28698059的博客 589

PCL 动态半径滤波【2025最新版】

使用PCL实现的2022年最新SCI论文——【Design of Dust-Filtering Algorithms for LiDAR Sensors Using Intensity and Range Information in Off-Road Vehicles】 一文中提出用于自动驾驶点云剔除粉尘、雨雪等影响因素导致的噪声点滤波算法。

点云侠的博客 1473

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

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

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

(01)ORB-SLAM2源码无死角解析-(38) EPnP 算法原理详解→理论基础二:分情况求得beta初始解

讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下(本文内容来自计算机视觉life ORB-SLAM2 课程课件): (01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/123092196 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}

江南才尽江南山,年少无知年少狂! 1024

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

杨荧的优快云博客 1689

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

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

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

有我更精彩的博客 1819

Vue双向数据绑定原理

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

weixin_46734347的博客 4842

Vue -- 双向数据绑定

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

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

vue双向数据绑定的原理

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

境界线上的地平线 3万+

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

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

weixin_39762348的博客 66

VueJS的v-model双向数据绑定

/2.创建model。

m0_63911352的博客 288

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

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

weixin_44209472的博客 2465

vue的双向数据绑定

对比点Vue2 (Vue3 (Proxy拦截范围仅限属性读写支持读写、删除、in、遍历等所有操作新增/删除属性不能监听,需Vue.setVue.delete原生支持数组监听只能通过重写方法,不能拦截下标修改可直接监听下标修改嵌套对象初始化时递归遍历,性能差访问时懒代理,性能好Map/Set不支持支持性能初始化慢(深度递归)初始化快(按需代理)

weixin_42339193的博客 1119
上一篇: 变量提升
下一篇: react-router组件
Running_FE
博客等级 码龄9年 14粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值