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

Diff 算法的误判

起源:

for循环的:key的值使用index绑定,当循环列表条目变化更新,导致虚拟 DOM Diff 算法认为原有项被替换,而更新

// vue2写法 错误例子
<template><div><button @click="addItem">添加项目</button><button @click="removeItem">删除项目</button><ul><li v-for="(item, index) in list" :key="index">{{ item.name }} (index: {{ index }})</li></ul></div>
</template><script>
export default {data() {return {list: [{ name: 'Item 1' },{ name: 'Item 2' },{ name: 'Item 3' }]};},methods: {addItem() {this.list.splice(1, 0, { name: `New Item` }); // 在索引1的位置插入一个新项},removeItem() {this.list.splice(0, 1); // 删除索引0位置的项}}
};
</script>
// vue3 错误例子
<template><div><button @click="addItem">添加项目</button><button @click="removeItem">删除项目</button><ul><li v-for="(item, index) in list" :key="index">{{ item.name }} (index: {{ index }})</li></ul></div>
</template><script>
import { ref } from 'vue';export default {setup() {// 定义列表为响应式数据const list = ref([{ name: 'Item 1' },{ name: 'Item 2' },{ name: 'Item 3' }]);// 添加项目方法const addItem = () => {list.value.splice(1, 0, { name: 'New Item' }); // 在索引1的位置插入一个新项};// 删除项目方法const removeItem = () => {list.value.splice(0, 1); // 删除索引0位置的项};return {list,addItem,removeItem};}
};
</script>

解决方法:

不要使用 index 作为 key,而是使用数据中的唯一标识符或者随机数,这样可以避免 Diff 算法的误判,确保列表在更新时能够正确地追踪每个项的状态,提升渲染性能。

//vue2写法
<template><div><button @click="addItem">添加项目</button><button @click="removeItem">删除项目</button><ul><li v-for="item in list" :key="item.id">{{ item.name }} (id: {{ item.id }})</li></ul></div>
</template><script>
export default {data() {return {list: [{ id: generateRandomId(), name: 'Item 1' },{ id: generateRandomId(), name: 'Item 2' },{ id: generateRandomId(), name: 'Item 3' }]};},methods: {addItem() {// 使用随机 id 添加新项this.list.push({ id: generateRandomId(), name: `New Item` });},removeItem() {this.list.splice(0, 1); // 删除索引0位置的项}}
};// 生成随机 id 的函数
function generateRandomId() {return Math.floor(Math.random() * 1000000); // 生成一个 6 位的随机数
}
</script>
// vue3 写法,正确例子
<template><div><button @click="addItem">添加项目</button><button @click="removeItem">删除项目</button><ul><li v-for="item in list" :key="item.id">{{ item.name }} (id: {{ item.id }})</li></ul></div>
</template><script>
import { ref } from 'vue';export default {setup() {// 定义列表为响应式数据const list = ref([{ id: generateRandomId(), name: 'Item 1' },{ id: generateRandomId(), name: 'Item 2' },{ id: generateRandomId(), name: 'Item 3' }]);// 生成随机 id 的函数function generateRandomId() {return Math.floor(Math.random() * 1000000); // 生成一个 6 位的随机数}// 添加项目方法const addItem = () => {list.value.push({ id: generateRandomId(), name: 'New Item' });};// 删除项目方法const removeItem = () => {list.value.splice(0, 1); // 删除索引0位置的项};return {list,addItem,removeItem};}
};
</script>

Diff算法学习:

概念:

Diff算法主要通过比较两个数据结构,并找出最小的插入、删除或修改操作,将一个数据结构变成另一个。例如,在比较两个字符串或数组时,算法会找出最小的变化(即最少的增删改操作),使一个序列变成另一个。

原理:

Diff 算法的主要思想是找到两个序列之间的最长公共子序列,从而计算出需要的修改步骤。通常通过动态规划来实现 LCS,从而计算出最小的修改路径

Diff 算法步骤通常如下:

  1. 比较两个数据结构的每一个元素。
  2. 如果两个元素相同,则无需操作,直接继续。
  3. 如果两个元素不同,则记录变化的操作(例如插入、删除或替换)。
  4. 重复以上步骤,直到找到最优路径。

相关文章:

Diff 算法的误判

起源&#xff1a; for循环的:key的值使用index绑定&#xff0c;当循环列表条目变化更新&#xff0c;导致虚拟 DOM Diff 算法认为原有项被替换&#xff0c;而不是更新。 // vue2写法 错误例子 <template><div><button click"addItem">添加项目<…...

odoo 17 后端路由接口认证自定义

odoo 17 后端路由接口认证自定义 在接口中, 我们都知道有3中常用的认证方式 user 用户级认证public 访问时赋予公共用户none 不做任何用户级处理 一般不做数据库重要数据校验, 仅做访问处理 以上是源码提供的三种方式 接下来我们自定义一个认证方式 首先找到的这认证是在…...

租赁回收系统小程序

1.需求分析&#xff1a;首先&#xff0c;需要明确系统的功能和特点。这包括确定租赁回收的物品类型、用户群体、业务流程等。通过需求分析&#xff0c;可以确保系统能够满足市场和用户的需求。 2.系统设计&#xff1a;在需求分析的基础上&#xff0c;进行系统的整体设计。这包…...

SQL 注入详解:原理、危害与防范措施

文章目录 一、什么是SQL注入&#xff1f;二、SQL注入的工作原理三、SQL注入的危害1. 数据泄露2. 数据篡改3. 拒绝服务4. 权限提升 四、SQL注入的类型1. 基于错误的信息泄露2. 联合查询注入3. 盲注(1). 基于布尔响应的盲注(2). 基于时间延迟的盲注 4. 基于带外的注入 五、防范SQ…...

如何用Java爬虫“采集”商品订单详情的编程旅程

在这个数据驱动的世界里&#xff0c;如果你不是数据&#xff0c;那么你一定是在收集数据。就像蜜蜂采集花粉一样&#xff0c;我们程序员也需要采集数据&#xff0c;以便分析、优化和做出明智的决策。今天&#xff0c;我们就来聊聊如何使用Java编写一个爬虫&#xff0c;这个爬虫…...

《FreeRTOS任务基础知识篇》

FreeRTOS任务基础知识 1. 什么是多任务系统&#xff1f;2. FreeRTOS任务3. 任务状态3.1 运行态3.2 就绪态3.3 阻塞态3.4 挂起态 4. 任务优先级5. 任务的实现6. 任务控制块7. 任务堆栈 FreeRTOS的核心是任务管理&#xff0c;以下介绍FreeRTOS任务的一些基础知识。 1. 什么是多任…...

前端面试笔试(二)

目录 一、数据结构算法等综合篇 1.HTTP/2、ETag有关 二、代码输出篇 1.new URL&#xff0c;url中的hostname&#xff0c;pathname&#xff0c;href 扩展说一下url的组成部分和属性 URL的组成部分 urlInfo 对象的属性 2.一个递归的输出例子 3.数组去重的不普通方法1 4.数…...

基于Python 和 pyecharts 制作招聘数据可视化分析大屏

在本教程中&#xff0c;我们将展示如何使用 Python 和 pyecharts 库&#xff0c;通过对招聘数据的分析&#xff0c;制作一个交互式的招聘数据分析大屏。此大屏将通过不同类型的图表&#xff08;如柱状图、饼图、词云图等&#xff09;展示招聘行业、职位要求、薪资分布等信息。 …...

探索光耦:晶体管光耦——智能家居的隐形桥梁,让未来生活更智能

在这个日新月异的科技时代&#xff0c;智能家居正以前所未有的速度融入我们的日常生活&#xff0c;从智能灯光到温控系统&#xff0c;从安防监控到语音助手&#xff0c;每一处细节都透露着科技的温度与智慧。而在这场智能化浪潮中&#xff0c;一个看似不起眼却至关重要的组件—…...

三、模板与配置(上)

三、模板与配置 1、WXML模板语法-数据、属性绑定 讲解&#xff1a; 1-1、数据绑定的基本原则 在data中定义数据 Page({data: {//这里是你需要定义的数据} })在WXML中使用数据 {{ 你定义的数据 }}1-2、在data中定义页面的数据 在页面对应的.js文件中&#xff0c;把数据定…...

基于SpringBoot和Vue的公司文档管理系统设计与开发(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…...

Java21 Switch最全使用说明

Java21 Switch最全使用说明 Java 21 对 switch 语句进行了重大的改进和增强&#xff0c;使其变得更加灵活和强大。本文将详细介绍 Java 21 中 switch 语句的各种用法&#xff0c;包括基本语法、新特性、高级用法和最佳实践。 1. 基本语法 1.1 传统的 switch 语句 传统的 sw…...

普通电脑上安装属于自己的Llama 3 大模型和对话客户端

#大模型下载地址&#xff1a;# Llama3 因为Hugging Face官网正常无法访问&#xff0c;因此推荐国内镜像进行下载&#xff1a; 官网地址&#xff1a;https://huggingface.co 国内镜像&#xff1a;https://hf-mirror.com GGUF 模型文件名称接受&#xff0c;如上述列表中&…...

微信小程序原生 canvas画布截取视频帧保存为图片并进行裁剪

html页面&#xff1a; 视频尺寸过大会画布会撑开屏幕&#xff0c;要下滑 尺寸和视频链接是从上个页面点击传过来的&#xff0c;可自行定义 <canvas id"cvs1" type"2d" style"width: {{videoWidth}}px;height: {{videoHeight}}px;"><…...

社交网络图中结点的“重要性”计算

题目描述 输入 输出 输入样例1 9 14 1 2 1 3 1 4 2 3 3 4 4 5 4 6 5 6 5 7 5 8 6 7 6 8 7 8 7 9 3 3 4 9 输出样例1 Cc(3)0.47 Cc(4)0.62 Cc(9)0.35 AC代码 #include <iostream> #include <vector> #include <queue> #include <iomanip>using na…...

前端(1)——快速入门HTML

参考&#xff1a; W3school 1. HTML 我使用的是vs code&#xff0c;在使用之前&#xff0c;先安装以下几个插件&#xff1a; Auto Rename TageHTML CSS SupportLive Server 1.1 HTML标签 HTML全称是 Hypertext Markup Language(超文本标记语言) HTML通过一系列的标签(也称为…...

gitlab角色、权限

GitLab是一个基于Web的Git仓库管理工具&#xff0c;它提供了一套完整的角色和权限管理机制&#xff0c;以控制用户对项目和仓库的访问和操作权限。以下是GitLab中不同角色的基本权限概述&#xff1a; 访客&#xff08;Guest&#xff09;&#xff1a; 可以查看项目中的公开信息。…...

Python办公——批量eml文件提取附件

目录 专栏导读背景1、库的介绍2、库的安装3、核心代码4、完整代码总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自动…...

Spring Boot 中 Druid 连接池与多数据源切换的方法

Spring Boot 中 Druid 连接池与多数据源切换的方法 在Spring Boot项目中&#xff0c;使用Druid连接池和进行多数据源切换是常见的需求&#xff0c;尤其是在需要读写分离、数据库分片等复杂场景下。本文将详细介绍如何在Spring Boot中配置Druid连接池并实现多数据源切换。 一、…...

JavaScrip中私有方法的创建

在 JavaScript 中&#xff0c;私有方法是指只能在类的内部使用&#xff0c;外部无法访问的函数。为了实现这一点&#xff0c;JavaScript 提供了几种方法&#xff0c;主要通过以下几种方式来创建私有方法&#xff1a; 1. 使用 #&#xff08;私有字段和方法&#xff09; 从 ECM…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...