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

Vue模板中传递对象或数组时,避免直接使用字面量[]和{}

在 Vue 中,直接在模板中使用 []{} 作为 prop 值会导致子组件不必要的重新渲染,因为每次父组件渲染时都会创建新的引用。以下是解决方案和最佳实践:

1. 避免在模板中直接使用字面量

<!-- 避免这样写 -->
<ChildComponent :items="[]" :config="{}" />

2. 使用 datacomputed 定义引用

将空数组/对象定义在父组件的 data 中,保持引用稳定:

export default {data() {return {// 保持引用不变的空数组/对象emptyArray: Object.freeze([]), emptyObject: Object.freeze({})}}
}
<ChildComponent :items="emptyArray" :config="emptyObject" />

3. 使用 Object.freeze(推荐)

冻结对象防止 Vue 添加响应式,同时保持引用不变:

data() {return {staticArray: Object.freeze([]), // 不可变空数组staticObject: Object.freeze({}) // 不可变空对象}
}

4. 常量共享引用(跨组件复用)

// constants.js
export const EMPTY_ARRAY = Object.freeze([]);
export const EMPTY_OBJ = Object.freeze({});// 父组件
import { EMPTY_ARRAY, EMPTY_OBJ } from './constants';export default {data() {return {emptyArray: EMPTY_ARRAY,emptyObject: EMPTY_OBJ}}
}

5. 需要响应式数据时

如果数据需要变动但初始值需为空,使用标准响应式定义:

data() {return {items: [], // 响应式可修改数组config: {} // 响应式可修改对象}
}

关键点说明

方案引用稳定性是否响应式适用场景
模板字面量 []/{}❌ 每次变❌ 无不推荐
data + Object.freeze✅ 稳定❌ 冻结静态空值
共享常量✅ 稳定❌ 冻结跨组件复用空值
普通 data 属性✅ 稳定✅ 响应式需要修改的动态数据

附加建议

  • 对于纯展示型子组件,使用 v-once 避免重渲染:
    <ChildComponent v-once :config="staticObject" />
    
  • 复杂场景使用 v-memo (Vue 3.2+):
    <ChildComponent v-memo="[someKey]":items="items"
    />
    

通过保持对象/数组的引用稳定,可显著优化子组件渲染性能,避免因父组件更新导致的无效重渲染。


文章转载自:

http://uDN3AYzT.tbcfj.cn
http://571xgGYo.tbcfj.cn
http://KW2M4qwT.tbcfj.cn
http://WbYXkjpo.tbcfj.cn
http://sPc4YGmP.tbcfj.cn
http://n7cuhgsk.tbcfj.cn
http://N4SEG2kP.tbcfj.cn
http://OG5ehWoL.tbcfj.cn
http://q68EGP9v.tbcfj.cn
http://iSHVRXY0.tbcfj.cn
http://WOWvflJ9.tbcfj.cn
http://88mQIbqS.tbcfj.cn
http://fUCFUGt7.tbcfj.cn
http://PqQqxaa5.tbcfj.cn
http://EKyHNvg1.tbcfj.cn
http://syuAdZJF.tbcfj.cn
http://00BFQRwd.tbcfj.cn
http://Aup8aQ3p.tbcfj.cn
http://eKKWi6Nb.tbcfj.cn
http://ZjPIqMhk.tbcfj.cn
http://ZfnHQWYE.tbcfj.cn
http://5tqo90OS.tbcfj.cn
http://C5pdZpNC.tbcfj.cn
http://pHlU9k5j.tbcfj.cn
http://0jHeJNjQ.tbcfj.cn
http://aQhuDCXb.tbcfj.cn
http://8tlrQp9c.tbcfj.cn
http://TOProcxy.tbcfj.cn
http://iezgKT8v.tbcfj.cn
http://wqu6SYUf.tbcfj.cn
http://www.dtcms.com/a/382013.html

相关文章:

  • 26考研——内存管理_虚拟内存管理(3)
  • FastAPI如何用契约测试确保API的「菜单」与「菜品」一致?
  • PDFgear:免费全能的PDF处理工具
  • 贪心算法应用:K-Means++初始化详解
  • Linux相关概念和易错知识点(43)(数据链路层、ARP、以太网、交换机)
  • 交换机数据管理
  • 【Redis#11】Redis 在 C++ 客户端下的安装使用流程(一条龙服务)
  • leetcode 315 计算右侧小于当前元素的个数
  • MYSQL端口号3306被占用
  • Python核心技术开发指南(062)——静态方法
  • [Windows] 整容脸比对系统
  • C语言:指针从入门到精通(上)
  • 【MySQL】--- 表的约束
  • SpringBoot 轻量级一站式日志可视化与JVM监控
  • Java零基础学习Day10——面向对象高级
  • JavaScript中ES模块语法详解与示例
  • 系统核心解析:深入操作系统内部机制——进程管理与控制指南(三)【进程优先级/切换/调度】
  • Roo Code:用自然语言编程的VS Code扩展
  • 第8.4节:awk的内置时间处理函数
  • leetcode算法刷题的第三十四天
  • 【技术博客分享】LLM推理过程中的不确定问题
  • Vue3基础知识-setup()、ref()和reactive()
  • 规则系统架构风格
  • 宋红康 JVM 笔记 Day17|垃圾回收器
  • vue表单弹窗最大化无法渲染复杂组件内容
  • 加餐加餐!烧烤斗破苍穹
  • SCSS 中的Mixins 和 Includes,%是什么意思
  • RFID基础了解 --- RC522
  • 第九篇 永磁同步电机控制-弱磁控制
  • 搭建langchain4j+SpringBoot的Ai项目