news 2026/5/1 7:31:22

Vue 页面频繁重渲染,性能为什么这么差?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 页面频繁重渲染,性能为什么这么差?

文章目录

    • 前言
    • 什么是“无意义的重渲染”?
      • 常见场景
    • Vue 响应式是如何“牵一发动全身”的?
      • 问题根源
    • computed / watch 用错,是性能杀手
      • 错误示例
      • 正确做法
    • v-memo:Vue 3 的“性能核武器”
      • 示例
    • shallowRef:大对象的救命稻草
      • 普通 ref
      • shallowRef
    • 拆分组件粒度,才是真正的解法
      • 问题代码
      • 优化思路
    • 实战:减少 70% 重渲染次数

前言

如果说长列表卡是“肉眼可见的慢”,那重渲染问题就是那种:

页面不卡,但 CPU 飙高
操作没问题,但风扇狂转

而且这种问题,非常隐蔽

什么是“无意义的重渲染”?

简单说一句:

数据没变,但组件又 render 了一遍。

常见场景

  • 父组件 state 变化
  • 子组件全部跟着重新执行 setup / render
  • computed / watch 被反复触发

Vue 响应式是如何“牵一发动全身”的?

Vue 的响应式是依赖收集 + 派发更新

问题根源

conststate=reactive({user:{name:'',age:0},settings:{theme:'dark'}})

如果你在组件里这样用:

state.user.name

一旦state.user发生变化,整个依赖都会被标记为脏

computed / watch 用错,是性能杀手

错误示例

watch(state,()=>{doSomethingHeavy()},{deep:true})

问题:

  • 任意字段变化都会触发
  • 深度监听成本极高

正确做法

watch(()=>state.user.name,()=>{doSomething()})

监听越精确,性能越好。

v-memo:Vue 3 的“性能核武器”

v-memo可以直接告诉 Vue:

这个组件,只在某些依赖变化时才重新渲染。

示例

<div v-memo="[item.id]"> {{ item.name }} </div>

只要item.id不变,这个节点就不会重新渲染。

shallowRef:大对象的救命稻草

普通 ref

constdata=ref(hugeObject)

Vue 会递归追踪所有字段。

shallowRef

constdata=shallowRef(hugeObject)

只关心引用变化,不追踪内部结构

适合:

  • 大列表数据
  • 三方 SDK 返回对象
  • 不需要深度响应的数据

拆分组件粒度,才是真正的解法

问题代码

<BigList :list="list" />

父组件任何更新,BigList都会重新渲染。

优化思路

  • 拆成 Item 组件
  • 用 props 精确传递
  • 避免无关 state 传递

实战:减少 70% 重渲染次数

通过:

  • 精准 watch
  • v-memo
  • shallowRef
  • 组件拆分

实测:

  • render 次数下降 ~70%
  • CPU 占用明显下降
  • 页面交互更稳定
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 7:18:09

心电图AI分析终极指南:基于深度学习的完整解决方案

心电图AI分析终极指南&#xff1a;基于深度学习的完整解决方案 【免费下载链接】ecg-classification Code for training and test machine learning classifiers on MIT-BIH Arrhyhtmia database 项目地址: https://gitcode.com/gh_mirrors/ec/ecg-classification 心电图…

作者头像 李华
网站建设 2026/4/16 7:29:44

论文AI率太高?3款降AI软件实测对比,帮你一次过AIGC检测!

论文AIGC率过高是当前很多学生和研究者在论文写作中遇到的普遍问题。别慌&#xff0c;只要掌握正确的方法&#xff0c;完全可以将AI生成痕迹有效降低&#xff0c;顺利通过AIGC检测。 一、AIGC检测原理是什么&#xff1f; 为什么自己写的论文AIGC检测会超标&#xff0c;一个一…

作者头像 李华
网站建设 2026/5/1 7:19:01

冒泡排序,选择排序

从键盘输入一个字符串&#xff0c;分别用冒泡法和选择法对该字符串中的字符由小到大进行排序&#xff0c;并输出结果。 #include<stdio.h> int main() { char arr[9999]{},x; int i0,z; do { scanf("%c",&arr[i]); i; } while (arr[i-1]!’\n’); printf(“…

作者头像 李华
网站建设 2026/5/1 7:15:55

基于Springboot牙科就诊管理系统【附源码+文档】

&#x1f495;&#x1f495;作者&#xff1a; 米罗学长 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

作者头像 李华
网站建设 2026/5/1 2:27:06

基于Springboot学校物资管理系统【附源码+文档】

&#x1f495;&#x1f495;作者&#xff1a; 米罗学长 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;精通Java、小程序、数据库等。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xff0c;springboot等项目&#…

作者头像 李华