Vue 中的 ref 与 reactive:让你的应用更具响应性(上)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 介绍 ref 与 reactive 的背景和重要性
  • 二、 ref 的基本概念
    • 解释 ref 的定义和作用
    • 展示如何创建和使用 ref
    • 讨论 ref 的一些常见用例
  • 三、 reactive 的基本概念
    • 解释 reactive 的定义和作用
    • 展示如何创建和使用 reactive 对象
    • 讨论 reactive 的一些常见用例

一、引言

介绍 ref 与 reactive 的背景和重要性

refreactive 是 Vue 3 中引入的新特性,它们的背景和重要性如下:

  1. ref 的背景和重要性:
  • 在 Vue 2 中,通过使用 v-bindv-on 等指令来实现数据的双向绑定。但是,在某些情况下,需要直接操作 DOM 元素或组件实例,这时候就需要使用 ref 属性。
  • ref 允许你通过引用的方式访问 DOM 元素或组件实例,从而方便地进行直接操作。在 Vue 3 中,ref 有了一些改进,它现在可以引用任何类型的值,包括组件实例、函数、对象等。
  1. reactive 的背景和重要性:
  • 在 Vue 2 中,响应式系统是基于对象的属性监听实现的。当一个对象的属性发生变化时,Vue 会自动触发更新。
  • 然而,在某些情况下,需要对一个基本数据类型的值进行响应式处理,这时候就需要使用 reactive 方法。
  • reactive 方法可以将一个基本数据类型的值转换为响应式对象,从而使其能够参与到 Vue 的响应式系统中。

总的来说,refreactive 都是 Vue 3 中重要的新特性,它们提供了更强大和灵活的方式来处理 DOM 元素和数据,从而提高了开发效率和代码质量。

二、 ref 的基本概念

解释 ref 的定义和作用

在 Vue 3 中,ref 用于引用 DOM 元素或组件实例。它允许你通过引用的方式直接访问和操作 DOM 元素或组件实例。

ref 的定义如下:

const ref = Vue.createRef()

const ref = useRef()

其中,Vue.createRef() 是 Vue 实例方法,用于创建一个引用对象;useRef() 是Composition API 中的一个函数,也用于创建引用对象。

ref 的作用有以下几个方面:

  1. 获取 DOM 元素:通过 ref,你可以获取对应的 DOM 元素,并进行直接操作,如修改元素的属性、调用元素的方法等。
  2. 引用组件实例:除了 DOM 元素,你还可以使用 ref 来引用组件实例,从而直接访问和操作组件的属性和方法。
  3. 传递引用:通过将 ref 传递给其他组件或函数,你可以在其他地方访问和操作对应的 DOM 元素或组件实例。

需要注意的是,使用 ref 时要遵循一些最佳实践,如避免在多个地方使用同一个 ref 来引用同一个元素或组件实例,以免引发意外行为。此外,在组件中使用 ref 时,要确保组件的生命周期方法(如 createdmounted 等)已经执行完毕,以确保引用的元素或组件实例已经准备好。

展示如何创建和使用 ref

在 Vue 3 中,创建和使用 ref 的方法与 Vue 2 类似,但有一些细微的差别。下面是一个简单的示例,展示了如何在 Vue 3 中创建和使用 ref

  1. 首先,在 Vue 3 中,你需要使用 defineComponent 方法来定义一个组件,例如:
import { defineComponent } from 'vue';

export default defineComponent({
 name: 'MyComponent',
 setup() {
   // 在这里编写组件的逻辑
 },
});
  1. 接下来,你可以使用 ref 方法来创建一个引用,例如:
import { ref } from 'vue';

export default defineComponent({
 name: 'MyComponent',
 setup() {
   const count = ref(0);

   // 你可以使用这个引用,例如:
   return {
     count,
   };
 },
});

在这个示例中,我们创建了一个名为 count 的引用,并将其初始值设置为 0。然后,我们将这个引用返回给组件,以便在模板中使用它。

  1. 在模板中,你可以使用 v-bind 指令将引用绑定到 DOM 元素,例如:
