Vue 新指令 v-memo 案例精析与性能优化

v-memo 用于缓存组件的渲染结果。它通过指定依赖项来决定何时重新渲染组件,只有当依赖项的值发生变化时,组件才会重新渲染,从而提高性能。

使用场景:v-memo 适用于组件的渲染结果在依赖项不变的情况下不应该频繁更新的场景,例如某些复杂的计算结果或者需要频繁更新但依赖项相对稳定的数据。

示例代码如下:

html 复制代码
<body>  
    <div id="app">  
        <el-divider content-position="left">v-memo依赖项的值未发生改变</el-divider>  
        <el-row>  
            <el-col :span="12">  
                <p>添加v-memo</p>  
                <div v-memo="[info.name,info.age]">  
                    <p>姓名:{{info.name}}</p>  
                    <p>年龄:{{info.age}}</p>  
                    <p>爱好:{{info.hobby}}</p>  
                </div>  
            </el-col>  
            <el-col :span="12">  
                <p>未添加v-memo</p>  
                <div>  
                    <p>姓名:{{info.name}}</p>       
                    <p>年龄:{{info.age}}</p>  
                    <p>爱好:{{info.hobby}}</p>  
                </div>  
            </el-col>  
            <el-col :span="24">  
                <el-button type="primary" @click="updateInfo">更新数据</el-button>  
            </el-col>  
        </el-row>  
        <el-divider content-position="left">v-memo依赖项的值发生改变</el-divider>  
        <el-row>  
            <el-col :span="12">  
                <p>添加v-memo</p>  
                <div v-memo="[grade.chinese,grade.mathematics]">  
                    <p>语文:{{grade.chinese}}</p>  
                    <p>数学:{{grade.mathematics}}</p>  
                    <p>英文:{{grade.english}}</p>  
                </div>  
            </el-col>  
            <el-col :span="12">  
                <p>未添加v-memo</p>  
                <div>  
                    <p>语文:{{grade.chinese}}</p>       
                    <p>数学:{{grade.mathematics}}</p>  
                    <p>英文:{{grade.english}}</p>  
                </div>  
            </el-col>  
            <el-col :span="24">  
                <el-button type="primary" @click="updateGrade">更新数据</el-button>  
            </el-col>  
        </el-row>  
    </div>  
</body>  
<script>  
    const {createApp}=Vue;  
    const app=createApp({  
        data(){  
            return{  
                info:{  
                    name:'Lucy',  
                    age:'32',  
                    hobby:'running'  
                },  
                grade:{  
                    chinese:82,  
                    mathematics:77,  
                    english:102  
                }  
            }  
        },  
        methods:{  
            updateInfo(){  
                this.info.hobby='dance and drawing';  
            },  
            updateGrade(){  
                this.grade.chinese="成绩:72";  
                this.grade.english="口语成绩:30,读写成绩:80";  
            }  
        }  
    })  
    app.use(ElementPlus);  
    app.mount('#app');  
</script>  

运行结果,截图如下:

分析:

对于 info 对象的更新:

在未添加 v-memo 的部分,由于每次数据更新,整个组件都会重新渲染,所以当 info.hobby 的值从 "running" 变为 "dance and drawing" 时,姓名、年龄以及爱好的显示都会重新渲染。

在添加了 v-memo 的部分,由于依赖项是 info.name 和 info.age,而更新的是 info.hobby,所以这部分不会重新渲染即姓名和年龄的显示保持不变,另外爱好的显示不会更新。

对于 grade 对象的更新:

在未添加 v-memo 的部分,由于数据更新,整个组件会重新渲染,所以当 grade.chinese 和 grade.english 的值发生变化时,语文、数学和英语的显示都会随之重新渲染。

在添加了 v-memo 的部分,因为依赖项是 grade.chinese 和 grade.mathematics,而此次更新中 grade.chinese 的值格式发生了较大变化,致使相应部分重新渲染,于是语文的显示得以更新。此外,grade.english 也进行了更新,所以英语的显示已会更新。

更新数据后,运行结果,截图如下:

相关推荐
脑袋大大的3 分钟前
判断当前是否为钉钉环境
开发语言·前端·javascript·钉钉·企业应用开发
军军君0113 分钟前
基于Springboot+UniApp+Ai实现模拟面试小工具二:后端项目搭建
前端·javascript·spring boot·spring·微信小程序·前端框架·集成学习
quweiie1 小时前
tp8.0\jwt接口安全验证
前端·安全·jwt·thinkphp
xiaoyan20151 小时前
最新Flutter3.32+Dart3仿微信App聊天实例
前端·flutter·dart
汪敏wangmin1 小时前
Fiddler-抓包后直接生成Loadrunner脚本或者Jmeter脚本
前端·jmeter·fiddler
彤银浦2 小时前
Web学习笔记3
前端·笔记·学习·html5
江城开朗的豌豆2 小时前
退出登录后头像还在?这个缓存问题坑过多少前端!
前端·javascript·vue.js
江城开朗的豌豆2 小时前
Vue的'读心术':它怎么知道数据偷偷变了?
前端·javascript·vue.js
江城开朗的豌豆2 小时前
手把手教你造一个自己的v-model:原来双向绑定这么简单!
前端·javascript·vue.js
我在北京coding3 小时前
el-tree 懒加载 loadNode
前端·vue.js·elementui