vue的双向数据绑定

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

  _init(options) {
      //options包括实例vue传入的结构体
    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.keyd获取对象自身可枚举的所有属性名(不包括原型中的属性),返回数组(数组中包含该对象的所有属性名)
      // 遍历对象,对其属性值进行劫持
      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)
      console.log(this.el,'this.attr',this.el[this.attr])
    this.el[this.attr] = this.name === 'text' ? JSON.stringify(val) : val
  }
}
OpenClaw 最强技能 self-improving-agent 详解:让 AI 从错误中自主学习 self-improving-agent 是 OpenClaw 生态中最受欢迎的技能插件,下载量突破 268k。它能让 AI 记住犯过的错误和解决方案,实现持续自我改进。本文深入讲解其工作原理、安装配置和实战案例。测试数据显示:部署流程时间从 15 分钟降到 2 分钟(87%↓),API 调试时间从 2 小时降到 20 分钟,数据库查询编写时间减少 90%。文章包含完整架构图、配置文件示例、3 个详细实战案例和性能测试数据,适合开发者、运维和数据分析师使用。 阅读详情

相关推荐

用 dism 合并与删除 wim 映像

一、合并 假设 installA.wim 有 3 个映像,installB.wim 有 1 个映像。 1、全部合并 将 installA.wim 中的 3 个卷映像合并到 installB.wim 中,这样 installB.wim 中的卷映像增加到 4 个。 dism/export-image/sourceimagefile:d:\installA.wim/sourceindex:1/destinationimagefile:d:\installB.wim dism/export-image/source

KefanWon的博客 5200

vue数据双向绑定

Vue.js 是一个 MVVM 框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化。这也算是 Vue.js 的精髓之处了。值得注意的是,我们所说的数据双向绑定,一定是对于 UI 控件来说的,非 UI 控件不会涉及到数据双向绑定。单向数据绑定是使用状态管理工具的前提。如果我们使用 vuex,那么数据流也是单项的,这时就会和双向数据绑定有冲突。

daimenglaoshi的博客 7931

用LightRAG+Ollama搭建本地知识库:从文档上传到智能问答的完整流程

本文详细介绍了如何利用LightRAG与Ollama构建企业级本地知识库,涵盖从文档预处理到智能问答的完整流程。通过实战案例展示,该方案能高效处理海量文档,实现语义搜索与知识图谱关联分析,显著提升信息检索效率。特别适合金融、医疗等领域的技术团队快速搭建智能知识管理系统。

weixin_42535461的博客 208

vue---双向绑定

vue 中的双向绑定是语法糖。vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调来渲染视图。数据和视图同步改变。

maidu_xbd的博客 6770

星光、黑光、全彩夜视摄像头技术解析与实战选型指南

本文深入解析了星光、黑光、全彩与红外等主流夜视摄像头技术的工作原理与核心差异。针对不同监控场景与预算,提供了实战选型指南,帮助用户在安防项目中做出明智决策,实现夜间监控效果最大化。

weixin_29179311的博客 348

【Linux内核】Linux内核裁剪完全指南:从理论到实战的系统优化

在嵌入式设备、专用服务器和物联网系统日益普及的今天,如何让Linux系统在资源受限的环境中高效运行成为开发者必须面对的问题。Linux内核裁剪正是解决这一问题的关键技术,它通过移除不必要的内核组件,打造出更精简、更安全、更高效的自定义操作系统。本文将系统全面地介绍Linux内核裁剪的完整流程和实用技巧,帮助您掌握这一核心技能。Linux内核裁剪是一项结合技术知识与实践经验的系统工程。明确需求:裁剪前必须清晰了解目标系统的硬件配置和功能需求。循序渐进:采取小步修改、反复测试的策略,避免一次性大幅修改。

撬动未来的支点的专栏 1390

浅谈vue双向绑定的原理

一、什么是双向绑定 我们先从单向绑定切入 单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新 双向绑定就很容易联想到了,在单向绑定的基础上,用户更新了View,Model的数据也自动被更新了,这种情况就是双向绑定 举个栗子 当用户填写表单时,View的状态就被更新了,如果此时可以自动更新Model的状态,那就相当于我们把Model和View做了双向绑定 关系图如下 二、双向绑定的原理是什么 我们都知道 Vue 是数

u010208165的博客 3972

Arduino程序设计(八)LCD显示实验

本文主要介绍温度/温湿度传感器的LCD显示实验,分别是:1、LM35采集环境温度LCD显示;2、DS18B20采集环境温度LCD显示;3、DHT11采集环境温湿度LCD显示。(1)LM35介绍LM35特性特性说明基本功能LM35作为常用的温度传感器,可以检测周围的温度工作原理利用感温材料,通过内部电路将温度值转化为对应的电压信号工作电压4~30V,常用5V供电温度测量测量范围0~100℃ ,误差 ±0.5℃输出信号线性模拟信号输出,LM35输出电压和摄氏温度程线性关系。

Alice的博客 6711

Vue 核心之数据双向绑定

0 到 1 掌握:Vue 核心之数据双向绑定

qq_35430000的博客 2774

Qt c++ llama.cpp 运行 LLaMA-3-8B 中文对话机器人(多模态输入)

助手:

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

Spring Boot 调用豆包大模型如何开启联网搜索?

场景推荐方案有权限创建 Bot + 需强集成✅ 使用bot-xxxx无 Bot 权限 / 追求通用性✅ 自行集成搜索引擎 + 普通豆包模型仅需基础对话❌ 无需考虑联网豆包大模型确实支持联网搜索,但前提是:你用的是“智能体 Bot”,且它被配置了“网页搜索”插件,并调用正确的 API 端点。希望本文能帮你少走弯路,快速构建出真正“知天下事”的智能助手!

lpfasd123的博客 1124

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

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

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

RK平台内核“大瘦身”:从4GB到500MB的蜕变之旅

摘要:本文详细介绍了RK平台内核裁剪的完整流程与技术要点。通过对RK3568/RK3588等SoC平台的分析,探讨了从初始4GB内核精简至500MB的具体方法。文章系统阐述了前期硬件环境搭建、软件工具准备、SDK源码获取等准备工作,深入解析了内核模块组成及可裁剪部分,并提供了图形化配置界面的详细操作指南。同时,对编译烧录过程和常见问题解决方案进行了说明,强调了备份和谨慎选择裁剪项的重要性。最后展望了内核裁剪技术在物联网和边缘计算等领域的应用前景,为开发者提供了实用的内核优化参考方案。(148字)

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 443

vue双向数据绑定原理

vue双向数据绑定原理

Czc1357618897的博客 7455

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Vue 双向数据绑定原理

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

Huang_DW的博客 9834

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Vue 双向数据绑定的原理

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

ZT_LJ的博客 2122

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

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

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

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

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

有我更精彩的博客 1819

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

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

杨荧的优快云博客 1689

Vue双向数据绑定原理

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

weixin_46734347的博客 4842

VueJS的v-model双向数据绑定

/2.创建model。

m0_63911352的博客 288

Vue -- 双向数据绑定

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

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

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

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

weixin_39762348的博客 66

vue双向数据绑定的原理

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

境界线上的地平线 3万+
上一篇: vue引入sass、less
下一篇: slice、splice、split
Running_FE
博客等级 码龄9年 14粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值