news 2026/4/13 17:46:27

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/11 6:45:39

网盘直链下载助手:解锁高速下载的实用技巧

还在为网盘下载速度慢而烦恼吗&#xff1f;这款免费开源的网盘直链下载助手将彻底改变你的下载体验&#xff01;它能够将六大主流网盘的分享链接一键转换为真实下载地址&#xff0c;让你无需安装任何客户端即可享受快速下载的便捷。 【免费下载链接】baiduyun 油猴脚本 - 一个免…

作者头像 李华
网站建设 2026/4/11 22:00:02

PlugY插件:暗黑破坏神2单机体验的革命性增强

PlugY插件&#xff1a;暗黑破坏神2单机体验的革命性增强 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 当你在《暗黑破坏神II》的冒险旅程中因背包空间不足而被迫舍…

作者头像 李华
网站建设 2026/4/8 8:23:22

7个Maccy剪贴板管理器使用技巧:从新手到高手快速上手

7个Maccy剪贴板管理器使用技巧&#xff1a;从新手到高手快速上手 【免费下载链接】Maccy Lightweight clipboard manager for macOS 项目地址: https://gitcode.com/gh_mirrors/ma/Maccy Maccy是一款专为macOS设计的轻量级剪贴板历史管理工具&#xff0c;能够自动记录所…

作者头像 李华
网站建设 2026/4/11 4:45:21

GmsCore架构解构:从依赖注入到权限控制的逆向工程

问题的本质&#xff1a;为何需要重构Google服务框架&#xff1f; 【免费下载链接】GmsCore Free implementation of Play Services 项目地址: https://gitcode.com/GitHub_Trending/gm/GmsCore 当Android开发者试图摆脱Google生态的束缚时&#xff0c;一个根本性问题浮现…

作者头像 李华
网站建设 2026/4/8 12:24:54

D.二分查找-进阶——1385. 两个数组间的距离值

题目链接&#xff1a;1385. 两个数组间的距离值&#xff08;简单&#xff09; 算法原理&#xff1a; 大致思路与&#x1f447;相同&#xff0c;这题还稍微简单些 D.二分查找-进阶——2300. 咒语和药水的成功对数 解法&#xff1a;二分查找 对于arr1中的每一个元素x&#xff0c;…

作者头像 李华