Vue3中定义变量是选择ref还是reactive?

简介: Vue3中定义变量是选择ref还是reactive?

Ref 与reactive

在 Vue 3 中,reactiveref 是用于创建响应式数据的两个不同的 API。它们都是 Vue 3 Composition API 的一部分。

ref

ref 用于创建一个包装基本数据类型的响应式对象。它接受一个初始值,并返回一个包含 value 属性的对象。ref 主要用于包装基本数据类型,如数字、字符串等。


import { ref } from 'vue';

const count = ref(0);

// 读取值
console.log(count.value); // 输出: 0

// 修改值
count.value += 1;
console.log(count.value); // 输出: 1

reactive

reactive 用于创建一个包装普通对象的响应式对象。它接受一个普通对象,并返回一个代理对象,该代理对象中的属性都是响应式的。


import { reactive } from 'vue';

const user = reactive({
  name: 'John',
  age: 30,
});

// 读取值
console.log(user.name); // 输出: John

// 修改值
user.age += 1;
console.log(user.age); // 输出: 31

区别:

  1. 「数据类型:」
  • ref 主要用于包装基本数据类型,如数字、字符串等。
  • reactive 主要用于包装普通对象。
  1. 「访问属性:」
  • ref 中,你需要通过 .value 访问和修改值。
  • reactive 中,直接访问和修改对象的属性即可。
  1. 「用例:」
  • ref 通常用于单一值,如计数器、标志等。
  • reactive 通常用于包装对象,用于表示具有多个属性的数据。

import { ref, reactive } from 'vue';

// 使用 ref
const count = ref(0);
count.value += 1;

// 使用 reactive
const user = reactive({
  name: 'John',
  age: 30,
});
user.age += 1;

为什么同时存在 ref()、reactive()?

refreactive 虽然都用于创建响应式对象,但它们在设计和用途上有一些区别,适用于不同的场景。理解这些差异有助于更好地选择合适的 API。

  1. 「单一值 vs. 对象:」
const count = ref(0); // 单一值
const user = reactive({ name: 'John', age: 30 }); // 对象
  • ref 主要用于包装基本数据类型,如数字、字符串等,以及需要单一值的情况。
  • reactive 用于包装普通对象,对于需要表示多个属性的数据结构。
  1. 「访问方式:」
// 使用 ref
count.value += 1;

// 使用 reactive
user.age += 1;
  • ref 中,你需要通过 .value 访问和修改值。
  • reactive 中,直接访问和修改对象的属性即可。
  1. 「响应式原理:」
  • ref 通过 Vue 3 提供的 ref 函数实现,它为基本数据类型提供了轻量级的响应式封装。
  • reactive 通过 Vue 3 提供的 reactive 函数实现,它使用 Proxy 对象来实现对整个对象的深层次响应式封装。
  1. 「用例和场景:」
  • ref 适用于简单的值或在模板中需要直接使用的值。
  • reactive 适用于表示复杂数据结构,需要处理多个属性的情况,尤其是在逻辑层面需要进行深层次的数据操作时。
import { ref, reactive } from 'vue';

// 使用 ref
const count = ref(0);
count.value += 1;

// 使用 reactive
const user = reactive({ name: 'John', age: 30 });
user.age += 1;

虽然在某些简单的场景中使用 ref 就足够了,但当处理更复杂的数据结构时,尤其是需要进行深层次的数据操作时,reactive 提供了更强大的功能。选择使用哪个 API 取决于你的具体需求和项目的复杂性。

ref与普通变量的区别

ref 在 Vue 3 的 Composition API 中被引入,它主要用于创建响应式对象,尤其是用于包装基本数据类型的响应式对象。相比于普通变量,ref 具有一些特别的支持和行为:

  1. 「响应式变化检测:」
  • ref 创建的对象是响应式的,意味着当其值发生变化时,相关的视图会进行更新。
  • 普通变量在 Vue 2 中没有内置的响应式支持,需要使用 Object.definePropertyVue.set 手动进行响应式处理。
  1. .value 访问和修改:」
  • 在使用 ref 创建的响应式对象中,需要通过 .value 访问和修改值。
  • 这是因为 ref 的设计初衷是为了确保在模板中使用变量时能够区分变量本身和它的值。因此,直接操作 ref 对象会导致一些问题,必须使用 .value


const count = ref(0);
console.log(count.value); // 读取值
count.value += 1; // 修改值
  1. 「自动解包:」
  • 在模板中使用 ref 变量时,Vue 3 会自动解包,直接访问变量值,而不需要显式使用 .value
  • 这样可以在模板中获得更自然的语法。
<!-- 在模板中自动解包 -->
<template>
  <div>{{ count }}</div>
</template>
  1. ref 函数:」
  • ref 函数是 Vue 3 提供的 API,用于创建一个包装基本数据类型的响应式对象。这个函数的使用方式使得 Vue 能够更轻松地追踪数据的变化。
  • 普通变量在 Vue 2 中不具备这种直接的响应式支持,需要额外的处理来使其响应式。

「注意」在 Vue 3 中当你将 ref 对象传递到模板(<template>)中时,会自动解包,无需额外使用 .value。这是 Vue 3 的一个改进,旨在提供更自然的语法。

以下是一个示例,演示了在模板中传递和使用 ref 对象的情况:

<!-- ParentComponent.vue -->
<template>
  <div>
    <p>Parent Component: {{ myRef }}</p>
    <ChildComponent :childRef="myRef" />
  </div>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

export default {
  components: {
    ChildComponent,
  },
  setup() {
    const myRef = ref('Hello from Parent');
    return {
      myRef,
    };
  },
};
</script>

<!-- ChildComponent.vue -->
<template>
  <div>
    <p>Child Component: {{ childRef }}</p>
    <button @click="updateValue">Update in Child</button>
  </div>
</template>

<script>
import { defineComponent } from 'vue';

export default defineComponent({
  props: {
    childRef: {
      type: Object,
      required: true,
    },
  },
  methods: {
    updateValue() {
      // 在子组件中通过 .value 修改值
      this.childRef.value = 'Updated in Child';
    },
  },
});
</script>

小结

到底选择哪个要综合考虑你的数据结构和使用场景,选择适当的响应式 API。在实际开发中,你可能会同时使用 ref 和 reactive,根据不同的情况选择不同的响应式对象。

目录
相关文章
|
2天前
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
13 3
|
27天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
32 8
|
27天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
30 1
|
27天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
36 1
|
1月前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
7天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
41 1
vue学习第一章
|
1月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
30 1
|
1月前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
38 1
vue学习第四章
|
1月前
|
JavaScript 前端开发 算法
vue学习第7章(循环)
欢迎来到瑞雨溪的博客,一名热爱JavaScript和Vue的大一学生。本文介绍了Vue中的v-for指令,包括遍历数组和对象、使用key以及数组的响应式方法等内容,并附有综合练习实例。关注我,将持续更新更多优质文章!🎉🎉🎉
25 1
vue学习第7章(循环)