<template>
 <div>
   <p>Count: {{ count }}</p>
   <button v-bind="count">Increment</button>
 </div>
</template>

在这个示例中,我们将 count 引用绑定到 <p> 元素和一个按钮上。当用户点击按钮时,count 的值会增加。

  1. 最后,你可以使用 ref 引用来操作组件或元素的属性,例如:
import { ref } from 'vue';

export default defineComponent({
 name: 'MyComponent',
 setup() {
   const count = ref(0);

   function increment() {
     count.value++;
   }

   return {
     count,
     increment,
   };
 },
});

在这个示例中,我们定义了一个名为 increment 的函数,用于增加 count 的值。然后,我们将这个函数返回给组件,以便在模板中使用它。

总的来说,在 Vue 3 中使用 ref 方法非常简单,你可以使用它来获取对组件或元素的引用,操作组件或元素,并避免直接修改属性。

讨论 ref 的一些常见用例

ref 在 Vue 3 中是一个非常有用的特性,它提供了一种方便的方式来引用 DOM 元素或组件实例。以下是一些常见的用例:

  1. 获取 DOM 元素:通过使用 ref,你可以获取到特定的 DOM 元素,并直接操作它的属性、方法或监听其事件。这对于执行一些与 DOM 相关的操作非常方便。例如:
// 创建一个 ref 来引用元素
const myElement = ref(null);

// 在模板中使用 ref
<template>
  <div ref="myElement"></div>
</template>

// 获取引用的 DOM 元素
const element = myElement.value;
  1. 引用组件实例:除了引用 DOM 元素,你还可以使用 ref 来引用组件实例。这使得你能够直接访问和操作组件的属性和方法。例如:
// 创建一个 ref 来引用组件实例
const myComponent = ref(null);

// 在模板中使用 ref
<template>
  <MyComponent ref="myComponent"></MyComponent>
</template>

// 获取引用的组件实例
const component = myComponent.value;
  1. 传递引用:通过将 ref 传递给其他组件或函数,你可以在不同的地方共享对同一个 DOM 元素或组件实例的引用。这有助于在组件之间进行通信和协同工作。例如:
// 创建一个 ref
const myElement = ref(null);

// 将 ref 传递给子组件
<ChildComponent :element="myElement" />

// 在子组件中使用传递的 ref
const { element } = props;
  1. 处理生命周期事件:你可以使用 ref 来监听 DOM 元素或组件实例的生命周期事件。通过在 ref 的回调函数中处理这些事件,可以在特定的生命周期阶段执行相应的操作。例如:
// 创建一个 ref 来引用元素
const myElement = ref(null);

// 监听 ref 对应的元素的 click 事件
myElement.value.addEventListener('click', handleClickEvent);

// 处理点击事件的函数
function handleClickEvent() {
  console.log('点击事件触发');
}

总之,ref 提供了一种方便的方式来引用和操作 DOM 元素、组件实例,并在组件之间传递引用。它在一些常见的场景中非常有用,例如与 DOM 交互、处理组件通信和监听生命周期事件等。

三、 reactive 的基本概念

解释 reactive 的定义和作用

在 Vue 3 中,reactive 是一个用于创建响应式数据的函数。它将一个普通的对象转换为响应式对象,使其能够与 Vue 的响应式系统进行集成。

reactive 的定义如下:

import { reactive } from 'vue'
const myObject = reactive({ data: 123 })

reactive 的作用是使对象的属性具有响应性。当你修改响应式对象的属性时,Vue 会自动检测到变化,并触发相应的更新。这使得在 Vue 组件中使用响应式数据变得更加方便和高效。

通过使用 reactive 创建响应式对象,你可以将复杂的数据结构(如对象、数组等)与 Vue 的模板进行双向绑定,实现数据的实时更新和视图的自动渲染。

需要注意的是,reactive 只对对象的属性修改进行响应,而不对对象的整体替换进行响应。如果你需要对整个对象进行替换,可以使用 Vue.setvm.$set 方法。

