Vue3中ref和reactive的区别及说明

 更新时间:2024年11月06日 09:06:59   作者:合格的程序员  
在Vue3中,ref主要用于基本数据类型和单个数据管理,需要用.value访问,reactive适用于对象和多数据管理,直接访问属性,ref支持解构保持响应性,reactive解构后失去响应性,选择合适的方法可以使代码更优化

Vue3 ref和reactive的区别

在 Vue 3 中,refreactive 都是用来创建响应式数据的方法

但它们有以下主要区别:

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. 使用建议

  1. 使用 ref 的场景:
    • 基本数据类型的响应式
    • 需要解构的响应式数据
    • 单个响应式数据的管理
const count = ref(0)
const message = ref('hello')
const isVisible = ref(true)
  1. 使用 reactive 的场景:
    • 复杂对象的响应式
    • 多个相关数据的组合
    • 不需要解构的数据管理
const state = reactive({
  user: {
    name: 'Tom',
    age: 18
  },
  settings: {
    theme: 'dark',
    notifications: true
  }
})
  1. 混合使用:
    • 可以在 reactive 对象中使用 ref
    • 使用 toRefs 转换 reactive 对象为 ref
const state = reactive({
  count: ref(0),
  user: {
    name: ref('Tom'),
    age: ref(18)
  }
})

// 转换为 ref
const { count, user } = toRefs(state)

通过理解这些区别,你可以根据具体场景选择合适的响应式方案,使代码更加清晰和易于维护。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue.js使用axios动态获取response里的data数据操作

    Vue.js使用axios动态获取response里的data数据操作

    这篇文章主要介绍了Vue.js使用axios动态获取response里的data数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 浅谈VUE uni-app 核心知识

    浅谈VUE uni-app 核心知识

    这篇文章主要给大家介绍了关于uniapp的核心知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • Vue中对watch的理解(关键是immediate和deep属性)

    Vue中对watch的理解(关键是immediate和deep属性)

    watch侦听器,是Vue实例的一个属性,是用来响应数据的变化,需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的,这篇文章主要介绍了Vue中对watch的理解,需要的朋友可以参考下
    2022-11-11
  • vue3组合式api创建单文件组件的写法

    vue3组合式api创建单文件组件的写法

    Vue3 中的 Composition API 是一种新的编写组件逻辑的方式,它提供了更好的代码组织、类型推导、测试支持和复用性,本文为大家介绍了vue3利用组合式api创建单文件组件的方法,感兴趣的可以了解下
    2023-08-08
  • VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)

    VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)

    本篇文章主要介绍了VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮),具有一定的参考价值,有兴趣的可以了解一下
    2017-08-08
  • Vue.js计算属性computed与watch(5)

    Vue.js计算属性computed与watch(5)

    这篇文章主要为大家详细介绍了Vue.js计算属性computed与watch,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • Vue结合Element-Plus封装递归组件实现目录示例

    Vue结合Element-Plus封装递归组件实现目录示例

    本文主要介绍了Vue结合Element-Plus封装递归组件实现目录示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • vue实现复制文字复制图片实例详解

    vue实现复制文字复制图片实例详解

    这篇文章主要为大家介绍了vue实现复制文字复制图片实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 解决vue中修改了数据但视图无法更新的情况

    解决vue中修改了数据但视图无法更新的情况

    今天小编就为大家分享一篇解决vue中修改了数据但视图无法更新的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • vue+element实现批量删除功能的示例

    vue+element实现批量删除功能的示例

    下面小编就为大家分享一篇vue+element实现批量删除功能的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02

最新评论