当前位置: 首页 > news >正文

Vue.js---避免无限递归循环 调度执行

4.4 避免无限递归循环

什么情况下会无限递归?

01 const data = { foo: 1 }
02 const obj = new Proxy(data, { /*...*/ })
03
04 effect(() => obj.foo++)

例如这种情况,它会反复设置添加一直到栈溢出

首先读取obj.foo 的值,这会触发 track 操作,将当前副作用函数收集到“桶”中,接着将其加 1 后再赋值给 obj.foo,此时会触发 trigger 操作,即把“桶”中的副作用函数取出并执行。但问题是该副作用函数正在执行中,还没有执行完毕,就要开始下一次的执行。这样会导致无限递归地调用自己,于是就产生了栈溢出。

如何解决?

因为读取和设置操作是在同一个副作用函数内进行的。如果 trigger 触发执行的副作用函数与当前正在执行的副作用函数相同,则不触发执行。

        // 开始执行const effectsToRun = new Set(effects);effects && effects.forEach(effectFn => {if(activeEffect !== effectFn){effectsToRun.add(effectFn);}});

4.5 调度执行

什么是可调度性:当trigger动作触发副作用函数重新执行时,有能力决定副作用函数执行的时机、次数以及方式。

01 const data = { foo: 1 }
02 const obj = new Proxy(data, { /* ... */ })
03
04 effect(() => {
05   console.log(obj.foo)
06 })
07
08 obj.foo++
09
10 console.log('结束了')

这一段代码输出:

1
2
'结束了'

假如现在需求有变,我们想要它输出:

1
'结束了'
2

这时候我们想要一种可以不改变代码的位置,就可以实现这种效果的方式---->调度执行

