首页 > 其他分享 >Vue 中ref()与 reactive() 的区别

Vue 中ref()与 reactive() 的区别

时间:2024-07-15 16:34:10浏览次数:16  
标签:Vue 响应 对象 value reactive user ref

在 Vue 3 中,组合式 API(Composition API)引入了新的响应式系统,使得状态管理和逻辑复用变得更加灵活和强大。ref()reactive() 是组合式 API 中两个重要的响应式工具,它们各自有不同的使用场景和特性。在这篇博客中,我们将深入探讨 ref()reactive() 的区别,并通过代码示例展示它们的实际应用。

ref()reactive() 的基本概念

ref()

ref() 用于创建一个包含单一值的响应式引用。它可以是基本类型(如字符串、数字、布尔值)或对象类型。ref() 返回一个包含 .value 属性的对象,.value 属性持有实际的值。

reactive()

reactive() 用于创建一个响应式对象。它接收一个普通的 JavaScript 对象,并返回该对象的响应式代理。与 ref() 不同,reactive() 直接返回对象本身,而不是包装在 .value 属性中。

使用场景

ref() 的使用场景

ref() 适用于以下场景:

  1. 基本类型的响应式数据: 当你需要创建一个基本类型的响应式数据时,使用 ref() 是最合适的选择。
  2. 单一值的响应式数据: 当你只需要一个单一值的响应式数据时,ref() 是一个简单而直接的选择。

reactive() 的使用场景

reactive() 适用于以下场景:

  1. 复杂对象的响应式数据: 当你需要创建一个包含多个属性的复杂对象时,使用 reactive() 更加自然和方便。
  2. 嵌套对象的响应式数据: reactive() 可以处理嵌套对象,并确保所有嵌套属性都是响应式的。

代码示例

使用 ref()

以下是一个使用 ref() 的示例:

<template>
  <div>
    <h1>Counter</h1>
    <p>{{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

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

export default {
  setup() {
    const count = ref(0);

    const increment = () => {
      count.value++;
    };

    return {
      count,
      increment
    };
  }
};
</script>

在这个示例中,我们使用 ref() 创建了一个响应式的 count 变量,并通过 .value 属性访问和修改它。

使用 reactive()

以下是一个使用 reactive() 的示例:

<template>
  <div>
    <h1>User Profile</h1>
    <p>Name: {{ user.name }}</p>
    <p>Age: {{ user.age }}</p>
    <button @click="updateProfile">Update Profile</button>
  </div>
</template>

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

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

    const updateProfile = () => {
      user.name = 'Jane Doe';
      user.age = 25;
    };

    return {
      user,
      updateProfile
    };
  }
};
</script>

在这个示例中,我们使用 reactive() 创建了一个响应式的 user 对象,并直接修改其属性。

深入理解 ref()reactive()

响应式转换

  • ref() 创建的响应式数据是通过 Ref 对象实现的,只有 .value 属性是响应式的。
  • reactive() 创建的响应式数据是通过 Proxy 对象实现的,整个对象及其嵌套属性都是响应式的。

解构问题

当我们解构 reactive() 创建的对象时,会丢失响应性:

const { name, age } = user; // 这样解构会丢失响应性

解决方法是使用 toRefs()

import { toRefs } from 'vue';

const { name, age } = toRefs(user);

ref() 创建的单一值在解构时不会有这个问题,因为它本身就是一个响应式引用。

性能考虑

在处理大量数据或复杂对象时,reactive() 的性能可能比 ref() 更高,因为 reactive() 使用 Proxy 对象进行响应式转换,而 ref() 需要通过 .value 属性访问和修改值。

总结

ref()reactive() 是 Vue 3 组合式 API 中两个重要的响应式工具,它们各自有不同的使用场景和特性。ref() 适用于基本类型和单一值的响应式数据,而 reactive() 适用于复杂对象和嵌套对象的响应式数据。通过理解它们的区别和使用方法,我们可以更灵活地管理 Vue 组件中的状态,提高代码的可读性和维护性。

百万大学生都在用的AI写论文工具,篇篇无重复

