2023/3/10 Vue核心知识的学习- Vue - v-model双向绑定原理

news2024/11/28 16:34:45

https://www.jianshu.com/p/2682b5a26869

定义:vue中双向绑定就是指v-model指令,可以绑定一个响应式数据到视图,同时视图中变化能同步改变该值。

在这里插入图片描述
通过Object.defineProperty( )对属性设置一个set函数,当数据改变了就会来触发这个函数,所以我们只要将一些需要更新的方法放在这里面就可以实现data更新view了。
在这里插入图片描述
vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。

我们已经知道实现数据的双向绑定,首先要对数据进行劫持监听,所以我们需要设置一个监听器Observer,用来监听所有属性。

如果属性发上变化了,就需要告诉订阅者Watcher看是否需要更新。

因为订阅者是有很多个,所以我们需要有一个消息订阅器Dep来专门收集这些订阅者,然后在监听器Observer和订阅者Watcher之间进行统一管理的。

接着,我们还需要有一个指令解析器Compile,对每个节点元素进行扫描和解析,将相关指令(如v-model,v-on)对应初始化成一个订阅者Watcher,并替换模板数据或者绑定相应的函数,此时当订阅者Watcher接收到相应属性的变化,就会执行对应的更新函数,从而更新视图。

因此接下去我们执行以下3个步骤,实现数据的双向绑定:

  1. 实现一个监听器Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者。
  2. 实现一个订阅者Watcher,每一个Watcher都绑定一个更新函数,watcher可以收到属性的变化通知并执行相应的函数,从而更新视图。
  3. 实现一个解析器Compile,可以扫描和解析每个节点的相关指令(v-model,v-on等指令),如果节点存在v-model,v-on等指令,则解析器Compile初始化这类节点的模板数据,使之可以显示在视图上,然后初始化相应的订阅者(Watcher)。

通过以上问题 - 我们引出 Vue监测数据的原理_对象:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="v-school">
    学校名称:{{ name }} <br/>
    学校地址:{{ address }}
</div>
<script type="text/javascript">
    let vm = new Vue({
        el: '#v-school',
        data: {
            name: '北京大学',
            address: '北京'
        }
    })
</script>
</body>
</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>
<script type="text/javascript">

    let data = {
        name: '尚硅谷',
        address: '北京',
    }

    // 创建一个监视的实例对象,用于监视data中属性的变化
    const obs = new Observer(data)
    console.log(obs)

    // 准备一个vm实例对象
    let vm = {}
    vm._data = data = obs

    function Observer(obj) {
        // 汇总对象中所有的属性
        const keys = Object.keys(obj)
        // 遍历
        keys.forEach((k) => {
            Object.defineProperty(this, k, {
                get() {
                    return obj[k]
                },
                set(val) {
                    console.log('${k}被改了,我要去解析模板,生成虚拟DOM...我要开始忙了')
                    obj[k] = val
                }
            })
        })
    }

</script>
</body>
</html>

在这里插入图片描述
本次书写的代码为简化版,Vue更完善的点有:

如果要修改_data中的name,完整写法为 vm._data.name = ‘atguigu’ ,还可以直接简写为 vm.name = ‘atguigu’,因为Vue做了数据代理

当对象中还有对象时,Vue也能做到有为其服务的getter和setter。Vue里面写了递归,有多少层就能写到多少层,直到那个东西不再是对象为止,对象在数组中也是如此。

Vue监测数据的原理,就是靠setter。

只要修改数据,Vue就会重新解析模板,生成虚拟DOM。

https://blog.csdn.net/zs18753479279/article/details/128553178

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

索引设计的一些小技巧(上)

文章目录 主键索引为频繁查询的字段建立索引避免为"大字段"建立索引选择区分度大的列作为索引尽量为ORDER BY 和 GROUP BY 后面的字段建立索引不要在条件中使用函数不要建立太多的索引频繁增删改的字段不要建立索引索引失效的常见场景主键索引 大家在设计主键的时候…

数据安全—数据完整性校验

1、数据安全保障三要素即 保密性 完整性、可用性机密性&#xff1a;要求数据不被他人轻易获取&#xff0c;需要进行数据加密。完整性&#xff1a;要求数据不被他人随意修改&#xff0c;需要进行签名技术可用性&#xff1a;要求服务不被他人恶意攻击&#xff0c;需要进行数据校验…

别再说前端导出excel麻烦了(xlsx插件用法)

如果是为了解决el-teable的固定列导出问题&#xff0c;直接移动至文章末 本文使用的插件按照指令&#xff08;第一个为一起按照&#xff0c;下面的是独立按照&#xff09; npm install --save xlsx file-saver或 npm install --save xlsx npm install --save file-saver表格…

【Thingsboard+ChirpStack+LoRaWAN 网关+LoRa节点】通讯过程

这里写目录标题 4.通讯流程图:5.thingsboard 集成 chirpstack 上下行通讯5.1上行消息:5.2下行信息:5.3 上行数据分析5.4 下行数据分析6.thingsboard中设备管理实现:lora节点、网关、lora server、以及物联网平台四部分的数据通讯 实验结果: 描述:在thingsboard中修改某个…

SpringBoot【基础篇】---- 基础配置

SpringBoot【基础篇】---- 基础配置1. 属性配置2. 配置文件分类3. yaml 文件4. yaml 数据读取1. 读取单一数据2. 读取全部数据3. 读取对象数据yaml 文件中的数据引用1. 属性配置 SpringBoot 通过配置文件 application.properties 就可以修改默认的配置&#xff0c;那咱们就先找…

【K哥爬虫普法】字节前高管,离职后入侵今日头条数据库,是阴谋、还是利诱?

