ref和reactive的区别

1. 基本概念

ref

  • 用于包装基本类型数据(string、number、boolean等)
  • 也可以包装对象,但内部会转换为reactive
  • 通过.value访问和修改值

reactive

  • 只能用于对象类型(Object、Array、Map、Set等)
  • 直接访问和修改属性,不需要.value

2. 使用方式对比

javascript 复制代码
import { ref, reactive } from 'vue'

// ref 使用方式
const count = ref(0)
console.log(count.value) // 0
count.value++

const user = ref({ name: 'John', age: 25 })
console.log(user.value.name) // 'John'
user.value.age = 26

// reactive 使用方式
const state = reactive({ count: 0, name: 'John' })
console.log(state.count) // 0
state.count++

const list = reactive([1, 2, 3])
list.push(4)

3. 主要区别

数据类型支持

  • ref: 支持所有类型(基本类型 + 对象类型)
  • reactive: 只支持对象类型

访问方式

  • ref: 需要.value(在模板中自动解包)
  • reactive: 直接访问属性

解构和赋值

javascript 复制代码
// ref 可以解构
const { count } = toRefs(user) // 保持响应性

// reactive 解构会失去响应性
const { count } = state // 失去响应性
const count = state.count // 失去响应性

模板中的使用

javascript 复制代码
<template>
  <!-- ref 在模板中自动解包 -->
  <div>{{ count }}</div>
  
  <!-- reactive 直接使用 -->
  <div>{{ state.count }}</div>
</template>

4. 选择建议

使用 ref 的场景:

  • 基本类型数据
  • 需要解构的响应式数据
  • 简单的状态管理

使用 reactive 的场景:

  • 复杂对象状态
  • 表单数据
  • 不需要解构的对象

5. 实际示例

javascript

javascript 复制代码
// 推荐:基本类型用 ref
const isLoading = ref(false)
const errorMessage = ref('')

// 推荐:对象用 reactive
const formData = reactive({
  username: '',
  email: '',
  password: ''
})

// 或者用 ref 包装对象
const userInfo = ref({
  name: '',
  age: 0
})

总的来说,ref更灵活,reactive更简洁。选择哪个主要看你的具体使用场景和偏好!

相关推荐
MATLAB代码顾问34 分钟前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
万粉变现经纪人2 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒2 小时前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼2 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
小郑加油3 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦3 小时前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
kyriewen3 小时前
代码写成一锅粥?3个设计模式让你的项目“起死回生”
前端·javascript·设计模式
不会敲代码14 小时前
从零搭建 AI 日记助手:用 Milvus 向量数据库实现语义搜索
javascript·openai
KuaCpp4 小时前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy4 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言