当前位置: 首页 > 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 响应式系统的优势。

相关文章:

  • 洛科威岩棉板打造宁静空间,为业主构筑建筑“静世界”
  • 数据结构与算法分析课设:一元多项式求值
  • 【MySQL】JDBC编程
  • DDL-8-小结
  • 前端开发面试题总结-原生小程序部分
  • LLaMA-Factory支持的Alpaca和ShareGPT格式
  • 插入排序的简单介绍
  • 【算法】动态规划 70: 爬楼梯
  • 函数在球内恒为零的证明
  • 杭州燕壹画室:美术艺考领域新崛起的黑马画室
  • Kotlin空安全与异常处理
  • Apache Seata < 2.3.0 raft反序列化漏洞
  • 使用Dirichlet分布进行随机初始化
  • Hily×亚矩云手机:社交元宇宙的“云端心跳加速器”
  • mysql mvcc
  • (4)pytest-fixture
  • Webpack原理剖析与实现
  • Hive SQL 实战:电商销售数据分析全流程案例
  • 【指针与结构体的使用详解】
  • nis打包(HM NIS EDIT脚本编辑器)