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

Vue3组件响应式优化方法

在 Vue 3 中,将组件实例或组件定义存储在响应式对象中会导致不必要的性能开销。以下是解决该问题的步骤:

问题原因

  • 响应式对象中的组件:将组件直接放入 reactive 或 ref 中,Vue 会尝试将其转换为响应式代理,而组件本身不需要响应式处理。

解决方案

  1. 使用 markRaw 标记组件
    在将组件添加到响应式对象前,用 markRaw 包裹组件,标记其为“非响应式”:

    javascript

    import { reactive, markRaw } from 'vue'
    import Management from './Management.vue'
    
    const menus = reactive([
      {
        name: 'Management',
        component: markRaw(Management), // 标记组件为非响应式
        // 其他属性...
      }
    ])
  2. 使用 shallowRef 替代 ref
    如果数据结构的顶层需要响应式,但内部属性(如组件)不需要深度响应,使用 shallowRef

    javascript

    import { shallowRef } from 'vue'
    import Management from './Management.vue'
    
    const menus = shallowRef([
      {
        name: 'Management',
        component: Management, // 无需深度响应
        // 其他属性...
      }
    ])
  3. 检查动态渲染组件的位置
    确保在模板中通过 :is 动态绑定的组件未被响应式代理:

    vue

    <template>
      <el-sub-menu>
        <template #title>
          <!-- 确保 component 属性已用 markRaw 处理 -->
          <component :is="item.component" />
        </template>
      </el-sub-menu>
    </template>

修改示例

假设在菜单配置中引用了组件:

修改前(触发警告):

javascript

import { reactive } from 'vue'
import Management from './Management.vue'

const menus = reactive([
  { name: 'Management', component: Management }
])

修改后(解决问题):

javascript

import { reactive, markRaw } from 'vue'
import Management from './Management.vue'

const menus = reactive([
  { 
    name: 'Management', 
    component: markRaw(Management) // 标记组件为非响应式
  }
])

总结

  • 关键点:避免组件被 Vue 的响应式系统深度代理。

  • 方法选择

    • 如果数据结构本身需要响应式,但组件不需要 → 使用 markRaw

    • 如果顶层响应式足够 → 使用 shallowRef

http://www.dtcms.com/a/98999.html

相关文章:

  • Visual Studio 2022静态库与动态库创建及使用完全指南
  • Gerbv 与 Python 协同:实现 Gerber 文件智能分析与制造数据自动化
  • 知能行每日综测
  • vue.js前端条件渲染指令相关知识点
  • AI 时代,我们该如何写作?
  • MySQL———作业实验
  • Java进阶
  • 记录vite引入sass预编译报错error during build: [vite:css] [sass] Undefined variable.问题
  • MySQL的基础语法1(增删改查、DDL、DML、DQL和DCL)
  • HTML5 Web SQL 数据库学习笔记
  • 通信之光纤耦合器
  • cookie详解
  • comp2123 RangeFunc matrix
  • k8s网络策略
  • 从零开始搭建Anaconda环境
  • 网易邮箱DolphinScheduler迁移实战:从部署到优化,10倍效率提升的内部经验
  • plantsimulation编辑图标怎么把图标旋转90°
  • 1.3-网站架构、Web源码形式
  • 全局思维与系统思考
  • Python Cookbook-4.14 反转字典
  • Python小练习系列 Vol.8:组合总和(回溯 + 剪枝 + 去重)
  • 自动语音识别(ASR)技术详解
  • VLAN综合实验二
  • Dart的变量以及内建类型
  • Megatron-LM中的deepseek-v3实现
  • 深度学习在测距模型中的应用
  • Redis 源码硬核解析系列专题 - 第三篇:核心数据结构之字典(Dict)
  • 未来村庄智慧灯杆:点亮乡村智慧生活​
  • Python列表(三)
  • 【Linux】B站黑马程序视频学习笔记(一)