vue数据劫持 ajax,Vue视图更新原理 - 数据劫持,最小量更新和DIFF算法

2023-11-18

什么是数据劫持

加入有一个js文件内容如下:

var obj = {

x: 100,

y: 200,

}

Object.defineProperties(obj, {

x: {

set(){

console.log("You gonna update x, the vision will be changed.")

}

}

})

复制代码

30b885b8f275eec3a2dbcc39642bb27e.png

当node运行这个js文件的时候不会有任何效果呈现。

437df6a693a1f8aacf42cbb4ad857ccf.png

但当在这个文件中加入一个变化的东西:

var obj = {

x: 100,

y: 200,

}

Object.defineProperties(obj,{

x: {

set(){

console.log("You gonna update x, the vision will be changed.")

}

}

})

obj.x ++

复制代码

7e80a689e88bf629488e60d603b12a9a.png

console.log()里的话就会被打印出来。

fae193b15ca3d615fd065dc8d481dc1d.png

基本原理是这个Object.defineProperties()函数能在数据更新的过程中捕获数据.

Object.defineProperties()这个函数是原生js。

最小量更新

写一个组件如下,实验一下Vue是否会在页面某个数据变化时在底层更新页面的其他数据。

cf9be6e0818fa69b4a0b0a81076ebefa.png

452df9cffd2887a023e872ad1c2aecdf.png

c5e8552975580820507492347061be92.png

c1f54c2adaa1ae7afcb50360791820d1.png

手动在后台将下面的数字改成“哈哈”后点击x+1的按钮改变上面的数字,后台的“哈哈”保持不变。

这就是Vue特有的最小量更新算法,也叫DIFF算法。

当改变某个量时,Vue会检索template中的三个东西:

① 单个双打括号中是否有这个量;

② 指令中是否有这个量;

③ methods, computed和watch中是否有这个量。

只要符合以上其中一条,这个量都会得到更新。

关于单个双括号中是否有这个量,由于上图都是单个量在单个双括号内所以不能很好的说明这一点。以下再写一个有联动量的双括号:

d1fc0701e8512a78d54bad2475fbf723.png

804e6abdfe04a59dacd678a977f3531c.png

e77ea288ead8541b5528474d0c0cd203.png

这时点任何一个按钮“哈哈”都会更新为x+y的和。

1e89157f517eac6d0173d19673464b3a.png

下面进一步解释这个最少量更新算法的结算机制:

1bac81b93a75af298f3fd3f13446d840.png

cfad026e28c92ee2c6a060d9763a2bd9.png

aeaf0ef397da0144122f68ca645ed55b.png

cb28305e12bc89e36460e72cff21fb4c.png

f1a062486bca522bc9e6fe5380477916.png

45ab37315ccffcaeddcedaab682663d6.png

以上说明Vue视图更新遵循最小量更新原则,没有变化的视图Vue就不会让该视图所属的元素发生变化。

上面说到当改变某个量时Vue会检索单个双大括号中是否有这个量,在这个过程中Vue会进行求值,如果求得的值和原来的值是一样的,则不会发生更新。

【注意】由于Vue的这一机制,在使用时尽量避免混进对DOM的操作改而操作数据,否则容易触发这一机制导致更新无效。

React中也有DIFF算法,效率比Vue高,因为React没有指令系统,其所有数据都是立即求值而不像Vue会先进行一番数据检索。React的更新原理是将更新的DOM存入虚拟DOM中与旧的DOM进行DIFF再进行最少量更新,Vue则比React多了一步词法分析。

最小量更新的重要角色 - key

在使用v-for指令时常常会与key属性连用,否则某些情况下会出现编辑器报错,一般key属性的属性值为循环的item或者index,属性值为item代表的是每一项循环的item本身,属性值为index则代表的是每一项的顺序。

9f6aaf14f73ab2576aea2646868cbcfb.png

4c49c9c82defc27eb1b658188991aa8b.png

c88562c6de2bd676ef5afc9af5c791e4.png

当涉及视图更新时,有没有key属性以及不同的属性值将会引发截然不同的结果。