案情介绍 2016年至2017年间&#xff0c;张洪禹、宋某、侯明强作为被告单位上海晟品网络科技有限公司主管人员&#xff0c;在上海市共谋采用技术手段抓取北京字节跳动网络技术有限公司&#xff08;办公地点位于本市海淀区北三环西路43号中航广场&#xff09;服务器中存储的视频数…

23模式--代理模式

本篇主要聊一些23中模型中的代理模式&#xff1a; 看一下百度百科的解释&#xff1a; 代理模式的定义&#xff1a;为其他对象提供一种代理以控制对这个对象的访问。在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目…

Python连接MySQL实现增删改查详细教程

文章目录前言一、环境准备二、操作步骤1.安装Python依赖库2.创建测试数据表3. 编写操作数据库核心类4. 测试数据添加5. 测试数据删除6. 测试数据更新7. 测试数据查询三、完整代码总结前言 Python语言经过了很多年的发展&#xff0c;生态非常丰富&#xff0c;热度只增不减&…

微搭问搭001-如何清空表单的数据

韩老师&#xff0c;我点关闭按钮后&#xff0c;弹窗从新打开&#xff0c;里面的数据还在&#xff0c;这个可以从新打开清除不&#xff1f; 点关闭的时候清掉 就是清楚不掉也&#xff1f;咋清掉 清掉表单内容有属性可以做到&#xff1f; $page.widgets.id**.value “” 就可以实…

HCIP-5.4OSPF路由聚合、缺省路由

1、路由聚合 OSPF 是一种链路状态路由协议&#xff0c;因此 OSPF路由器不传输路由&#xff0c;而是传输链路状态信息。因此&#xff0c;OSPF 路由通过汇总 LSA 来控制链路状态信息的传输&#xff0c;从而减小 LSDB 数据库的大小&#xff0c;进而控制路由的汇总。 由于OSPF路由…

Object对象键值的输出循序到底如何排列的?

1.日常摸鱼看八股 今天又是复习八股文的一天&#xff0c;发现还是彻底懂得原理才好和面试官吹牛批呀。 接着来看看我chat大宝贝的回答&#xff1a; 在现代浏览器中&#xff0c;Object 对象的键值输出循序是比较稳定的&#xff0c;通常是按照如下顺序输出&#xff1a; 所有的数…

打怪升级之如何发送HEX进制的数据出去

Hex数据老大难 不少人都困扰于如何将电脑中读取到的string类型的数据变成整形发送出去。一半来说&#xff0c;不论你调用的通信方式是串口的还是网络的&#xff0c;亦或是PCIE的&#xff0c;其在电脑端的实际情况都是以系统API的形式呈现的。而系统API函数提供的接口&#xff…

项目实战典型案例23——-注册上nacos上的部分服务总是出现频繁掉线的情况

注册上nacos上的部分服务总是出现频繁掉线的情况一&#xff1a;背景介绍二&#xff1a;思路&方案解决问题过程涉及到的知识nacos服务注册和服务发现一&#xff1a;背景介绍 spring cloud项目通过nacos作为服务中心和配置中心&#xff0c;出现的问题是其中几个服务总是出现…

【电子通识】案例:从YS-CH341T USB转IIC和UART模块使用学习如何找资料

最近在调一个充电芯片&#xff0c;要用到IIC与充电芯片通信来读取和写入充电芯片寄存器&#xff0c;控制充电芯片的各种参数。从以前老员工那里捡到一个这样的模块&#xff0c;模块背面写了YS-CH341T。看着有IIC通信的样子&#xff0c;所以先在网上找一下资料。首先先在网上找到…

npm安装依赖包:405 Method Not Allowed...

运用npm安装依赖包时报错&#xff0c;错误如下。 解决思路&#xff1a; 关注到错误信息上写明了 Method Not Allowed&#xff0c;其后注明了 GET请求以及一个url&#xff0c;说明极有可能是不允许向这个路由发送GET请求&#xff1b; 在浏览器中尝试打开这个地址&#xff0c;结…

在分析了共50亿美元的加密融资之后,我们发现了这些

对加密市场嗅觉敏锐的玩家来说&#xff0c;市场中项目融资是不得不关注的选项&#xff0c;不少优质项目拿到了巨额融资之后&#xff0c;被大家所关注&#xff0c;在20-21年期间&#xff0c;行业内也出现了不少一级机构&#xff0c;布局早期项目&#xff0c;获取时代红利已经成为…

圆桌(满足客人空座需求,合理安排客人入座圆桌,准备最少的椅子)

CSDN周赛第30期第四题算法解析。 (本文获得CSDN质量评分【91】)【学习的细节是欢悦的历程】Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单…… 地址&#xff1a;https://lq…

什么是业务运营?关键组成部分有哪些?

企业领导者使用收入运营和智能软件等技术来分析买家的不同接触点。这些见解决定了客户互动的成败&#xff0c;从而改善了业务运营&#xff0c;从而带来了成功。 什么是业务运营&#xff1f; 业务运营包括企业为保持盈利而执行的一系列日常任务。虽然这些任务可能因业务类型或行…

主辅助服务市场出清模型研究【旋转备用】(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

【已解决】Python的坑:os.system()运行带有空格的长路径和双引号参数有bug

在Python代码里运行DOS命令&#xff0c;可以使用os库的os.system()函数。其用法很简单&#xff0c;需要注意的是os.system不会返回输出的结果赋予一个变量。今天我发现了一个bug&#xff1a;当DOS命令行带有双引号路径、双引号参数时&#xff0c;os.system()运行的结果总是显示…