展示如何创建和使用 reactive 对象

在 Vue 3 中,你可以使用 reactive 方法来创建一个响应式对象,以便在组件或元素中使用。下面是一个简单的示例,展示了如何在 Vue 3 中创建和使用 reactive 对象。

  1. 首先,在 Vue 3 中,你需要使用 defineComponent 方法来定义一个组件,例如:
import { defineComponent } from 'vue';

export default defineComponent({
name: 'MyComponent',
setup() {
  // 在这里编写组件的逻辑
},
});
  1. 接下来,你可以使用 reactive 方法来创建一个响应式对象,例如:
import { reactive } from 'vue';

export default defineComponent({
name: 'MyComponent',
setup() {
  const state = reactive({
    count: 0,
    message: 'Hello, Vue 3!',
  });

  // 你可以使用这个对象,例如:
  return {
    state,
  };
},
});

在这个示例中,我们使用 reactive 方法创建了一个名为 state 的响应式对象,并将其初始值设置为 { count: 0, message: 'Hello, Vue 3!' }。然后,我们将这个对象返回给组件,以便在模板中使用它。

  1. 在模板中,你可以使用 v-bind 指令将响应式对象绑定到 DOM 元素,例如:
<template>
<div>
  <p>Count: {{ state.count }}</p>
  <p>Message: {{ state.message }}</p>
  <button v-bind="state">Increment</button>
</div>
</template>

在这个示例中,我们将 state 对象绑定到 <p> 元素和一个按钮上。当用户点击按钮时,state 对象的 count 属性会增加,而 message 属性不会改变。

  1. 最后,你可以使用 reactive 对象的属性来操作对象,例如:
import { reactive } from 'vue';

export default defineComponent({
name: 'MyComponent',
setup() {
  const state = reactive({
    count: 0,
    message: 'Hello, Vue 3!',
  });

  function increment() {
    state.count++;
  }

  return {
    state,
    increment,
  };
},
});

在这个示例中,我们定义了一个名为 increment 的函数,用于增加 state 对象的 count 属性。然后,我们将这个函数返回给组件,以便在模板中使用它。

总的来说,在 Vue 3 中使用 reactive 方法非常简单,你可以使用它来创建一个响应式对象,以便在组件或元素中使用。

讨论 reactive 的一些常见用例

reactive 在 Vue 3 中是一个非常重要的特性,它提供了一种创建响应式数据的简洁方式。以下是一些常见的用例:

  1. 创建响应式对象:使用 reactive 可以将一个普通对象转换为响应式对象。当响应式对象的属性发生变化时,相关的组件会自动更新。这对于处理复杂的数据结构非常有用。例如:
// 创建一个响应式对象
const myObject = reactive({ data: 123 });

// 修改对象的属性
myObject.data += 1;

console.log(myObject.data); 
  1. 创建响应式数组:reactive 也可以用于创建响应式数组。响应式数组的元素变更时,相关的组件也会自动更新。例如:
// 创建一个响应式数组
const myArray = reactive([1, 2, 3]);

// 修改数组的元素
myArray.push(4);

console.log(myArray); 
  1. 与 Computed 属性结合使用:通过将 reactive 对象与计算属性(Computed Properties)结合使用,可以创建基于响应式数据的动态计算。例如:
// 创建一个响应式对象
const myObject = reactive({ data: 123 });

// 创建一个计算属性
const computedData = computed(() => myObject.data * 2);

console.log(computedData); 
  1. 在组件之间传递响应式数据:通过使用 reactive 创建响应式数据,可以在组件之间传递数据,并且当数据发生变化时,相关的组件会自动更新。这有助于保持组件之间的数据一致性。例如:
// 创建一个响应式对象
const myObject = reactive({ data: 123 });

// 在子组件中使用响应式数据
<ChildComponent :data="myObject.data" />

总之,reactive 提供了一种简单而高效的方式来创建响应式数据,使你的 Vue 应用更加动态和灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/289776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用HTML的原生语法实现两个div子元素在同一行中排列

