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

如何在Vue3中正确使用ref和reactive?

在 Vue3 中正确使用 refreactive 需要根据场景选择合适的方式,以下是核心要点:


1. 基础使用场景

(1)ref 适用情况
  • 基本类型数据(字符串/数字/布尔值)
  • 需要重新赋值的对象引用
  • 模板中自动解包(无需 .value
const count = ref(0); // 基本类型
const user = ref({ name: 'Alice' }); // 对象类型
(2)reactive 适用情况
  • 复杂对象/数组(嵌套结构)
  • 不需要整体替换的对象
  • 需要直接修改属性的场景
<template><div>实际参数{{msgObj.content}}</div><div><button @click="handleClick">点击</button></div>
</template><script setup lang="ts">
import {reactive,ref} from "vue";
interface  MsgObj {content: String
}
const msgObj:MsgObj = reactive({content: ref('hi! js')})function handleClick () {msgObj.content += ' yes'
}
</script>

2. 关键差异对比

特性refreactive
数据访问脚本中需 .value直接访问属性
响应性保持解构后仍响应需配合 toRefs 保持响应性
重新赋值支持(.value = newValue需用 Object.assign 合并

3. 混合使用最佳实践

(1)组合式函数封装
function useFeature() {const loading = ref(false); // 基本类型用refconst data = reactive({     // 复杂对象用reactiveitems: [],pagination: { page: 1 }});const fetchData = async () => {loading.value = true;// 请求逻辑...Object.assign(data.pagination, res.pagination); // 合并更新};return { loading, ...toRefs(data), fetchData }; // 返回解构响应数据
}
(2)表单处理示例
const form = reactive({name: ref(''), // 基本类型字段用refaddress: reactive({ // 嵌套对象用reactivecity: 'Beijing',street: ''})
});

4. 常见问题解决方案

  • reactive 解构丢失响应性

    const state = reactive({ count: 0 });
    const { count } = toRefs(state); // 保持响应
    
  • 模板中自动解包

    <template>{{ count }} <!-- ref自动解包 -->{{ state.list }} <!-- reactive直接访问 -->
    </template>
    
  • 类型提示(TS)

    const count = ref<number>(0); // 显式泛型
    interface State {list: string[];
    }
    const state = reactive<State>({ list: [] });
    

5. 选择建议

  • 优先 ref:基本类型、需要重新赋值的变量
  • 优先 reactive:复杂对象、表单嵌套结构
  • 避免混用:同一数据源不要同时使用两种方式

通过合理组合使用,可以充分发挥 Vue3 响应式系统的优势。

http://www.xdnf.cn/news/14905.html

相关文章:

  • 2025年数据可视化十大创新趋势
  • 【分布式】自定义统一状态机流转设计
  • 【Pandas】pandas DataFrame Flags
  • Java开发新变革!飞算JavaAI深度剖析与实战指南
  • 【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
  • 网络拓扑图绘制全流程:从架构解析到工具实战
  • CAU数据挖掘 支持向量机
  • AI 情感陪伴的乱与治:在困境中探寻未来航道
  • Windows如何安装beego环境问题解
  • Android Telephony 网络状态中的 NAS 信息
  • API接口安全-2:签名、时间戳与Token如何联手抵御攻击
  • 后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端+前端
  • vue-33(实践练习:使用 Nuxt.js 和 SSR 构建一个简单的博客)
  • LabVIEW键盘鼠标监测控制
  • SpringBoot 启动入口深度解析:main方法执行全流程
  • 颠覆传统加密:微算法科技创新LSQb算法,提升量子图像处理速度
  • 【debug日记】解决 Conda 激活命令未正确配置的问题
  • Redis学习笔记——黑马点评 附近商铺到UV统计 完结
  • Tomcat 安装使用教程
  • 机电一体化论文写作实战指南:从创新设计到工程验证的完整路径
  • 学习使用dotnet-dump工具分析.net内存转储文件(3)
  • OpenCV学习3
  • Java面试宝典:基础三
  • 学习React官方文档(描述UI)
  • 《弦论视角下前端架构:解构、重构与无限延伸的可能》
  • mapstate
  • OSPF(开放最短路径优先)
  • 【NLP 实战】蒙古语情感分析:从 CNN 架构设计到模型训练的全流程解析(内附项目源码及模型成果)
  • 认知智能平台搭载LLM+RAG,重构行业洞察与决策支持体系!
  • 实战四:基于PyTorch实现猫狗分类的web应用【2/3】