标签:Vue,响应,对象,value,reactive,user,ref
From: https://www.cnblogs.com/zhizu/p/18303400

相关文章

  • Vite + Vue 3 + Electron 中 Express 的集成指南
    在Vite+Vue3+Electron中使用Express在现代前端开发中,Vite和Vue3提供了快速的开发体验,而Electron则使得我们能够构建跨平台的桌面应用程序。有时,我们需要在Electron应用中集成一个后端服务器来处理复杂的逻辑或与数据库交互。Express是一个轻量级且灵活的Node.j......
  • 全面掌握 Vue 路由:从基础到进阶
    标题:全面掌握Vue路由:从基础到进阶在现代前端开发中,单页面应用(SPA)已经成为主流,而路由作为SPA的核心功能之一,起着至关重要的作用。Vue.js作为一个流行的前端框架,其官方路由库vue-router提供了强大且灵活的路由管理功能。本文将深入探讨Vue路由的使用,包括基础配置、动态路......
  • d3.js+vue生成动力图
    本文主要实现了动力图中:    节点的显示;        节点与节点之间关系的连接,以及对应的关系类型的显示;    节点的拖拽;    图谱的缩放1.先上效果:2.以下是完整的代码部分:<template><divref="chart"className="ggraph"></div></templ......
  • 【vue深入学习第2章】Vue.js 中的 Ajax 处理:vue-resource 库的深度解析
    Vue.js中的Ajax处理:vue-resource库的深度解析在现代前端开发中,Ajax请求是与后端进行数据交互的关键技术。Vue.js作为一个渐进式JavaScript框架,提供了多种方式来处理Ajax请求,其中vue-resource是一个较为常用的库。尽管vue-resource在Vue2.x之后不再是官方推荐的......
  • 2024-07-15 记录一则vue网站优化的小技巧
    vite+vue+某框架写的网站可以通过配置vite.config.js中的build.rollupOptions.output.manualChunks来手动分割指定的包到指定的文件夹内,然后在网站入口文件按照需求引入比如:build:{rollupOptions:{output:{manualChunks:{antd......
  • vue3中的props和emit
    首先我们要明确props和emit是在父子组件(嵌套组件)中使用的。想要在父组件中渲染出子组件里的内容,需要在父组件中导入子组件,并在模板中渲染子组件。那父子组件中如何通信呢?就需要使用到props和emit。props当子组件要接受父组件传递的数据信息时,也可以说是父组件传递数据给子......
  • vue ui + 项目创建 (基于vue脚手架创建项目)
    =======================注意全程都不要关闭cmd窗口========================= 在想要创建项目的文件目录输入cmd回车,再输入vueui (如果出现报错,可能是因为有hadoop,存在hadoop的环境变量会报错,但也能打开网页)出现下图创建——》在此创建新项目 如下图,项目名不要有中文......
  • Spring Boot Vue 毕设系统讲解 11【协同过滤方法教学】
    目录1.基础知识用户基于的协同过滤(User-basedCF)物品基于的协同过滤(Item-basedCF)优缺点实际应用2.项目功能实战1.基础知识协同过滤(CollaborativeFiltering,CF)是一种广泛应用于推荐系统中的算法,它通过分析和利用用户与物品之间的交互信息来发现用户可能感兴趣......
  • 【vue深入学习第1章】探索 Vue 2 的生命周期:从创建到销毁
    Vue.js是一个渐进式的JavaScript框架,用于构建用户界面。理解Vue的生命周期是掌握这个框架的关键之一。在这篇博客中,我们将深入探讨Vue2的生命周期,并通过代码示例来展示每个生命周期钩子的作用。Vue实例的生命周期Vue实例的生命周期可以分为四个主要阶段:创建阶段:初始......
  • Vue3+Element Plus 使用sortablejs对el-table表格进行拖拽
    sortablejs官网:点击跳转一、安装sortablejsnpminstallsortablejs--save二、 页面按需引入importSortablefrom'sortablejs';三、组件方法1.temlate:<template><el-tableref="tableHeader":data="tableData"row-key="id"style=&quo......