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

如何在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.lqws.cn/news/582967.html

相关文章:

  • 详解Kafka如何保证消息可靠性
  • 海康相机总是抓取前一帧图像
  • 基于MATLAB的SVM支持向量机的乳腺癌分类方法应用
  • docker安装RabbitMQ,创建RabbitMQ容器
  • Reactor 瞬态错误
  • 企业自建云概念解读|私有云、专有云、混合云、分布式云、企业云
  • go 语言大小写SpecialCase转换
  • window显示驱动开发—全屏模式
  • [论文阅读] Neural Architecture Search: Insights from 1000 Papers
  • Apache Seata < 2.3.0 raft反序列化漏洞
  • Clickhouse源码分析-TTL执行流程
  • 【Debian】1- 安装Debian到物理主机
  • 解决 VS Code Remote-SSH “无法安装 VS Code 服务器“ 错误的完整指南
  • 【RTSP从零实践】3、实现最简单的传输H264的RTSP服务器
  • 刚体模拟的核心流程:从物理建模到计算执行的全步骤解析
  • PCL点云库入门(第21讲)——PCL库点云特征之RSD特征描述Radius-based Surface Descriptor(RSD)
  • java JNDI高版本绕过 工具介绍 自动化bypass
  • jvm的调优命令jstack打印堆栈信息阐述以及调优
  • Android 四大组件
  • [6-02-01].第05节:配置文件 - YAML配置文件语法
  • xml.etree.ElementTree.ParseError: parsing finished: 错误原因定位
  • [创业之路-453]:企业经营层 - 红海思维 VS 蓝海思维全方位比较
  • vue中表尾合计
  • python训练day45 Tensorborad使用介绍
  • 【数据挖掘】数据挖掘综合案例—银行精准营销
  • UserWarning: Module “zipline.assets“ not found解决方法
  • 自由学习记录(65)
  • ThreadLocal、InheritableThreadLocal与TransmittableThreadLocal深度解析
  • 【Linux】网络基础
  • Git 常用命令、常用错误的总结