没有key属性时更新不会触发beforeDestroy(),即原来的节点没有下树只是节点中的内容更新了。

e2697e24cf3181f95295576d71ec8b04.png

d06557e05ac6f54f0c368c89c58b0165.png

有key属性并且属性值为item时更新则会触发beforeDestroy(),证明“α”的节点下树(消亡)了,新的“”的节点被创建并上树。

79c680dcc6514fe07ef71cca7ef8b102.png

7f0941d4f72b91013403c5540678416b.png

有key属性并且属性值为index时更新又不会触发beforeDestroy()了,即没有节点上下树。

d9fa12680c664647d4121bd1be52b47f.png

9982a08a2d6f5f5b9f0937d7d6a7990c.png

759010b247a146a6bd6b60704ebd7ae9.png

所以当v-for循环涉及子组件循环时,key的属性值最好用item而不是index,否则会导致一些程序误判,当涉及一些AJAX等数据交互时也会阻断了组件与服务器之间的信息交换。使key的属性值为item的好处是能正确触发子组件的生命周期。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue数据劫持 ajax,Vue视图更新原理 - 数据劫持,最小量更新和DIFF算法 的相关文章

  • OpenJDK源码阅读-Oop&Klass

    文章目录 oop klass OBJECT hierarchy metadata hierarchy klass hierarchy oop classDiagram description klass classDiagram descr
  • Android Studio 4.0 gradle-6.1.1-all.zip 下载速率太慢或失败解决办法

    今天在家里电脑上新装了Android Studio 4 0 gradlegradle 6 1 1 all zip 下载速度实在是太慢了 后来尝试在https downloads gradle dn com distributions gra
  • python编程语言的优缺点-python语言的特点(优缺点)总结

    BEGIN 优点 1 简单 设计原则 简单 优雅 明确 易于学习 较少的关键字 结构简单 易于阅读 python代码定义更清晰 易于维护 源代码容易维护 2 广泛的开源库 丰富的第三方库 3 互动模式 支持互动模式 可从终端输入执行代码并得
  • 深入理解java反射机制

    一 java的核心机制 java有两种核心机制 java虚拟机 JavaVirtual Machine 与垃圾收集机制 Garbage collection Java虚拟机 是运行所有Java程序的抽象计算机 是Java语言的运行环境 在其
  • 如何学习大数据

    文章目录 每日一句正能量 前言 一 什么是大数据 二 大数据的应用领域 三 社会对大数据的人才需求 四 大数据的学习路线 后记 每日一句正能量 多数人认为 一旦达到某个目标 人们就会感到身心舒畅 但问题是你可能永远达不到目标 把快乐建立在还
  • 看到了一个 蒙特卡洛方法 随机数得出 圆周率的c++ 源码

    package bt6 import java util Random 看到了一个 蒙特卡洛方法 随机数得出 圆周率的c 源码 复制过来 一个Java版的见笑了 author suifeng public class PITest publ
  • sqlmap过SQLi-LABS靶场 11-20关

    第11关 后面基本都是post注入了 不过我们用的是神器sqlmap 我们先随便输入 然后bp抓包 把抓到的包保存问txt格式 然后在sqlmap 指定他 用 r sqlmap py r C Users Administrator Desk
  • 记录shardingsphere 5.0.0的一个问题

    shardingsphere的一个问题 最近shardingsphere更新了5 0 0版本 加入了很多新特性 所以我在自己的练习项目中想启动配置启动一下 但是并不是那么顺利 升级之后就直接无法启动了 根据错误栈提示是找不到一个名为Mode
  • Android studio 模拟器启动黑屏解决办法附图详细

    Android studio 模拟器启动黑屏解决办法附图详细 问题描述 原因分析 android模拟器在创建时 一般默认设置为热启动 所以每次关闭模拟器时 会提示保存当前运行界面状态 若选择取消 则下一次启动会以最近一次保存的状态启动显示
  • Pycharm安装CV2

    1 win r 然后输入cmd进入中端 安装的指令用 pip install opencv python i http mirrors aliyun com pypi simple trusted host mirrors aliyun c
  • husky hooks 不起作用的解决方法

    问题 在项目实际应用过程中遇到过一次 husky hooks 不生效的问题 这里记录下 问题表现 问题比较直观 通过 huksy install 之后 git commit 时 pre commit 设置的 hooks 不起作用 重新安装
  • 最详细的Vivado安装教程

    V i v a d o 安 装
  • Date类型与字符串的相互转换

    Date时间类型与字符串的相互转换 Test public void date throws ParseException 一 Date时间类型转字符串 1 获取当前时间 Date date new Date 2 设定时间格式 下面两行可以
  • 2017蓝桥杯C++A组题解集合

    总结 蓝桥杯的题目大多数都是暴利或者dfs bfs解出来的 注意往这上面思考 下面是赛题的链接 https wenku baidu com view 951dab772a160b4e767f5acfa1c7aa00b52a9d2d html
  • 程序发生run time error原因及解决方案

    程序发生run time error原因及解决方案 runtime error现象即产生原因 属于运行时错误 当程序运行到一半 程序发生崩溃 1 数组过小 2 除数为零 3 大数组定义在函数内 4 指针越界 5 还有可能是程序抛出了未接收的
  • angular Model 指令

    ng model指令用于绑定应用程序数据到HTML控制器 input select textarea 的值 可以将输入域的值域AngularJS创建的变量绑定 并且支持双向绑定 如下例子 div name div
  • elementUI使用el-upload上传文件写法总结及避坑,上传图片/视频到本地/服务器以及回显+删除

    Element Upload 上传 Element Upload官方文档 el upload 具体细节只看官方文档 本篇主要介绍避坑点和用法总结 注意点以及坑 本地上传想要回显图片视频 使用on success是没办法再在上传后获取到本地文
  • 20个简洁的 JS 代码片段

    20个简洁的 JS 代码片段 1 单行 If Else 语句 这是许多编程语言的共同特征 你可以使用三元运算符用一行代码编写整个语句 而不是在多行上编写 if else 例如 const age 12 let ageGroup LONG F
  • proteus8.9仿真闪退怎么解决?如何找到ProgramData?

    proteus8 9仿真闪退 将C Program Files x86 Labcenter Electronics Proteus 8 Professional 中MODELS文件夹复制到C ProgramData Labcenter El