代码如下&#xff1a; <div id"level1" style"display: flex;"><div id"level2-1" style"display: inline-block; padding: 10px; border: 1px solid #ccc; margin: 5px;">这是第一个元素。</div><div id"…

计算机系统基础

C 语言相关内容省略&#xff0c;复习自用&#xff0c;仅供参考~ 概述 冯诺伊曼结构 存储程序工作方式&#xff1a;将事先编好的程序和原始数据送入主存后才能执行程序&#xff0c;程序被启动执行后&#xff0c;计算机能在不需要操作人员干预下自动完成逐条指令取出和执行的任…

解析为什么Go语言要使用[]rune而不是string来表示中文字符

众所周知&#xff0c;Go语言中有以下这些数据类型。但rune32这个go语言特有的数据类型&#xff0c;比较有意思却经常遭到忽视。所以今天探索学习一下这个数据类型的功能、用法。 Go基本数据类型 布尔&#xff1a;bool 字符串&#xff1a;string 整数&#xff1a; int int8 …

NNDL 作业13 优化算法3D可视化 [HBU]

老师作业原博客:【23-24 秋学期】NNDL 作业13 优化算法3D可视化-CSDN博客 NNDL 作业13 优化算法3D可视化-CSDN博客 编程实现优化算法&#xff0c;并3D可视化 1. 函数3D可视化 分别画出 和 的3D图 NNDL实验 优化算法3D轨迹 鱼书例题3D版_优化算法3d展示-CSDN博客 代码&#…

JSON网络令牌JWT

1.什么是身份验证 日常生活中的身份验证的场景: 比如进入公司的大楼时&#xff0c;需要携带工牌&#xff1b;打卡上班时&#xff0c;需要指纹识别&#xff1b;打开工作电脑时&#xff0c;需要输入密码。 2. 什么是 JSON 网络令牌&#xff1f; JSON Web Token (JWT) 是一个开…

智能编程助手!华为云CodeArts Snap免费公测:基于盘古研发大模型

近日&#xff0c;华为云CodeArts Snap正式开启公测。 这是一款基于华为云研发大模型的智能化编程助手&#xff0c;旨在为开发者提供高效且智能的编程体验&#xff0c;提升研发人员的单兵作战能力。 该服务公测期间免费&#xff0c;不向用户收取任何费用&#xff0c;商用后&am…

【论文阅读|冷冻电镜】DISCA: High-throughput cryo-ET structural pattern mining

论文题目 High-throughput cryo-ET structural pattern mining by unsupervised deep iterative subtomogram clustering 摘要 现有的结构排序算法的吞吐量低&#xff0c;或者由于依赖于可用模板和手动标签而固有地受到限制。本文提出了一种高吞吐量的、无需模板和标签的深度…

【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]

阅读导航 引言一、function包装器1. 概念2. 基本使用3. 逆波兰表达式求值&#xff08;1&#xff09;普通写法&#xff08;2&#xff09;使用包装器以后的写法 二、bind() 函数温馨提示 引言 很高兴再次与大家分享关于 C11 的一些知识。在上一篇文章中&#xff0c;我们讲解了 c…

Vue前端文字效果:如何让一段文本像是手动一个一个字打出来的

效果展示 自己做的AI聊天机器人界面&#xff0c;我觉得比微信还好看 由于这个前端略微复杂&#xff0c;下文用最简单的例子来展示&#xff1a; 分析需求 对于AI聊天工具的前端&#xff0c;如果AI生成的文本像是一个一个字打出来的&#xff0c;就会让AI看起来更像真的人&…

打造炫酷粒子效果的前端利器tsParticles

前端潮流速递 &#xff1a;打造炫酷粒子效果的前端利器tsParticles 在现代前端开发中&#xff0c;动画和视觉效果是吸引用户的关键元素之一。而实现炫酷而引人入胜的粒子效果&#xff0c;常常需要耗费大量的时间和精力。然而&#xff0c;有了 tsParticles&#xff0c;这一切变…

