vue3 ref和reactive的区别
在 vue 3 中,ref 和 reactive 都是用来创建响应式数据的方法
但它们有以下主要区别:
1. 使用场景不同
ref:
- 主要用于基本数据类型(string、number、boolean 等)
- 也可以用于对象/数组,但需要通过
.value访问 - 适合单个响应式数据的管理
import { ref } from 'vue'
// 基本类型
const count = ref(0)
console.log(count.value) // 0
// 对象类型
const user = ref({
name: 'tom',
age: 18
})
console.log(user.value.name) // 'tom'reactive:
- 主要用于对象类型(object、array)
- 直接访问属性,不需要
.value - 适合多个响应式数据的管理
import { reactive } from 'vue'
const state = reactive({
name: 'tom',
age: 18,
hobbies: ['reading', 'swimming']
})
console.log(state.name) // 'tom'2. 访问方式不同
ref:
- 在 setup 中需要通过
.value访问 - 在模板中自动解包,直接使用
<script setup>
import { ref } from 'vue'
const count = ref(0)
// setup 中需要 .value
const increment = () => {
count.value++
}
</script>
<template>
<!-- 模板中直接使用,不需要 .value -->
<div>{{ count }}</div>
</template>reactive:
- 直接访问属性,不需要
.value - 在模板和 setup 中的访问方式相同
<script setup>
import { reactive } from 'vue'
const state = reactive({
count: 0
})
// 直接访问
const increment = () => {
state.count++
}
</script>
<template>
<!-- 直接访问 -->
<div>{{ state.count }}</div>
</template>3. 解构行为不同
ref:
- 支持解构,解构后仍然保持响应性
- 可以使用
torefs将 reactive 对象的属性转换为 ref
import { ref, torefs } from 'vue'
const user = reactive({
name: ref('tom'),
age: ref(18)
})
// ref 解构后保持响应性
const { name, age } = torefs(user)
name.value = 'jerry' // 仍然是响应式的reactive:
- 解构后会失去响应性
- 需要使用
torefs保持响应性
import { reactive } from 'vue'
const state = reactive({
name: 'tom',
age: 18
})
// 直接解构会失去响应性
const { name, age } = state
name = 'jerry' // 不再是响应式的
// 使用 torefs 保持响应性
const { name, age } = torefs(state)
name.value = 'jerry' // 仍然是响应式的4. 使用建议
- 使用 ref 的场景:
- 基本数据类型的响应式
- 需要解构的响应式数据
- 单个响应式数据的管理
const count = ref(0)
const message = ref('hello')
const isvisible = ref(true)- 使用 reactive 的场景:
- 复杂对象的响应式
- 多个相关数据的组合
- 不需要解构的数据管理
const state = reactive({
user: {
name: 'tom',
age: 18
},
settings: {
theme: 'dark',
notifications: true
}
})- 混合使用:
- 可以在 reactive 对象中使用 ref
- 使用
torefs转换 reactive 对象为 ref
const state = reactive({
count: ref(0),
user: {
name: ref('tom'),
age: ref(18)
}
})
// 转换为 ref
const { count, user } = torefs(state)通过理解这些区别,你可以根据具体场景选择合适的响应式方案,使代码更加清晰和易于维护。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论