我的编程空间,编程开发者的网络收藏夹
学习永远不晚

新指令 v-memo,提高性能的又一利器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

新指令 v-memo,提高性能的又一利器

在这节课中,我们介绍一下,在 Vue 3.2 中引入新指令 v-memo。引入这个指令的目的是帮助我们提高中型/大型 Vue 应用程序的性能,小项目大家根据需要自行决定。

v-memo 是做什么的?

官网对 v-memo 定义是这样的:

缓存一个模板的子树。在元素和组件上都可以使用。为了实现缓存,该指令需要传入一个固定长度的依赖值数组进行比较。如果数组里的每个值都与最后一次的渲染相同,那么整个子树的更新将被跳过。举例来说:

看起来有点绕,但实际上,很好理解。v-memo​ 所做的与我们现有的计算属性一样,只不过 v-memo 的对象是 DOM。

这个新指令将缓存它所控制的DOM部分,如果一个特定的值发生变化,只需运行更新并重新渲染。这些值是由我们自己手动设置。

事例

<template>
<div>
..the rest of the component
<div v-memo="[myValue]">
<svg >
<title>{{MyValue}}title>
...
svg>
<vue-custom-element :value="myValue">vue-custom-element>
div>
div>
template>

对上面解释一下:v-memo 通常是作为组件的一部分来使用的,它只是影响组件 dom 的一个子集。

<div v-memo="[myValue]">

接着,我们将 v-memo​分配给了一个特定的 DIV​ 和它的所有子元素。当调用 v-memo 时,需要传递一个值数组,以控制子树的渲染。

数组接受一个或多个值 v-memo="[valueOne, valueTwo]"​,也接受像 v-memo="myValue === true"这样的表达。

另外:用一个空数组调用 v-memo​相当于使用v-once,只会渲染该部分组件一次。

<svg >
<title>{{MyValue}}title>
...
svg>
<vue-custom-element :value="myValue">vue-custom-element>

同在看下子树的内容。在我们的例子中,使用了一个 svg 元素和一个自定义 Vue 组件 vue-custom-element​。这样做是为了说明一件事:v-memo 包含任何元素。

错误的使用方式

<div v-memo="[myValue]">
<p>Static content, no vue values herep>
div>

在上面的例子中,包含在 v-memo 中的子树不需要被缓存,因为它是静态的,不会改变(它不包括任何Vue变量)。Vue3 会对静态进行一个提升,以便提高性能。

在一个静态的HTML上添加 v-memo 是没啥作用,不管这个HTML有多复杂。

管理更新

在有些情况下,v-memo不仅可以用来提高性能,还可以通过控制组件的更新周期,实际改善UX(用户体验)。

<div v-memo="[allFieldChanged]">
<p>{{ field1 }}p>
<p>{{ field2 }}p>
<p>{{ field3 }}p>
<p>{{ field4 }}p>
div>

在上面的例子中,改变一个单独的字段,例如 field1,并不会导致重新渲染。新的字段将在所有字段都被更新后显示。

最近遇到一个情况,一个子组件会对一个大的JSON数据集进行更新和响应。在这种情况下,使用 v-memo 真的很有帮助,当所有的变化都完成后,就可以触发更新。

与 v-for 结合使用

使用 v-memo​ 的一个最常见的用例是在处理使用 v-for 渲染的非常大的列表时。

<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 nodesp>
div>

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

如果我们考虑一个有 1000 条数据的列表。使用上述代码的 v-memo,可以为每一个变化节省998个条重新渲染。

无意中停止了子组件触发的更新

我们知道 v-memo 会停止子树渲染更新,但需要注意的是,使用这个指令实际上会停止任何可能被更新触发的代码的执行,如 watch 函数等。

<div v-memo="[points > 1000]">
<myComponent :points="points" />
div>

//myComponent
<isLevel1 v-if="points <= 1000">....isLevel1>
<isLevel2 v-if="points > 1000">...isLevel2>
<script>
...,
watch: {
points() {
logPointChange();
}
}

在上面的代码中,如果我们的 points​ 值是 1000 以内变化,那么 watch​ 函数不会被执行,直到 points 的值大于 1000 才会触发 watch 函数的执行。

总结

这个新的指令对于要求性能极高的项目有很在帮助了,一般是在比较大型的项目中使用的,当然小型项目,大家可以根据项目需要进行食用。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

新指令 v-memo,提高性能的又一利器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

新指令 v-memo,提高性能的又一利器

这个新的指令对于要求性能极高的项目有很在帮助了,一般是在比较大型的项目中使用的,当然小型项目,大家可以根据项目需要进行食用。

Windows 11新预览版进一步提高文件管理器的性能

在最新发布的 Windows 11 Build 22526 预览版更新中,微软进一步提高了文件资源管理器的性能。

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录