我们可以为 effect 函数设计一个选项参数options,允许用户指定调度器:

  function effect (fn , options = {}) {const effectFn = () => {// 调用clearup函数完成清除工作clearUp(effectFn);activeEffect = effectFn; // 在调用副作用函数之前将副作用函数压入栈中effectStack.push(effectFn);fn();// 执行完之后抛出,把activeEffect还原成原来的值effectStack.pop();activeEffect = effectStack[effectStack.length - 1];}// 将options挂在到fn上effectFn.options = options;// deps用来存储所有与该副作用函数相关联的依赖集合effectFn.deps = [];// 执行副作用函数effectFn();}

trigger函数当中,在副作用函数执行之前,根据调度内容进行调度

// 触发变化:处理调度逻辑function trigger(target, key, newVal) {const depsMap = bucket.get(target);if (!depsMap) {return;}const effects = depsMap.get(key);// 开始执行const effectsToRun = new Set(effects);effectsToRun.forEach(effectFn =>{if(effectFn.options.scheduler){effectFn.options.scheduler(effectFn);}else {effectFn();}});// effects && effects.forEach(fn => fn()); // 只触发与键相关的副作用函数}

连续多次修改只进行最后一次的更新:

    // 连续执行同一代码,只饭后最后一次计算的结果// 定义一个任务集合set:可以进行去重操作const jobQueue = new Set();// 使用promise.resolve()创建一个promise实例:将一个任务添加到微任务队列当中const p = Promise.resolve();// 开始刷新队列let isFlushing = false;function flushJob(){// 如果队列正在被刷新->returnif(isFlushing){return;}// 没有刷新,进行刷新操作isFlushing = true;p.then(() => {jobQueue.forEach(job => job());}).finally(() => {// 结束后重置isFlushing = false;})}effect(() => {console.log(obj.foo);} , {scheduler(fn){jobQueue.add(fn);//调用flushJob刷新队列flushJob();}})obj.foo++;obj.foo++;

目前的响应代码:

<script setup>let activeEffect;// effect栈const effectStack = [];function effect (fn , options = {}) {const effectFn = () => {// 调用clearup函数完成清除工作clearUp(effectFn);activeEffect = effectFn; // 在调用副作用函数之前将副作用函数压入栈中effectStack.push(effectFn);fn();// 执行完之后抛出,把activeEffect还原成原来的值effectStack.pop();activeEffect = effectStack[effectStack.length - 1];}// 将options挂在到fn上effectFn.options = options;// deps用来存储所有与该副作用函数相关联的依赖集合effectFn.deps = [];// 执行副作用函数effectFn();}const bucket = new WeakMap();const data = { foo : 1 }; // 确保所有属性都已定义const obj = new Proxy(data, {get(target, key){track(target , key);return target[key];},set(target, key, newVal){target[key] = newVal;trigger(target , key , newVal);}});// 追踪变化function track(target , key){if(!activeEffect){return;}// 根据tartget取来的depsMap,它是一个map类型let depsMap = bucket.get(target);// 如果不存在if(!depsMap){// 创建一个bucket.set(target, (depsMap = new Map()));}// 根据key取来的deps,它是一个set类型let deps = depsMap.get(key);// 如果不存在if(!deps){// 创建一个depsMap.set(key, (deps = new Set()));}deps.add(activeEffect); // 添加当前活跃的副作用函数activeEffect.deps.push(deps);}
// 触发变化:处理调度逻辑function trigger(target, key, newVal) {const depsMap = bucket.get(target);if (!depsMap) {return;}const effects = depsMap.get(key);// 开始执行const effectsToRun = new Set(effects);effects && effects.forEach(effectFn => {if(activeEffect !== effectFn){effectsToRun.add(effectFn);}});effectsToRun.forEach(effectFn =>{if(effectFn.options.scheduler){effectFn.options.scheduler(effectFn);}else {effectFn();}});// effects && effects.forEach(fn => fn()); // 只触发与键相关的副作用函数}// 清除函数function clearUp (effectFn){// 遍历然后进行删除for(let i = 0 ; i < effectFn.deps.length ; i++){const deps = effectFn.deps[i];// 移除deps.delete(effectFn);}// 最后重置effectFn.deps数组effectFn.deps.length = 0;}//   effect(() => {//     console.log(obj.foo);//   })// obj.foo ++;//   obj.foo++;// 连续执行同一代码,只饭后最后一次计算的结果// 定义一个任务集合set:可以进行去重操作const jobQueue = new Set();// 使用promise.resolve()创建一个promise实例:将一个任务添加到微任务队列当中const p = Promise.resolve();// 开始刷新队列let isFlushing = false;function flushJob(){// 如果队列正在被刷新->returnif(isFlushing){return;}// 没有刷新,进行刷新操作isFlushing = true;p.then(() => {jobQueue.forEach(job => job());}).finally(() => {// 结束后重置isFlushing = false;})}effect(() => {console.log(obj.foo);} , {scheduler(fn){jobQueue.add(fn);//调用flushJob刷新队列flushJob();}})obj.foo++;obj.foo++;</script>

effectFn);
}
// 最后重置effectFn.deps数组
effectFn.deps.length = 0;
}