MySQL 8.0 开关 Redo Logging

一 前言 前几天有客户测试使用云数据库的时候提出 要禁止mydumper 关闭redo log的操作 (说白了就是导入数据时保持MySQL 实例的redo logging功能)&#xff0c; 这才想起 在 MySQL 8.0.21 版本中&#xff0c;开启了一个新特性 “Redo Logging 动态开关”。 在新实例导数据的场…

搭建宠物寄养小程序流程

近日&#xff0c;一地宠物寄养需求旺盛&#xff0c;元旦满房&#xff0c;春节几近饱和&#xff0c;一窝难求。随着市场需求的增长&#xff0c;对于很多宠物行业的商家&#xff0c;可以考虑开展宠物寄养服务&#xff0c;尤其是节假日的宠物寄养需求会更高。因此&#xff0c;商家…

FastApi-快速入门1

FastAPI 是一个用于构建 API 的现代、快速&#xff08;高性能&#xff09;的 web 框架&#xff0c;使用 Python 3.8 并基于标准的 Python 类型提示。 关键特性: 快速&#xff1a;可与 NodeJS 和 Go 并肩的极高性能&#xff08;归功于 Starlette 和 Pydantic&#xff09;。最快…

算法通关村番外篇-数组实现队列

大家好我是苏麟 , 今天来用数组实现一下队列 . 数组实现队列 顺序存储结构存储的队列称为顺序队列&#xff0c;内部使用一个一维数组存储&#xff0c;用一个队头指针 front 指向队列头部节点(即使用int类型front来表示队头元素的下标)&#xff0c;用一个队尾指针rear(有的地方…

3dmax灯光缓存参数应该怎么设置?

细分&#xff1a;用来决定灯光缓存的样本数量&#xff0c;样本数量以此数值的平方来计算。数值越高&#xff0c;效果越好&#xff0c;速度越慢。 一般出图建议1000到1800之间已经足够了 采样大小&#xff1a;用来控制灯光缓存的样本尺寸大小&#xff0c;较小的数值意味着较小的…

Vue 模板编译原理解析

Vue 模板编译原理解析 模板编译整体流程 首先我们看一下什么是编译&#xff1f; 所谓编译&#xff08;Compile&#xff09;&#xff0c;指的是将语言 A 翻译成语言 B&#xff0c;语言 A 就被称之为源码&#xff08;source code&#xff09;&#xff0c;语言 B 就被称之为目标…

清风数学建模笔记-主成分分析

内容&#xff1a;主成分分析 介绍&#xff1a; 主成分分析是一种降维算法&#xff0c;它通过旋转和变换将多个指标转化为少数几个主成分&#xff0c;这些主成分是原变量的线性组合&#xff0c;且互不相关&#xff0c;其能反映出原始数据的大部分信息。 例如解决多重共线性问题…

Vue+ElementUI笔记(1)

一、表格 1.上移、下移和移除功能 需求&#xff1a;有时我们会面对类似这样的表格 图中的上移&#xff0c;下移功能需求明显要求我们改变两行数据的顺序。在实际开发中这种功能一般由后台来做&#xff0c;因为列表数据一般从后台获取刷新。即是我们点击”上移“&#xff0c;向…

K8Spod组件

一个pod能包含几个容器 一个pause容器(基础容器/父容器/根容器&#xff09; 一个或者多个应用容器(业务容器) 通常一个Pod最好只包含一个应用容器&#xff0c;一个应用容器最好也只运行一个业务进程。 同一个Pod里的容器都是运行在同一个node节点上的&#xff0c;并且共享 net、…

20、Finetuning

微调是指调整大型语言模型&#xff08;LLM&#xff09;的参数以适应特定任务的过程&#xff0c;用于改进预训练模型的性能。这是通过在与任务相关的数据集上训练模型来完成的。所需的微调量取决于任务的复杂性和数据集的大小。 PEFT&#xff08;Parameter-Efficient Fine-Tunin…