Vue3批量异步更新是如何实现

文章目录

  • 一、什么是调度执行
  • 二、如何实现可调度?
  • 三、批量更新 `&` 异步更新
  • 四、`Vue`原理
  • 五、最后

一、什么是调度执行

多次修改数据(例如自身num10次),只进行一次页面渲染(页面只会渲染最后一次num10

指的是响应式数据发生变化出发副作用函数重新执行时,我们有能力去决定副作用函数的执行时机次数方式

来看个例子

const state = reactive({num: 1
})effect(() => {console.log('num', state.num)
})state.num++console.log('end')

img

如果我们想要它按照这个顺序输出呢?

1
end
2

你可能会说,我调换一下代码顺序就好了哇!!!

const state = reactive({num: 1
})effect(() => {console.log('num', state.num)
})console.log('end')state.num++

img

淫才啊!😄 瞬间就解决了问题。不过看起来这不是我们想要最终答案。

我们想要通过实现可调度性来解决这个问题。

二、如何实现可调度?

我们从结果出发来思考如何实现可调度的特性。

const state = reactive({num: 1
})effect(() => {console.log(state.num)
}, {// 注意这里,假如num发生变化的时候执行的是scheduler函数// 那么end将会被先执行,因为我们用setTimeout包裹了一层fnscheduler (fn) {// 异步执行setTimeout(() => {fn()}, 0)}
})state.num++console.log('end')

看到这里也许你已经明白了,我们将通过**scheduler**来自主控制副作用函数的执行时机。

在这之前,执行state.num++之后,console.log(state.num)将会被马上执行,而添加scheduler后,num发生变化后将执行scheduler中的逻辑。

虽然可调度性在Vue中非常重要,但实现这个机制却非常简单。

// 增加options参数
const effect = function (fn, options = {}) {const effectFn = () => {// ....}// ...// 将options参数挂在effectFn上,便于effectFn执行时可以读取到schedulereffectFn.options = options
}
function trigger(target, key) {
// ...effectsToRun.forEach((effectFn) => {// 当指定了scheduler时,将执行scheduler而不是注册的副作用函数effectFnif (effectFn.options.scheduler) {effectFn.options.scheduler(effectFn)} else {effectFn()}})
}

三、批量更新 & 异步更新

来看段诡异的代码,请问num会被执行多少次?100还是101

const state = reactive({num: 1
})effect(() => {console.log('num', state.num)
})let count = 100while (count--) {state.num++
}

img

对于页面渲染来说1101中间的2~100仅仅只是过程,并不是最终的结果,处于性能考虑Vue只会渲染最后一次的101

四、Vue原理

利用可调度性,再加点事件循环的知识,我们就可以做到这件事。

  1. num的每次变化都会导致scheduler的执行,并将注册好的副作用函数存入jobQueue队列,因为Set本身的去重性质,最终只会存在一个fn
  2. 利用Promise微任务的特性,当num被更改100次之后同步代码全部执行结束后,then回调将会被执行,此时num已经是101,而jobQueue中也只有一个fn,所以最终只会打印一次101
const state = reactive({num: 1
})const jobQueue = new Set()
const p = Promise.resolve()
let isFlushing = falseconst flushJob = () => {if (isFlushing) {return}isFlushing = true// 微任务p.then(() => {jobQueue.forEach((job) => job())}).finally(() => {// 结束后充值设置为falseisFlushing = false})
}effect(() => {console.log('num', state.num)
}, {scheduler (fn) {// 每次数据发生变化都往队列中添加副作用函数jobQueue.add(fn)// 并尝试刷新job,但是一个微任务只会在事件循环中执行一次,所以哪怕num变化了100次,最后也只会执行一次副作用函数flushJob()}
})let count = 100while (count--) {state.num++
}

img

五、最后

本人每篇文章都是一字一句码出来,希望对大家有所帮助,多提提意见。顺手来个三连击,点赞👍收藏💖关注✨,一起加油☕

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

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

相关文章

C++ copy()函数详细介绍

copy() 是一个标准库函数,位于 头文件中。它用于将一个容器中的元素复制到另一个容器中,或者将一个范围内的元素复制到另一个范围中。 函数参数介绍 copy( first, last, d_first );first 和 last:表示输入范围的迭代器。 first 指向要复制的…

centos7 安装 java17 安装 idea

删除旧版本的java或者说是自带的,免得干扰 查找java [wanglcentos7 java]$ rpm -qa|grep javajava-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64 javapackages-tools-3.4.1-11.el7.noarch tzdata-java-2020a-1.el7.noarch python-javapackages-3.4.1-11.el7.noarch …

展台设计搭建中6个关键元素

一、哪种风格的会展展台设计更显示设计感 从已有的展台布置局面可以看出,不同展台设计有着不同的标准与选择原则,现有的一系列展台设计标识会随着现代化会展的提升重新进入更新诉求阶段。 二、展台设计一般会有那种可以选择的类别 从出现在展台设计优化阶…

React实现组件扩展机制

在java中,SPI机制是Java中提供的一种服务发现机制。同样,前端也很需要这种机制,这样可以做到组件可插拔,可替换,减少相互冗余。 快速使用 1.扩展点使用 通过使用Extension组件定义扩展点,通过name标记扩展…

2023爱分析·知识库问答市场厂商评估报告:爱数

01 研究范围定义 研究范围: 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成大量不同下游任务的模型。2023年以来,ChatGPT引爆全球大模型市场。国内众多大模型先后公测,众多互联网领军者投身大模型事业,使得大模型…

C++ //练习 3.39 编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。

C Primer(第5版) 练习 3.39 练习 3.39 编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /*******…

每日一道Java面试题:说一说Java中的异常

写在开头 任何一个程序都无法保证100%的正常运行,程序发生故障的场景,我们称之为:异常,在Java中对于异常的处理有一套完善的体系,今天我们就来一起学习一下。老样子,用一段简单的代码开始今天的学习。 我&a…

【CanvasKeyFrames - HTML5 Canvas 图片序列帧播放工具】

前言 一、CanvasKeyFrames 是什么&#xff1f; 用来做canvas动画的工具。 二、使用步骤 效果如图&#xff1a;上下波动的线条 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; 在html中引入&#xff1a; <script src"canvas-keyframes.js"><…

源聚达科技:开一家抖音小店有没有风险

在数字化浪潮的推动下&#xff0c;抖音小店如雨后春笋般涌现&#xff0c;成为众多创业者眼中的香饽饽。然而&#xff0c;“盛名之下&#xff0c;其实难副”&#xff0c;开设一家抖音小店并非只有风光无限&#xff0c;其背后的风险也不容小觑。 首要的风险源自激烈的市场竞争。抖…

力扣之2629.复合函数(reduceRight )

/*** param {Function[]} functions* return {Function}*/ var compose function(functions) {return function(x) {return functions.reduceRight((result, func) > func(result), x);} };/*** const fn compose([x > x 1, x > 2 * x])* fn(4) // 9*/ 说明&#x…

大模型ReAct智能体开发实战

哆啦A梦是很多人都熟悉的角色&#xff0c;包括我自己。 在成长过程中&#xff0c;我常常对他口袋里的许多小玩意感到惊讶&#xff0c;而且他知道何时使用它们。 随着大型语言模型 (LLM) 的发展趋势&#xff0c;你也可以构建一个具有相同行为方式的模型&#xff01; 我们将构建…

DHCP简介

定义 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种用于集中对用户IP地址进行动态管理和配置的技术。即使规模较小的网络&#xff0c;通过DHCP也可以使后续增加网络设备变得简单快捷。 DHCP是在BOOTP&#xff08;BOOTstrap Protoc…

linux 04 进程管理

02.进程管理 ps 在命令行输入ps后按回车键就能查看当前系统中正在运行的进程。 第一. 查看进程ps 进程的状态STAT 进程的周期 fork&#xff0c;产生一个新进程 第二.排序进程表 ps aux --sort -%cpu 降序cpu %cpu 增序cpu 第三.父子关系 ps ef 第四.自定义 五.动态查看…

【Java 数据结构】排序

排序算法 1. 排序的概念及引用1.1 排序的概念1.2 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序2.3.3 快速排序非递归 2.4 归并排…

Pinterest是什么软件?有什么功能?Pinterest怎么做营销?

如今&#xff0c;社媒营销已成为连接品牌与全球消费者的关键桥梁。随着像Instagram、Twitter等海外社交媒体平台的兴起&#xff0c;社媒营销人员和跨境电商面临着无限的机遇。而在这些平台中&#xff0c;有一个平台以其独特的视觉展示方式和高度专注的用户体验脱颖而出——那就…

力扣hot100 无重复字符的最长子串 双指针 滑动窗口 哈希

Problem: 3. 无重复字符的最长子串 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考 Code ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public int lengthOfLongestSubstring(String s){if (s null ||…

HTML+CSS+JS的3D进度条

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTMLCSSJS的3D进度条</title><style>…

Sqoop数据迁移工具

概述 Apache Sqoop&#xff08;SQL-to-Hadoop&#xff09;项目旨在协助RDBMS与Hadoop之间进行高效的大数据交流。用户可以在 Sqoop 的帮助下&#xff0c;轻松地把关系型数据库的数据导入到 Hadoop 与其相关的系统 (如HBase和Hive)中&#xff1b;同时也可以把数据从 Hadoop 系统…

Android应用程序上线到Google Play商店

将Android应用程序上线到Google Play商店涉及多个步骤。以下一般的上线流程&#xff0c;具体的步骤可能会根据开发者的需求和Google Play的更新而有所变化。确保遵循Google Play的规定和最佳实践&#xff0c;以确保应用能够成功上线并为用户提供良好的体验。北京木奇移动技术有…

78SXX系列­——用于各种电视机、收录机、电子仪器、设备的稳压电源电路,输出电流大,内设过热、短路保护电路,无需外接元件

78SXX系列是用于各种电视机、收录机、电子仪器、设备的稳压电源电路。包括78S05、78S06、 78S08、 78S09、 78S10、 78S12、 78S15. 主要特点&#xff1a; ● 极限输出电流:0.2A ● 固定输出电压: 5V、 6V、 8V、9V、10V、 12V、 15V ● 内置短路保护电路 ● 内置热保护电路 ●…