// effect(() => {
// console.log(obj.foo);
// })
// obj.foo ++;
// obj.foo++;
// 连续执行同一代码,只饭后最后一次计算的结果
// 定义一个任务集合set:可以进行去重操作
const jobQueue = new Set();
// 使用promise.resolve()创建一个promise实例:将一个任务添加到微任务队列当中
const p = Promise.resolve();
// 开始刷新队列
let isFlushing = false;
function flushJob(){
// 如果队列正在被刷新->return
if(isFlushing){
return;
}
// 没有刷新,进行刷新操作
isFlushing = true;
p.then(() => {
jobQueue.forEach(job => job());

    }).finally(() => {// 结束后重置isFlushing = false;})
}effect(() => {console.log(obj.foo);
} , {scheduler(fn){jobQueue.add(fn);//调用flushJob刷新队列flushJob();}
})
obj.foo++;
obj.foo++;
```

相关文章:

Vue.js---避免无限递归循环 调度执行

4.4 避免无限递归循环 什么情况下会无限递归&#xff1f; 01 const data { foo: 1 } 02 const obj new Proxy(data, { /*...*/ }) 03 04 effect(() > obj.foo)例如这种情况&#xff0c;它会反复设置添加一直到栈溢出 首先读取obj.foo 的值&#xff0c;这会触发 track 操…...

AI大模型学习二十四、实践QEMU-KVM 虚拟化:ubuntu server 25.04 下云镜像创建Ubuntu 虚拟机

一、说明 虽然说大部分的场合&#xff0c;docker都能解决问题&#xff0c;但是有些大型的软件安装时如果修改配置会很麻烦&#xff0c;比方说前面遇到的code-server和dify 默认都是80和443端口要使用&#xff0c;安装在一起就会端口冲突&#xff0c;通过该端口来解决问题&#…...

Lovart:首个AI设计智能体

今天介绍一款AI设计智能体——Lovart&#xff0c;能调用各种绘画API和视频API&#xff0c;也能调用LibLib上的Flux和LoRA&#xff0c;并且智能体的编排效果确实很好&#xff0c;产出效果比豆包和ChatGPT都好&#xff0c;可以说没有竞品。视频为效果演示&#xff0c;官网有更多案…...

Trae 插件 Builder 模式:从 0 到 1 开发天气查询小程序,解锁 AI 编程新体验

在软件开发领域&#xff0c;效率与创新始终是开发者追求的核心目标。Trae 插件&#xff08;原 MarsCode 编程助手&#xff09;Builder 模式的全面上线&#xff0c;无疑为开发者带来了全新的解决方案。它不仅同时支持 VS Code、JetBrains IDEs 等主流开发环境&#xff0c;还能让…...

解决ubuntu20中tracker占用过多cpu,引起的风扇狂转

track是linux中的文件索引工具&#xff0c;ubuntu18之前是默认不安装的&#xff0c;所以在升级到20后会默认安装&#xff0c;它是和桌面程序gnome绑定的&#xff0c;甚至还有很多依赖项&#xff0c;导致无法删除&#xff0c;一旦删除很多依赖项都不能运行&#xff0c;禁用也很难…...

解码生命语言:深度学习模型TranslationAI揭示RNA翻译新规则

RNA翻译是基因表达的核心环节&#xff0c;其精确调控依赖于翻译起始位点&#xff08;TIS&#xff09;和终止位点&#xff08;TTS&#xff09;的准确识别。传统方法依赖于简单的经验规则&#xff08;如Kozak序列或最长开放阅读框ORF&#xff09;&#xff0c;但忽略了RNA结构、顺…...

20250515测试飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG时跑iperf3的极速

20250515测试飞凌的OK3588-C的核心板在Linux R4下适配以太网RTL8211F-CG时跑iperf3的极速 2025/5/15 14:47 缘起&#xff1a;让飞凌的OK3588-C的核心板在Linux R4下&#xff0c;想看看以太网RTL8211F-CG的极速。 于是在飞凌的OK3588-C的核心板上&#xff0c;iperf3的收发一起跑…...

在Linux内安装虚拟机安装vmnet.tar 报错

编译报错如下: /usr/lib/vmware/modules/source/vmnet-only/userif.c: 在函数‘VNetCsumCopyDatagram’中: /usr/lib/vmware/modules/source/vmnet-only/userif.c:88:39: 错误&#xff1a;‘skb_frag_t {或称 const struct bio_vec}’ has no member named ‘page_offset’; di…...

CodeBuddy编程新范式

不会写&#xff1f;不想写&#xff1f; 腾讯推出的CodeBuddy彻底解放双手。 示例 以下是我对CodeBuddy的一个小体验。 我只用一行文字对CodeBuddy说明了一下我的需求&#xff0c;剩下的全部就交给了CodeBuddy&#xff0c;我需要做的就是验收结果即可。 1.首先CodeBuddy会对任…...

ESP32简介及相关使用

乐鑫官网&#xff1a; 无线通信 SoC、软件、云和 AIoT 方案&#xff5c;乐鑫科技 (espressif.com) 简介 ESP32 是由 乐鑫科技&#xff08;Espressif Systems&#xff09; 推出的一款高性能、低功耗的 Wi-Fi & 蓝牙双模物联网&#xff08;IoT&#xff09;芯片&#xff0c;广…...

全志F10c200开发笔记——移植uboot

相关资料&#xff1a; &#xff08;二&#xff09;uboot移植--从零开始自制linux掌上电脑&#xff08;F1C200S)&#xff1c;嵌入式项目&#xff1e;-CSDN博客 F1C200S挖坑日记&#xff08;3&#xff09;——Uboot编译篇_f1c200s uboot-CSDN博客 一、安装编译器 Linaro Rele…...

解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- Manus解密

解密企业级大模型智能体Agentic AI 关键技术&#xff1a;MCP、A2A、Reasoning LLMs- Manus解密 那你当前这个步骤执行完成之后&#xff0c;这边说了一个非常重要的点&#xff1f;每次迭代只选择一个工具&#xff0c;这个可能对大家感觉有点反直觉&#xff0c;可能大家立即选择分…...

理解c++中关键字友元friend的作用

理解c中关键字友元friend的作用 friend 关键字在 C 中用于声明一个函数或类为另一个类的友元。 友元函数或友元类可以访问该类的私有&#xff08;private&#xff09;和保护&#xff08;protected&#xff09;成员。 友元函数 作用&#xff1a; 允许非成员函数访问私有成员&…...

【学习心得】2025年Docker Desktop安装记录

1、docker的官方网站&#xff0c;已进入就可以看到下载按钮&#xff0c;无脑点击下载&#xff01;英特尔的CPU所以选择AMD64 2、双击安装&#xff0c;默认的勾选不用改 Docker Desktop 4.40.0安装过程中的配置选项窗口 Use WSL 2 instead of Hyper-V (recommended)&#xff08…...

数据结构——例题2

1.在线性表中&#xff0c;除了开始元素外&#xff0c;每个元素&#xff08;A&#xff09; A.只有唯一的前驱元素 B.只有唯一的后继元素 C.有多个前驱元素 D.有多个后继元素 2.在一个长度为n的顺序表中删除第i个元素&#xff08;1<i<n&#xff09;时&#xff0c;需向前…...

python开发api平台雏形

api平台雏形 一、Django基本配置 1.1使用pycherm创建项目 1.2 运行项目 1.3 创建app python.exe .\manage.py startapp cmdb1.4 settings.py添加app 1.5 settings.py设置数据库 DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: devopsapi,USER: root,PASSWO…...

Android Development Roadmap

&#x1f527; Android Development Roadmap (Practical First → Theory Later) Here’s a lean, real-world roadmap tailored to the mindset — build-first, theory-when-needed: &#x1f7e2; Stage 1: Core Setup & Workflow (Done ✅) ✅ Install Android Studio…...

将.pt文件执行图像比对

目录 1. 加载模型 2. 图像预处理 3. 提取图像特征 4. 计算相似度 调用API或封装函数即可实现端到端比对 使用.pt文件进行图像比对通常涉及以下步骤&#xff1a; 1. 加载模型 python import torch# 假设模型是PyTorch保存的权重文件 model YourModelClass() # 需与保存时…...

西门子S7-1200 MC卡使用方法及故障现象分析

一、S7 1200 MC卡 S7 1200系列PLC使用的存储卡为SD卡&#xff0c;也被称为MC卡 &#xff0c;支持4M、12M、24M、256M、2G以及32G等不同容量规格。它可作为程序卡、传送卡&#xff0c;还能用于更新硬件及解除密码&#xff0c;在S7 1200的系统运行和维护中扮演着重要角色。 二…...

5.重建大师数据管理模块介绍

摘要&#xff1a;本文主要介绍重建大师数据管理模块&#xff0c;包含&#xff1a;照片、点云数据可视化管理工具。 数据管理界面主要包含工具栏、可视化界面和照片组列表三部分。 图 数据管理界面 1.工具栏 工具栏包含以下功能按钮&#xff0c;包含添加照片、视频、点云、控制…...

BUUCTF——shrine

BUUCTF——shrine 进入靶场 只有一串代码 import flask import os app flask.Flask(__name__) app.config[FLAG] os.environ.pop(FLAG) #程序从环境变量 FLAG 读取一个敏感值&#xff0c;并存储在 app.config[FLAG] 中。 #安全问题&#xff1a;如果攻击者能访问 app.con…...

基于FPGA的车速检测系统仿真设计与实现

标题:基于FPGA的车速检测系统仿真设计与实现 内容:1.摘要 本文旨在设计并实现基于FPGA的车速检测系统仿真。随着汽车行业的快速发展&#xff0c;精确的车速检测对于车辆的安全性和性能评估至关重要。本研究采用FPGA作为核心处理单元&#xff0c;结合传感器数据采集与处理技术进…...

STM32 DMA技术深度解析:从原理到实战应用讲解

知识点1【DMA的介绍】 直接内存访问&#xff08;DMA&#xff09;用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输&#xff0c;无需CPU的干预&#xff0c;数据可以通过DMA快速地移动&#xff0c;这就节省了CPU的资源&#xff0c;来做其他的操作——提高CPU的效…...

模仿学习笔记

模仿学习总共分两类&#xff1a; 行为克隆&#xff1a;BC,Dagger逆强化学习:又分为 2.1基于最大边际逆强化学习 &#xff08;无法主要歧义问题&#xff09;&#xff1a;学徒学习 2.2 基于最大熵逆强化学习 &#xff08;主要解决歧义问题&#xff09;:GAIL 学徒学习 基于最大熵…...

论文学习_Directed Greybox Fuzzing

摘要&#xff1a;现有的灰盒模糊测试工具&#xff08;Greybox Fuzzers&#xff0c;简称GF&#xff09;在测试引导性方面存在明显不足&#xff0c;比如难以有效地将测试引导至特定的高风险变更或补丁、关键系统调用、危险代码位置&#xff0c;或是试图重现漏洞时涉及的堆栈追踪中…...

《MySQL:MySQL视图特性》

视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响基表&#xff0c;基表的数据变化也会影响视图。 创建视图 create view 视图名 as select语句; 删除视图 drop view 视图名; 视图规则与限…...

Flutter——数据库Drift开发详细教程(六)

目录 1.视图2.视图中列的可空性3.DAO4.流查询5.高级用途6.注意事项 1.视图 也可以将SQL 视图定义 为 Dart 类。为此&#xff0c;请编写一个抽象类来扩展View。此示例声明了一个视图&#xff0c;用于读取示例中架构中某个类别中添加的待办事项数量&#xff1a; abstract class C…...

PCIe数据采集系统

PCIe数据采集系统 一、模块功能划分与职责 1. 时钟管理模块 (clock_manager) 核心功能&#xff1a; 生成系统所需的多时钟信号&#xff08;100MHz 系统时钟、125MHz PCIe 时钟、200MHz DDR3 时钟&#xff09;。 关键接口&#xff1a; 输入&#xff1a;系统主时钟 sys_clk、P…...

mac docker弹窗提示Docker 启动没有响应

一、原因分析 这台笔记电脑是Mac M3操作系统,安装Docker之后,Docker应用程序一直启动不起来。 二、解决办法 sudo rm /Library/PrivilegedHelperTools/com.docker.vmnetd sudo cp /Applications/Docker.app/Contents/Library/LaunchServices/com.docker.vmnetd /Library/Pri…...

TVS管用万用表测量方法详解(含二极管档使用指南)

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 TVS管&#xff08;瞬态抑制二极管&#xff09;是一种用于保护电路免受瞬态高电压冲击的半导体器件。其核心功能是通过快速导通将过压钳位在安全范围内。本文将重点介绍如何用万用表测量…...

当下流行的智能体通信协议:MCP、A2A、ANP 分别是什么?

在当前人工智能&#xff08;AI&#xff09;智能体生态系统中&#xff0c;智能体之间的有效沟通至关重要。为了让AI智能体能够高效、安全地协同工作&#xff0c;业界提出了多种通信协议。其中&#xff0c;MCP、A2A 和 ANP 代表了三个关键层级的通信协议&#xff0c;各自应对不同…...

中国近代史2

甲午中日战争&#xff08;1894-1895&#xff09; 1.开始的标志&#xff1a;丰岛海战 2.进程 平壤之战&#xff1a;清军统帅叶志超不战而降&#xff0c;回民将领左宝贵以身殉职 黄海海战&#xff08;大东沟海战&#xff09;&#xff1a;北洋水师黄海遭遇日本舰队&#xff0c;水…...

Ubnutu ADB 无法识别设备的解决方法

1. 正确安装adb 下载地址 2. 检查 Linux 是否识别设备 lsusb通过上述指令&#xff0c;分别查询插入、断开设备的usb设备表&#xff0c;如下所示&#xff1a; # 插入设备 adbc:~$ lsusb Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 011:…...

基于策略的强化学习方法之近端策略优化(PPO)深度解析

PPO&#xff08;Proximal Policy Optimization&#xff09;是一种基于策略梯度的强化学习算法&#xff0c;旨在通过限制策略更新幅度来提升训练稳定性。传统策略梯度方法&#xff08;如REINFORCE&#xff09;直接优化策略参数&#xff0c;但易因更新步长过大导致性能震荡或崩溃…...

前端图形渲染 html+css、canvas、svg和webgl绘制详解,各个应用场景及其区别

在前端开发中&#xff0c;HTMLCSS、Canvas、SVG 和 WebGL 是实现图形渲染的四种常见技术。它们各自具有不同的特点和适用场景。以下是对这四种技术的详细解析&#xff1a; 1. HTML CSS 特点&#xff1a; 主要用于构建网页的结构和样式。通过 CSS 可以实现简单的图形效果&am…...

《Navicat之外的新选择:实测支持国产数据库的SQLynx核心功能解析》

数据库工具生态的新变量 在数据库管理工具领域&#xff0c;Navicat长期占据开发者心智。但随着国产数据库崛起和技术信创需求&#xff0c;开发者对工具的兼容性、轻量化和本土化适配提出了更高要求。近期体验了一款名为SQLynx的国产数据库管理工具&#xff08;麦聪旗下产品&am…...

Elasticsearch 快速入门指南

1. Elasticsearch 简介 Elasticsearch 是一个基于 Lucene 的开源分布式搜索和分析引擎&#xff0c;由 Elastic 公司开发。它具有以下特点&#xff1a; 分布式&#xff1a;可以轻松扩展到数百台服务器&#xff0c;处理 PB 级数据实时性&#xff1a;数据一旦被索引&#xff0c;…...

解决Mawell1.29.2启动SQLException: You have an error in your SQL syntax问题

问题背景 此前在openEuler24.03 LTS环境下的Hive使用了MySQL8.4.2&#xff0c;在此环境下再安装并启动Maxwell1.29.2时出现如下问题 [ERROR] Maxwell: SQLException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version f…...

【Conda】环境应用至JupyterLab

目录 ✅ 步骤一&#xff1a;激活你的 conda 虚拟环境 ✅ 步骤二&#xff1a;安装 ipykernel&#xff08;如果尚未安装&#xff09; ✅ 步骤三&#xff1a;将环境注册为 Jupyter 内核 ✅ 步骤四&#xff1a;启动 JupyterLab 并选择内核 &#x1f9fc; 可选&#xff1a;删除…...

英语六级听力

试卷结构考试内容数量听力理解长对话8*7.1分听力篇章7*7.1分讲话/报道/讲座10*14.2分考点分析 A. 理解明示的信息 理解主旨大意听懂重要信息或特定的细节理解说话人明确表达的观点、态度等B. 理解隐含的信息 推论隐含的意义判断话语的交际功能推断说话人的观点、态度等C. 运用…...

视差计算,求指导

通过SGBM算法算出来的视差图&#xff0c;照片是3072*3072的&#xff0c; numDisparities是112&#xff0c;bloksize是7 不知道怎么调整了&#xff0c;求指导...

各个历史版本mysql/tomcat/Redis/Jdk/Apache/gitlab下载地址

mysql 各版本下载地址&#xff1a; https://downloads.mysql.com/archives/community/ **************************************************************** tomcat 各版本下载地址&#xff1a; https://archive.apache.org/dist/tomcat/ ********************************…...

【Redis】压缩列表

目录 1、背景2、压缩列表【1】底层结构【2】特性【3】优缺点 1、背景 ziplist&#xff08;压缩列表&#xff09;是redis中一种特殊编码的双向链表数据结构&#xff0c;主要用于存储小型列表和哈希表。它通过紧凑的内存布局和特殊的编码方式来节省内存空间。 2、压缩列表 【1…...

计算机网络--第一章(上)

目录 1.计算机网络的概念 2.计算机网络的组成、功能 3.交换 3.1 电路交换 3.2 报文交换 3.3 分组交换 3.4 虚拟电路交换 4.交换的性能分析 4.1 电路交换 4.2 报文交换 4.3 分组交换 4.4 总结 5.计算机网络的分类 5.1 分布范围分类 5.2 传输技术分类 5.3 拓扑结…...

hbit资产收集工具Docker(笔记版)

1. 安装 Docker 在 Kali 系统中&#xff0c;首先更新软件源&#xff0c;并安装 Docker apt-get update && apt-get upgrade && apt-get dist-upgrade apt-get install docker.io docker-compose安装完成后&#xff0c;使用 docker -v 命令验证安装是否成功。…...

套路化编程:C# winform ListView 自定义排序

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

CSS3 变形

一、CSS3变形&#xff08;Transform&#xff09;是一些效果的集合&#xff0c;有以下几种&#xff1a; ‌平移&#xff08;Translate&#xff09;‌&#xff1a;元素沿水平或垂直方向移动。‌旋转&#xff08;Rotate&#xff09;‌&#xff1a;元素绕某点旋转一定的角度。‌缩放…...

【python基础知识】Day26 函数

一、函数的定义 函数是一段具有特定功能的、可重用的语句组&#xff0c;用函数名来表示。在需要使用函数时&#xff0c;通过函数名进行调用。函数也可以看作一段具有名字的子程序&#xff0c;可以在需要使用它的地方进行调用执行&#xff0c;不需要在每个执行的地方重复编写这些…...

C#中Action的用法

Action 是 C# 中委托的一种&#xff0c;用于封装无返回值的方法。它引用的方法不能有返回值&#xff0c;但可以有零个或多个参数。相比delegate委托&#xff0c;Action 委托的优点是不必显式定义封装无参数过程的委托&#xff0c;使代码更加简洁和易读。 1、delegate-委托 先…...

IOS CSS3 right transformX 动画卡顿 回弹

卡片从右往左滑动&#xff0c;在同时变换 width height right transformX的时候 在某些IPhone机型上 会有卡顿&#xff0c;在Chrome和Android等很多机型都是OK的&#xff0c;包括我的iphone 14 pro max. IOS 18.2 也是好的。但是&#xff0c;新的iPhone16 也会卡&#xff0c;会…...