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

vue3从精通到入门6:v-memo指令

v-memo是一个用于优化组件渲染性能的指令。它允许你根据某个条件来缓存组件的虚拟 DOM 树,从而在条件没有变化时避免不必要的重新渲染。这对于那些接收大量 props 且渲染成本较高的组件来说非常有用。

用法

v-memo 指令接受一个表达式或一个数组作为参数,这个表达式或数组的值将用于确定是否缓存组件的虚拟 DOM。当这个值没有变化时,Vue 将复用之前缓存的虚拟 DOM,而不是重新创建它。

<div v-memo="[valueA, valueB]">...
</div>

当组件重新渲染,如果 valueA 和 valueB 都保持不变,这个 <div> 及其子项的所有更新都将被跳过。实际上,甚至虚拟 DOM 的 vnode 创建也将被跳过,因为缓存的子树副本可以被重新使用。

正确指定缓存数组很重要,否则应该生效的更新可能被跳过。v-memo 传入空依赖数组 (v-memo="[]") 将与 v-once 效果相同。

与 v-for 一起使用

v-memo 仅用于性能至上场景中的微小优化,应该很少需要。最常见的情况可能是有助于渲染海量 v-for 列表 (长度超过 1000 的情况):

<div v-for="item in list" :key="item.id" v-memo="[item.id === selected]"><p>ID: {{ item.id }} - selected: {{ item.id === selected }}</p><p>...more child nodes</p>
</div>

当组件的 selected 状态改变,默认会重新创建大量的 vnode,尽管绝大部分都跟之前是一模一样的。v-memo 用在这里本质上是在说“只有当该项的被选中状态改变时才需要更新”。这使得每个选中状态没有变的项能完全重用之前的 vnode 并跳过差异比较。

如果不在上面的代码中使用 v-memoselected 变量的每一次改变都会导致列表的完全重新渲染。新指令提供的缓存,允许只更新表达式 item.id === selected 发生变化的行,也就是当某个项被选中或者取消时。

注意:这里 memo 依赖数组中并不需要包含 item.id,因为 Vue 也会根据 item 的 :key 进行判断。当搭配 v-for 使用 v-memo,确保两者都绑定在同一个元素上。v-memo 不能用在 v-for 内部。

相关文章:

  • shell脚本发布nginx vue2 项目示例
  • 设计模式(4):建造者模式
  • 【Vue3源码学习】— CH2.5 reactiveEffect.ts:Vue 3响应式系统的核心
  • 处理关于 React lazy 白屏的两种方案
  • Linux和Windows安装PHP依赖管理工具Composer
  • 【微信小程序】流量主-激励视频(激励广告)下发策略,每天三次免费体验,然后再次点击触发激励视频,当日不再触发。
  • MySQL 优化及故障排查
  • 手机有线投屏到直播姬pc端教程
  • winform日历控件_进度条控件
  • C++面向对象程序设计 - 构造函数
  • Linux——信号概念与信号产生方式
  • U-net在乳腺癌医学图像分割方面的应用
  • vue-ueditor-wrap上传图片报错:后端配置项没有正常加载,上传插件不能正常使用
  • 6个黑科技网站,永久免费
  • java中的string和stringbuff和stringBuilter
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Angularjs之国际化
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • CentOS7 安装JDK
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Redux 中间件分析
  • 关于extract.autodesk.io的一些说明
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 使用API自动生成工具优化前端工作流
  • 自定义函数
  • 数据可视化之下发图实践
  • ###STL(标准模板库)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (0)Nginx 功能特性
  • (11)MSP430F5529 定时器B
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十一)图像的罗伯特梯度锐化
  • (未解决)macOS matplotlib 中文是方框
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .Net Core与存储过程(一)
  • .Net IOC框架入门之一 Unity
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 发展历程
  • .net的socket示例
  • .NET简谈设计模式之(单件模式)
  • @AutoConfigurationPackage的使用
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • []FET-430SIM508 研究日志 11.3.31
  • [1127]图形打印 sdutOJ
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [C#小技巧]如何捕捉上升沿和下降沿
  • [EFI]Dell Latitude-7400电脑 Hackintosh 黑苹果efi引导文件
  • [HackMyVM]靶场Crossbow