Vue3从零开始——掌握setup、ref和reactive函数的奥秘

文章目录

    • 一、Vue 3 组合式 API 概述
    • 二、`setup`​ 函数的基本使用
      • 2.1 `setup`​ 函数的特点
      • 2.2 `setup`​ 函数的基本结构
      • 2.3 实现一个简单的小demo
    • 三、`ref`​ 函数的功能和应用
      • 3.1 `ref`​函数介绍
      • 3.2 基本使用
        • 3.2.1 定义`ref`​数据
        • 3.2.2 修改响应式变量
      • 3.3 使用`ref`​函数实现计数器
    • 四、`reactive`​ 函数的功能和应用
      • 4.1 `reactive`​ 函数介绍
      • 4.2 基本使用
      • 4.3 使用`reactive`​函数实现计数器
      • 4.4 `reactive`​函数的的局限性
    • 五、`ref`​ 与 `reactive`​ 的区别
      • 5.1 主要区别
      • 5.2 `ref`​ 适合的场景
      • 5.3 `reactive`​ 适合的场景
      • 5.4 Vue社区观点
    • 六、总结

在这里插入图片描述

一、Vue 3 组合式 API 概述

下载 (14)

在 Vue 3 中,引入了组合式 API(Composition API) ,这使得开发者可以更灵活地组织代码逻辑,并提升了组件的复用性和可维护性。相比于 Vue 2 中的选项式 API,组合式 API 提供了一种更具功能性的方式来构建应用。

主要优点:

  • 逻辑复用和组织:通过组合函数可以更清晰地组织代码逻辑,避免在生命周期函数中写大量逻辑。
  • 更好的 TypeScript 支持:组合式 API 天然地支持 TypeScript,这使得类型推断和类型检查变得更加轻松。
  • 性能优化:组合式 API 的实现方式在某些场景下可以带来性能上的提升。

二、setup​ 函数的基本使用

setup​ 函数是 Vue 3 组件中使用组合式 API 的起点,它是一个新增加的组件选项,所有的组合式 API 的逻辑都需要在这个函数中书写。

2.1 setup​ 函数的特点

  • 从组件生命周期来看,在beforeCreate​之前调用,因此它没有 this​ 绑定。
  • 函数中 this​ 不是组件实例,是 undefined​。
  • 返回一个对象,该对象将被合并到组件的 data​ 中,可以在模板中直接使用。

2.2 setup​ 函数的基本结构