随机推荐

  • 线性代数---之正交向量

    转载 百度百科 正交向量 编辑 本词条由 科普中国 百科科学词条编写与应用工作项目审核 正交向量 是一个数学术语 指点积为零的两个或多个向量 几何向量的概念在 线性代数中经由抽象化 得到更一般的向量概念 此处向量定义为 向量空间的元素 要注
  • 【计算机视觉

    文章目录 一 检测相关 11篇 1 1 Follow Anything Open set detection tracking and following in real time 1 2 YOLO MS Rethinking Multi
  • 【分治法】中位数问题和Gray码问题——武汉理工大学算法分析与设计课程实验

    i 中位数问题 问题描述 设X 0 n 1 和Y 0 n 1 为两个数组 每个数组中含有n个已排好序的数 找出X和Y的2n个数的中位数 编程任务 利用分治策略试设计一个O log n 时间的算法求出这2n个数的中位数 数据输入 由文件inp
  • sublime text添加install package报错 Package Control There are no packages available for installation

    sublime text在使用插件之前 需要安装Package Control插件 但在安装时报错 There are no packages available for installation 也就是说无法获取安装所需的包 首先确认网络
  • 基于java项目 服务器远程debug开启教程

    首先 在我们的工作中避免不了进行远程调试 我们可以通过远程debug的方式去调试我们的程序代码 通常我们的spring项目打成包的方式有jar 或者war包发布到我们的远程服务器上 我们先介绍第一种jar包方式开启远程debug 打成jar
  • JAVA 面向对象

    第五章 面向对象 面向对象技术利用对现实世界中对象的抽象和对象之间相互关联及相互作用的描述来对现实世界进行模拟 并且使其映射到目标系统中 其以基本对象模型为单位 将对象内部处理细节封装在模型内部 重视对象模块间的接口联系和对象与外部环境间的
  • 关于GRE over IPsec及IPsec over GRE

    GRE over IPsec IPsec over GRE IPSec Over GRE是先ipsec后gre 这种我没用过 GRE Over IPSec 是先gre后ipsec 也就是说ipsec是最后的承载方式 一般常用的就是这种 解决
  • 最详细的Python安装教程

    最详细的Python安装教程 一 进入Python官网首页 下载最新的Python版本 https www python org downloads 选择最新的Python3 10 5 下载64位的版本 二 下载完成后 进行安装 1 双击P
  • 数字图像处理(入门篇)六 图像数据预处理之坐标变化

    目录 1 平移 2 镜像 3 旋转 4 缩放 图像的坐标变换又称为图像的几何计算 常见的基本变换包括 平移 旋转 镜像和缩放等等 1 平移 1 代码 使用OpenCV仿射变换函数 cv2 warpAffine 实现平移操作 import n
  • 前端vue可以左右滚动的切换的tabs tabs选项卡 滑动动画效果 自动宽度

    随着技术的发展 开发的复杂度也越来越高 传统开发方式将一个系统做成了整块应用 经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改 造成牵一发而动全身 通过组件化开发 可以有效实现单独开发 单独维护 而且他们之间可以
  • Feign原理 (图解)

    1 1 简介 Feign远程调用的 Feign远程调用 核心就是通过一系列的封装和处理 将以JAVA注解的方式定义的远程调用API接口 最终转换成HTTP的请求形式 然后将HTTP的请求的响应结果 解码成JAVA Bean 放回给调用者 F
  • namespace命令空间

    目录 1 解决什么问题 2 基本介绍 2 1 定义 2 2 应用场景 3 使用案例 4 资源配额 5 标签 5 1 定义 5 2 pod资源打标签 5 3 查看标签 1 解决什么问题 命令空间类似于C 中的命名空间 当用户数量较多的集群 才
  • 使用docker搭建jupyter notebook/jupyterlab

    说明 由于官方镜像实在是不怎么好用 所以我自己做了一个优化过的jupyter notebook的镜像 notebook hub 使用我这个镜像搭建容器非常简单 下面就基于这个notebook hub来进行搭建 关于notebook hub
  • hive 报system:java.io.tmpdir错误解决

    Exception in thread main java lang IllegalArgumentException java net URISyntaxException Relative path in absolute URI sy
  • 2. IDEA + maven + protobuf配置(on mac)

    1 絮絮叨叨 都说懒惰是人类进步的源泉 有时候想想还真就那么回事 学习了如何使用protoc命令编译 重度依赖IDEA且已经习惯了maven的我 就在想是否能在IDEA中一键编译 proto文件 2 vscode配置protobuf编辑环境
  • pyecharts实现电影数据分析可视化

    根据电影数据 使用pyecharts进行可视化分析 数据介绍 import pandas as pd data pd read csv 电影 csv data head 前5行数据如下 需要安装的python库 pip install pa
  • 2.晶晨A311D-编译Ubuntu/Debian固件

    上面是我的微信和QQ群 欢迎新朋友的加入 参考 https docs khadas com zh cn vim3 FenixScript html 编译环境 我重新安装了ubuntu20 安装软件包 配置环境 sudo apt get in
  • 【数据结构】排序(直接插入、折半插入、希尔、冒泡、快速、直接选择、堆、归并、基数排序)

    一 什么是排序 排序 将一组杂乱无章的数据按一定规律顺次排列起来 即 将无序序列的数据节点包含多个数据域 那么排序往往是针对其中某个域而言 二 排序方法的分类 1 按数据存储介质可分为 内部排序 数据量不大 数据在内存 无需内外存交换数据
  • SQL抽取数据脚本

    sp OutputData IF EXISTS SELECT 1 FROM sys objects o WHERE object id object id N sp OutputData AND OBJECTPROPERTY object
  • vue数据劫持 ajax,Vue视图更新原理 - 数据劫持,最小量更新和DIFF算法

    什么是数据劫持 加入有一个js文件内容如下 var obj x 100 y 200 Object defineProperties obj x set console log You gonna update x the vision wi