<template><div><!-- 绑定在模板中的变量和方法 --></div>
</template><script>
import { ref, reactive } from 'vue';export default {setup() {// 在这里定义响应式变量和方法return {// 返回需要在模板中使用的变量和方法};},
};
</script><style scoped>
/* 样式部分 */
</style>

2.3 实现一个简单的小demo

<template><div><p @click="show()">{{ msg }}</p></div>
</template><script>export default {setup() {console.log("setup 函数执行了");let msg = 'Hello World';function show(){console.log("show 函数执行了");}// 返回定义的变量和函数return {msg,show};},beforeCreate() {console.log("beforeCreate 函数执行了");},
};
</script><style scoped>
button {margin: 5px;padding: 10px 20px;background-color: #4caf50;color: white;border: none;border-radius: 5px;cursor: pointer;
}button:hover {background-color: #45a049;
}p {font-size: 18px;
}
</style>

image

三、ref​ 函数的功能和应用

3.1 ref​函数介绍

ref​ 函数用于创建一个持有单个值的响应式引用。它适用于基本数据类型(如字符串、数字、布尔值)和不需要深度响应的数据结构。通过 ref​ 函数,我们可以在 Vue 组件中创建简单的响应式数据。

主要特点:

  • 基本类型响应性:为基本数据类型创建响应式状态。
  • 引用式访问:通过 .value​ 属性访问和修改值。
  • 适用于 DOM 引用:可以用于 DOM 元素的引用。

3.2 基本使用

3.2.1 定义ref​数据
import { ref } from 'vue';export default {setup() {// 创建响应式数据const count = ref(0); const message = ref('Hello, Vue 3!');const isVisible = ref(true);return {count,message,isVisible,};},
};
3.2.2 修改响应式变量

要修改 ref​ 创建的响应式变量,需要使用 .value​ 属性:

count.value++; // 增加 count
count.value = 10; // 设置 count 的值

注意:当在Vue的模板(template​)中使用时,ref​ 的值可以直接使用,无需显式调用 .value​:

<template><div><p>{{ count }}</p><button @click="count++">增加</button></div>
</template>

3.3 使用ref​函数实现计数器

应用需求:

  • 显示当前计数。
  • 提供按钮增加计数。
  • 提供按钮重置计数。
<template><div><p>当前计数:{{ count }}</p><button @click="increment">增加</button><button @click="reset">重置</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {console.log("setup 函数执行了");// 创建一个响应式对象const count = ref(0);// 增加计数function increment() {count.value++;console.log("count = " + count.value);}// 重置计数function reset() {count.value = 0;}return {count,increment,reset,};},beforeCreate() {console.log("beforeCreate 函数执行了");},
};
</script><style scoped>
button {margin: 5px;padding: 10px 20px;background-color: #4caf50;color: white;border: none;border-radius: 5px;cursor: pointer;
}button:hover {background-color: #45a049;
}p {font-size: 18px;
}
</style>

代码解读:

  1. 创建响应式变量
    • 使用 ref 创建一个响应式变量 count实现记录数字。ref(0) 表示将初始值设置为 0
  2. 定义方法
    • increment 方法:用于增加计数值。在函数内部,通过 count.value++ 来递增计数器,并在控制台中输出新的计数值。
    • reset 方法:用于重置计数值。将 count.value 设为 0 来重置计数器。
  3. 组件返回
    • return:返回 count 和方法 incrementreset,使其在模板中可以直接访问,这一步非常重要!!
  4. 模板绑定
    • {{ count }}:在模板中使用双花括号语法绑定 count,动态显示当前计数值。
    • @click :绑定 button 元素的点击事件到 incrementreset 函数上,实现按钮点击后对计数值的增加和重置。
  5. 生命周期钩子
    • beforeCreate:输出消息以便于理解setup函数的执行顺序。

image

四、reactive​ 函数的功能和应用

4.1 reactive​ 函数介绍

reactive​ 是 Vue 3 提供的一个 API,用于创建深度响应式对象。与 ref​ 不同,ref​ 适用于基本数据类型,而 reactive​ 更适用于对象、数组等复杂数据结构。

主要特点:

  • 创建深度响应式的数据对象。
  • 自动跟踪依赖变化并更新视图。
  • 可以结合 toRefs​ 解构成多个响应式引用。

4.2 基本使用

import { reactive } from 'vue';export default {setup() {// 创建响应式对象const state = reactive({count: 0,message: 'Hello, Vue 3!',});// 方法示例function increment() {state.count++;}return {state,increment,};},
};

在上面的代码中,我们使用 reactive​ 创建了一个响应式对象 state​,其中包含了两个属性:count​ 和 message​。increment​ 函数可以用来增加 count​ 的值。

4.3 使用reactive​函数实现计数器

应用需求:

  • 显示当前计数。
  • 提供按钮增加计数。
  • 提供按钮重置计数。
<template><div><h1>{{ state.title }}</h1><p>当前计数:{{ state.count }}</p><button @click="increment">增加</button><button @click="reset">重置</button></div>
</template><script>
import { reactive } from 'vue';export default {setup() {// 创建一个响应式对象const state = reactive({count: 0,title: '计数器应用',});// 增加计数function increment() {state.count++;}// 重置计数function reset() {state.count = 0;}// 暴露定义的数据和函数return {state,increment,reset,};},
};
</script><style scoped>
button {margin: 5px;padding: 10px 20px;background-color: #4caf50;color: white;border: none;border-radius: 5px;cursor: pointer;
}button:hover {background-color: #45a049;
}h1 {color: #333;
}p {font-size: 18px;
}
</style>

代码解读:

跟前面的其实差不多,只不过用法上有一点区别,其他其实差别并不大。

  1. 创建响应式变量:使用 ref 创建两个响应式变量 counttitle
  2. 定义方法:定义 incrementdecrement 函数,用于增加和减少计数。
  3. 模板绑定:在模板中使用 {{ }} 绑定响应式变量,并通过 @click 指令绑定事件处理函数。

image

4.4 reactive​函数的的局限性

参考自:https://cn.vuejs.org/guide/essentials/reactivity-fundamentals.html#reactive

reactive()​ API 有一些局限性:

  1. 有限的值类型:它只能用于对象类型 (对象、数组和如 Map​、Set​ 这样的集合类型)。它不能持有如 string​、number​ 或 boolean​ 这样的原始类型。

  2. 不能替换整个对象:由于 Vue 的响应式跟踪是通过属性访问实现的,因此我们必须始终保持对响应式对象的相同引用。这意味着我们不能轻易地“替换”响应式对象,因为这样的话与第一个引用的响应性连接将丢失:
    js

    let state = reactive({ count: 0 })// 上面的 ({ count: 0 }) 引用将不再被追踪
    // (响应性连接已丢失!)
    state = reactive({ count: 1 })
    
  3. 对解构操作不友好:当我们将响应式对象的原始类型属性解构为本地变量时,或者将该属性传递给函数时,我们将丢失响应性连接:
    js

    const state = reactive({ count: 0 })// 当解构时,count 已经与 state.count 断开连接
    let { count } = state
    // 不会影响原始的 state
    count++// 该函数接收到的是一个普通的数字
    // 并且无法追踪 state.count 的变化
    // 我们必须传入整个对象以保持响应性
    callSomeFunction(state.count)
    

由于这些限制,我们建议使用 ref()​ 作为声明响应式状态的主要 API。

五、ref​ 与 reactive​ 的区别

Vue 3 提供了两种创建响应式数据的方式:ref​ 和 reactive​。它们在功能上有一些不同,适用于不同的场景。

5.1 主要区别

特性refreactive
用途创建持有基本类型值的响应式引用创建深度响应式对象,适合复杂数据结构
访问方式通过.value​访问和修改直接访问和修改对象的属性
响应性基本类型响应性深度响应性,自动追踪对象属性的变化
适用场景适用于简单的状态和需要 DOM 引用的场景适用于多属性对象、数组、复杂数据结构
数据类型支持
只对 object 类型有效对任意类型有效
使用方式<script>​ 和 <template>​ 中无差别使用<script>​ 和 <template>​ 使用方式不同

5.2 ref​ 适合的场景

  • 用于基本类型或需要独立响应式的变量。适合处理简单的数据类型,如 Number​、String​、Boolean​。
  • 独立的响应式变量:需要单独处理或跟踪的变量。
  • DOM 元素引用:通过 ref​ 获取和操作 DOM 元素。

5.3 reactive​ 适合的场景

  • 用于复杂的数据结构,如对象或数组。适合处理多属性的对象或需要整个结构响应式的数据。
  • 深度响应:需要自动跟踪嵌套属性变化的数据。

5.4 Vue社区观点

默认都使用 ref,当需要分组时使用 reactive​ 。

详细原因可以看:Ref vs. Reactive — Which is Best? | Michael Thiessen

六、总结

本文主要讲述了 Vue 3 中的 setup​ 函数、ref​函数和 reactive​ 函数的一些基本知识,他们的基本使用语法和如何简单运用实现一个小demo,希望对大家有所帮助☺️。


参考文章:

Ref vs. Reactive — Which is Best? | Michael Thiessen

【译】Ref vs. Reactive:使用Vue3组合式API该如何选择?

响应式基础 | Vue.js

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW工件表面瑕疵识别系统

开发了一种利用LabVIEW和IMAQ Vision视觉工具进行工件表面瑕疵识别的系统。该系统通过图像处理技术识别并分类工件表面的裂纹、划痕等缺陷&#xff0c;从而提升生产线的分拣效率和产品质量。 项目背景 工业生产中&#xff0c;工件表面的缺陷直接影响产品质量和生产效率。传统人…

Go语言加Vue3零基础入门全栈班11 Go语言+gorm用户管理系统实战 2024年08月03日 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…

Linux-入门-02

上节我们讲了如何安装虚拟机,本节课讲一些linux的常用命令,首先我们需要做一些配置,我们的centos的镜像是最小版安装,里面什么也没有,所以我们的linux是不能进行联网的,接下来我们就来一步一步联网 1、配置网络 首先我们需要先使用命令查看ip地址,linux中一切皆文件,只能使用命…

数据结构——排序(1):插入排序

目录 一、排序的概念 二、排列的运用 三、常见的排序算法 四、插入排序 1.直接插入排序 &#xff08;1&#xff09;思路 &#xff08;2&#xff09;过程图示 &#xff08;3&#xff09;代码实现 (4)代码解释 &#xff08;5&#xff09;特性 2.希尔排序 &#xff08;1…

CSS技巧专栏:一日一例 20-纯CSS实现点击会凹陷的按钮

本例图片 案例分析 其实这个按钮非常的简单啊,主要就是利用了box-shadow的inset。 布局代码 <button class="base">凹下的按钮</button> 基础样式 :root{--main-bg-color: #dcdcdc; /* 将页面背景色调整为浅灰色 */--color:#000;--hover-color:#99…

LLM - GQA 之 Group Query Attention 论文与源码精读

目录 Abstract 1.Introduction 2.Method 2.1 UpTraining 2.2 Grouped-query attention 3.Experiments 3.1 Experimental setup 3.2 Main Results 3.3 Ablations 4.Related Work 5.Conclustion 6.Code 6.1 repeat_kv 6.2 Attention Arg Init 6.3 Attention Mat I…

IT服务质量管理攻略(至简)

质量管理、风险管理和信息安全管理是IT服务监督管理的重要内容&#xff0c;三者之间相对独立。IT服务质量管理是通过制订质量方针、质量目标和质量计划&#xff0c;实施质量控制、质量保证和质量改进活动&#xff0c;确保IT服务满足服务级别协议的要求&#xff0c;最终获得用户…

openvidu私有化部署

openvidu私有化部署 简介 OpenVidu 是一个允许您实施实时应用程序的平台。您可以从头开始构建全新的 OpenVidu 应用程序&#xff0c;但将 OpenVidu 集成到您现有的应用程序中也非常容易。 OpenVidu 基于 WebRTC 技术&#xff0c;允许开发您可以想象的任何类型的用例&#xf…

[算法]第一集 递归(未完待续)

递归啊递归&#xff0c;说简单简单&#xff0c;说难难。 首先我们要知道 一、什么是递归&#xff1f; 我们再C语言和数据结构里都用了不少递归&#xff0c;这里就不多详细介绍。 递归简单来说就是函数自己调用自己的情况 二、为什么要用递归呢&#xff1f; 本质来说其实就…

【WRF安装第四期(Ubuntu)】搭建WRF编译所需系统-WRF和WPS模型的安装

WRF安装第四期&#xff1a;搭建WRF编译所需系统-WRF和WPS模型的安装 1 WRF的编译安装&#xff08;Building WRF&#xff09;1.1 进入Build_WRF文件夹1.2 下载WRFV4.01.3 解压WRF安装包1.4 安装WRF选择#1&#xff1a;32选择#2&#xff1a;33选择#3&#xff1a;34 1.5 检查WRF是否…

Linux 中的信号处理

Linux 中的信号处理是操作系统中非常重要的一个概念&#xff0c;通过信号处理&#xff0c;进程之间可以进行通信、协调以及实现一些重要的功能。本文将从信号的概念、类型、生成、传递、处理、以及常见的信号处理函数等方面展开讨论&#xff0c;以帮助读者更深入地了解 Linux 中…

【机器学习】BP神经网络中的链式法则

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 BP神经网络中的链式法则1. 引言2. 链式法则基础2.1 什么是链式法则&#xff1f;…

29.Labview界面设计(下篇) --- 自定义控件库、界面布局与外观设计

摘要&#xff1a; 题主在上一篇文章中向大家讲解了前面板逻辑框架及结构的搭建和控件的类型介绍&#xff0c;那么本章主要围绕前面板的控件布局以及控件的自定义类型和背景等外观优化项中来讲解。 本篇文章讲解界面设计的下篇内容&#xff0c;上篇内容链接大家可以直接点击链接…

国家统计局中国主要城市面板数据(1990-2023年)

数据说明&#xff1a;数据来源于国家统计局&#xff0c;指标包含&#xff1a;城市、年份、第三产业增加值、第一产业增加值 地区生产总值、第二产业增加值、年末户籍人口、城镇非私营单位在岗职工平均工资 房地产开发投资额、房地产开发住宅投资额、房地产开发办公楼投资额、房…

Linux C 程序 【03】线程栈空间

1.开发背景 上一个篇章创建了线程&#xff0c;参考 FreeRTOS&#xff0c;每个线程都是有自己的内存空间&#xff0c;Linux上面也是一样的&#xff0c;这个篇章主要描述线程栈空间的设置。 2.开发需求 设计实验&#xff1a; 1&#xff09;创建线程&#xff0c;并配置线程内存大…

培训第二十二天(mysql数据库主从搭建)

上午 1、为mysql添加开机启动chkconfig [rootmysql1 ~]# chkconfig --list //列出系统服务在不同运行级别下的启动状态注&#xff1a;该输出结果只显示 SysV 服务&#xff0c;并不包含原生 systemd 服务。SysV 配置数据可能被原生 systemd 配置覆盖。 要列出 systemd 服务…

IEEE报告解读:存储技术发展趋势分析

1.引言 随着数据科学、物联网&#xff08;IoT&#xff09;和永久存储需求的快速增长&#xff0c;对大规模数据存储的需求正在迅速增加。存储技术的发展趋势直接关系到数据的可靠性和经济性。本文将根据IEEE最新发布的《2023年国际器件与系统路线图》&#xff0c;深入探讨各种存…

AnyGPT: Unified Multimodal LLM with Discrete Sequence Modeling

发表时间&#xff1a;arXiv 2024年2月26日 论文链接&#xff1a;https://arxiv.org/pdf/2402.12226 作者单位&#xff1a; Fudan University Motivation&#xff1a; LLM 在理解和生成人类语言方面表现出非凡的能力。但是&#xff0c;LLM 的能力仅限于针对文本的处理。而现…

详解Xilinx FPGA高速串行收发器GTX/GTP(2)--什么是GTX?

文章总目录点这里:《FPGA接口与协议》专栏的说明与导航 GTX本质上是基于SerDes技术的高速串行收发器,它是FPGA内部的底层电路,也叫做Gigabit Transceiver(吉比特收发器,简称为GT)。其中A7系列使用的GT叫GTP,K7系列使用的GT叫GTX,V7系列使用的GT叫GTH和GTZ,它们…

循环神经网络和自然语言处理一

目录 一.分词 1.分词工具 2.分词的方法 3.N-gram表示方法 二.向量化 1.one-hot编码 2.word embedding 3.word embedding API 4.数据形状改变 既然是自然语言&#xff0c;那么就有字&#xff0c;词&#xff0c;句了 一.分词 1.分词工具 tokenization&#xff0c;jie…