【vue3之组合式API及其新特性】

news2025/1/17 1:14:29

组合式API及其新特性

  • 一、setup
    • 1.写法
    • 2.如何访问
    • 3.语法糖
    • 4.同步返回对象
  • 二、reactive()和ref()
    • 1.reactive()
    • 2.ref()
  • 三、computed
  • 四、watch函数
    • 1.侦听单个数据
    • 2.侦听多个数据
    • 3. immediate
    • 4. deep
    • 5.精确侦听对象的某个属性
  • 五、生命周期函数
  • 六、组件通信
    • 1.父传子
    • 2. 子传父
  • 七、模版引用
    • 1. 基本使用
    • 2. defineExpose
  • 八、provide和inject
    • 1. 作用和场景
    • 2. 跨层传递普通数据
    • 3. 跨层传递响应式数据
    • 4. 跨层传递方法
  • 九、新特性-defineOptions
  • 十、新特性-defineModel

注:在Vue 3中,采用了组合式 API 的编码风格,它允许将数据和方法进行组合,以提供更灵活和可复用的逻辑代码。通过 <script> 标签,我们可以在最前面编写逻辑代码,然后再定义组件的结构和样式。此外,Vue 3还支持多个根节点的模板结构,进一步增强了组件的可扩展性和可维护性。

一、setup

1.写法

组合式API的入口函数。写法与生命周期钩子函数的写法相同

<script>
export default{
	setup(){
	},
	beforeCreate(){
	}
}
</script>

但setup的执行时机要比beforeCreate钩子函数还快,所以在setup函数中是不能获取到this的值的,此时的this是undefined

2.如何访问

下面给出一个例子

<script>
export default {
  setup() {
    const message = 'Hello,vue3';
    
    const logMessage = () => {
      console.log(message);
    };
    
    return {
      message,
      logMessage
    };
  }
}
<template>
  <div>
    <p>{{ message }}</p>
    <button @click="logMessage">Log Message</button>
  </div>
</template>
</script>

这个例子定义了一个message属性及其打印的方法,点击按钮即可打印
注:数据和函数需要在setup最后return一下才是能在模板和其他API钩子中使用

3.语法糖

每次都要return一下太麻烦了,vue3提供了更简洁的语法糖写法:
只需在script标签中加上setup就不需要return了

<script setup>
  const message = 'Hello, World!'
  const logMessage = ()=>{
    console.log(message)
  }
</script>

4.同步返回对象

setup()应该同步地返回一个对象,这是因为 setup 函数的返回值被用于组件实例的配置项,它需要立即返回一个对象或者 undefined,而不是一个 Promise。被声明为一个async函数返回的是promise对象,模板中无法在访问到return对象的属性。官网给出唯一可以使用async setup()的情况是该组件为Suspense组件的后裔。

二、reactive()和ref()

1.reactive()

接受对象类型数据的参数传入并返回一个响应式的对象
基本语法:

<script setup>
  import { reactive } from 'vue'
  const state =reactive(对象类型数据)
  ……
</script>

例子:

<script setup>
 import { reactive } from 'vue'
 const state = reactive({
   msg:'this is msg'
 })
 const setSate = ()=>{
   state.msg = 'this is new msg'
 }
</script>

<template>
  {{ state.msg }}
  <button @click="setState">change msg</button>
</template>

这个例子实现了点击按钮更改message值的效果,reactive对象能返回一个响应式的数据,当点击按钮改变message值后视图也会随之更新。

2.ref()

接收简单类型或者对象类型的数据传入并返回一个响应式的对象
基本语法:

<script setup>
import { ref } from 'vue'
const count =ref(简单类型或复杂类型的数据)
<script>

例子:

<script setup>
 // 导入
 import { ref } from 'vue'
 // 执行函数 传入参数 变量接收
 const count = ref(0)
 const setCount = ()=>{
   // 修改数据更新视图必须加上.value
   count.value++
 }
</script>

<template>
  <button @click="setCount">{{count}}</button>
</template>

能接收简单类型的本质:在原有传入数据的基础上,在外层包了一层对象,变成复杂类型的数据,实际上在底层还是依靠reactive实现的响应式
注:因为包了一层,所以在script脚本中访问数据要靠.value,但是在template模板中不需要,因为已经帮我们扒了一层,在后续的开发过程中,更推荐统一用ref,因为支持的数据类型更广泛,唯一不足就是在脚本中需要.value访问

三、computed

计算属性基本思想和Vue2的完全一致,组合式API下的计算属性只是修改了写法,计算属性中只包含计算的功能,不应该有异步请求/修改dom

<script setup>
// 导入
import {ref, computed } from 'vue'
// 原始数据,ref(0) 的意思是创建一个名为 count 的响应式变量,初始值为 0
const count = ref(0)
// 计算属性
const doubleCount = computed(()=>count.value * 2)

// 原始数据
const list = ref([1,2,3,4,5,6,7,8])
// 计算属性list
const filterList = computed(item=>item > 2)
</script>

当然computed属性也支持get和set写法,平常要避免修改计算属性的值、:
来自vue3官网:
在这里插入图片描述

四、watch函数

作用: 侦听一个或者多个数据的变化,数据变化时执行回调函数
俩个额外参数:1. immediate(立即执行) 2. deep(深度侦听)

1.侦听单个数据

watch函数的第一个参数就是传的ref对象,不需要加.value

<script setup>
  // 1. 导入watch
  import { ref, watch } from 'vue'
  const count = ref(0)
  // 2. 调用watch 侦听变化
  watch(count, (newValue, oldValue)=>{
    console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
  })
</script>

2.侦听多个数据

侦听多个数据,第一个参数可以改写成数组的写法

<script setup>
  // 1. 导入watch
  import { ref, watch } from 'vue'
  const count = ref(0)
  const name = ref('cp')
  // 2. 调用watch 侦听变化
  watch([count, name], ([newCount, newName],[oldCount,oldName])=>{
    console.log(`count或者name变化了,[newCount, newName],[oldCount,oldName])
  })
</script>

3. immediate

在侦听器创建时立即出发回调,响应式数据变化之后继续执行回调

<script setup>
  // 1. 导入watch
  import { ref, watch } from 'vue'
  const count = ref(0)
  // 2. 调用watch 侦听变化
  watch(count, (newValue, oldValue)=>{
    console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
  },{
    immediate: true
  })
</script>

4. deep

通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行,需要开启deep

<script setup>
  // 1. 导入watch
  import { ref, watch } from 'vue'
  const state = ref({ count: 0 })
  // 2. 监听对象state
  watch(state, ()=>{
    console.log('数据变化了')
  })
  const changeStateByCount = ()=>{
    // 直接修改不会引发回调执行
    state.value.count++
  }
</script>

<script setup>
  // 1. 导入watch
  import { ref, watch } from 'vue'
  const state = ref({ count: 0 })
  // 2. 监听对象state 并开启deep
  watch(state, ()=>{
    console.log('数据变化了')
  },{deep:true})
  const changeStateByCount = ()=>{
    // 此时修改可以触发回调
    state.value.count++
  }
</script>

5.精确侦听对象的某个属性

需求:在不开启deep的前提下,侦听age的变化,只有age变化时才执行回调

const info =ref({
	name:"cp",
	age:18
})
watch(
	()=>info.value.age
	()=>console.log('age变化了“)

五、生命周期函数

在这里插入图片描述
选项式API里的钩子函数代码可以都放在后面的组合式API钩子函数中执行
注:将钩子函数写成函数的调用方式,可以调用多次,并且不会冲突,按照顺序依次执行,在vue3中销毁不再是destroyed,而是unmounted

六、组件通信

1.父传子

基本思想

  1. 父组件中给子组件绑定属性
  2. 子组件内部通过props选项接收数据

注:因为script标签中已经被setup语法糖格式的写法占满了,所以props接收需要借助“编译器宏”函数接收子传父的数据:defineProps
以下这个例子父组件将car和money属性传递给了子组件,car是静态数据,money通过getMoney方法点击挣钱按钮动态增加,说明子组件也能接收响应式的数据。
在这里插入图片描述

2. 子传父

基本思想

  1. 父组件中给子组件标签通过@绑定事件
  2. 子组件内部通过 emit 方法触发事件

注:同样,子组件要通过“编译器宏”函数defineEmit通知父组件修改数据
以下这个例子在上一个例子的基础上,增加了子组件要花钱的功能,那么儿子花钱肯定要通知父亲减掉money,父组件中定义了新方法changeFn.
在这里插入图片描述

七、模版引用

概念:通过 ref标识 获取真实的 dom对象或者组件实例对象

1. 基本使用

实现步骤:

  1. 调用ref函数生成一个ref对象
  2. 通过ref标识绑定ref对象到标签

在这里插入图片描述

2. defineExpose

默认情况下在 <script setup>语法糖下组件内部的属性和方法是不开放给父组件访问的,可以通过defineExpose编译宏指定哪些属性和方法容许访问

以下这个例子就是指定testMessage属性可以被访问到

在这里插入图片描述

八、provide和inject

1. 作用和场景

顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信

2. 跨层传递普通数据

实现步骤

  1. 顶层组件通过 provide 函数提供数据
  2. 底层组件通过 inject 函数提供数据

在这里插入图片描述

3. 跨层传递响应式数据

在调用provide函数时,第二个参数设置为ref对象

在这里插入图片描述

4. 跨层传递方法

顶层组件可以向底层组件传递方法,底层组件调用方法修改顶层组件的数据

在这里插入图片描述

九、新特性-defineOptions

在有setup语法糖格式写法之前,setup依旧是写成函数的形式,此时props和emits也能同级地展示出来,但是在语法糖格式写法出来过后,script标签已经被setup占满,为了解决这个问题,以上我们都提到了用defineProps和defineEmits这两个“编译器宏”函数来解决,但是对于其他属性我们应该怎么办呢?

在 Vue 3.3 中新引入了 defineOptions 宏。顾名思义,主要是用来定义 Options API 的选项。可以用
defineOptions 定义任意的选项, props, emits, expose, slots 除外(因为这些可以使用 defineXXX 来做到)
在这里插入图片描述

十、新特性-defineModel

在Vue3中,自定义组件上使用v-model, 相当于传递一个modelValue属性,同时触发 update:modelValue 事件
我们需要在子组件中先定义 props,再定义 emits 。其中有许多重复的代码。如果需要修改此值,还需要手动调用 emit 函数。

父组件:
在这里插入图片描述
子组件:
在这里插入图片描述
这样就很麻烦,因此,vue3推出了新特性:defineModel,我们不需要props接收,也可以直接修改父组件传递过来绑定的值
在这里插入图片描述
修改子组件,用defineModel替代defineProps传过来的值,用:value给input框赋值,监听到了input框输入值的修改可以直接改绑定的值:
在这里插入图片描述
实现效果:
在这里插入图片描述
但是由于defineModel还是试验性质,所以我们生效需要配置 vite.config.js,然后用npm run dev重启一下项目

import { fileURLToPath, URL } from 'node:url'
  
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
  
// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue({
      script: {
        defineModel: true
      }
    }),
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云消息队列 Confluent 版正式上线!

作者&#xff1a;阿里云消息队列 前言 在 2023 年杭州云栖大会上&#xff0c;Confluent 成为阿里云技术合作伙伴&#xff0c;在此基础上&#xff0c;双方展开了深度合作&#xff0c;并在今天&#xff08;3月1日&#xff09;正式上线“云消息队列 Confluent 版”。 通过将 Co…

基于51单片机心率脉搏计设计

目 录 摘 要 I Abstract II 引 言 1 1 控制系统设计 3 1.1 系统方案设计 3 1.2 系统总体设计 4 2 硬件设计 5 2.1 主控电路 5 2.2 驱动电路 8 2.3 信号采集电路 10 2.4 显示电路 13 2.5 总体电路图设计 15 3 软件设计 16 3.1 软件开发环境的介绍 16 3.2 系统重要函数介绍 16 4…

解决QMYSQL driver not loaded问题

前言 之前都是在Qt5.51上开发&#xff0c;连接mysql数据库一直没有问题&#xff0c;换到5.15.2后一直报错 一查才发现\5.15.2\msvc2019_64\plugins\sqldrivers目录下没有qsqlmysql了&#xff0c;5.5.1是有的&#xff0c;5.15.2是要自己编译的。。。 下载源码 安装qt的时候没…

大型多模态智能体:综述

论文链接&#xff1a;https://arxiv.org/abs/2402.15116 大型语言模型&#xff08;LLMs&#xff09;在推动文本基础的智能体方面已经取得了超群的性能&#xff0c;赋予它们类似人类的决策和推理能力。与此同时&#xff0c;一个新兴的研究趋势集中于将这些LLM驱动的智能体扩展到…

这套系统架构,同事直呼666

你使用的每一个热门应用程序的背后,都有一个由架构、测试、监控和安全措施组成的软件系统。今天让我们看一下满足生产环境应用程序的高级架构由哪些体系组成。 CI/CD 管道 我们的第一个关键领域是持续集成和持续部署——CI/CD 管道。 这确保了我们的代码从存储库出发,经过…

【TOP】中科院1区TOP,Elsevier出版社,仅2-3个月录用!

【SciencePub学术】 01 期刊基本信息 【期刊简介】IF&#xff1a;5.0-5.5&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff1b; 【版面情况】正刊&#xff0c;仅10篇版面&#xff1b; 【检索情况】SCIE在检&#xff0c;预计3个月左右录用&#xff1b; 【征稿领域】有关…

图机器学习(2)-图的基本表示

0 复习 1 图的基本表示 1.1 本体图Ontology 疾病和食物之间的关系&#xff1a;能吃、不能吃、推荐吃。 1.2 图的种类 药物和药物之间的副作用就是异质图&#xff1a; 二分图是一种特殊的异质图&#xff1a; 1.3 节点连接数 通过节点数可以说明节点的重要度。 1.4 邻接…

.NetCore6.0实现ActionFilter过滤器记录接口请求日志

文章目录 目的实现案例&#xff1a;一.首先我们新建一个WebApi项目二.配置 appsettings.json 文件&#xff0c;配置日志存放路径三.创建 Model 文件夹&#xff0c;创建AppConfig类和ErrorLog类1.在AppConfig类中编写一个GetConfigInfo方法获取配置文件中的值2.在ErrorLog类中&a…

Apache Flink连载(三十七):Flink基于Kubernetes部署(7)-Kubernetes 集群搭建-3

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录

重庆有哪些媒体资源?活动展会媒体邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 重庆作为中国的一个直辖市&#xff0c;拥有丰富的媒体资源&#xff0c;涵盖电视台、广播电台、报纸、杂志以及网络媒体等各个领域。这些媒体不仅是传播新闻和信息的重要渠道&#xff0c;…

学习JavaEE的日子 Day23 迭代器,LinkedList,Vector,Stack,HashSet,LinkedHashSet

Day23 1.迭代器 含义&#xff1a;遍历集合中的数据 分类&#xff1a;Iterator 和 ListIterator Iterator 和 ListIterator 区别 Iterator &#xff1a;Collection接口下所有的实现类都可以获取的迭代器&#xff0c;可以在遍历时删除元素 ListIterator &#xff1a;List接口下所…

京东数据分析平台(京东店铺数据分析工具)推荐

京东店铺数据分析能够帮助商家了解自己的经营状况&#xff0c;优化商品策略&#xff0c;提高销售效率。以下是京东店铺数据分析的一些基本步骤和方法&#xff1a; 首先&#xff0c;在进行京东店铺数据分析时&#xff0c;我们需要借助一些电商数据分析工具来获取相关数据&#…

一次一对一服务引起的沉思和笑话(微信号Stefan)

前情提要 客户需求&#xff1a; 分析页面代码和接口请求协议和参数需求&#xff0c;将人工下载视频怎么获得最终的视频链接&#xff0c;这一逻辑清晰的展示并讲解清除。我询问了是否需要成品爬虫&#xff0c;他说代码他自己能搞定。 我给的价格选择&#xff1a; 第一种、首…

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

[C#]winform基于C2PNet算法实现室内和室外图像去雾

【CP2Net框架】 https://github.com/YuZheng9/C2PNet 【CP2Net介绍】 Abstract 考虑到不适定的性质&#xff0c;发展了单图像去模糊的对比正则化&#xff0c;引入了来自负图像的信息作为下界。然而&#xff0c;对比样本是非一致的&#xff0c;因为阴性通常距离清晰&#xff…

二维码门楼牌管理系统应用场景:赋能市场研究与城市决策的新动力

文章目录 前言一、市场研究的新视角&#xff1a;门牌数据揭示市场趋势二、城市规划的得力助手&#xff1a;门牌数据指导资源分配三、决策制定的科学依据&#xff1a;门牌数据提升决策准确性四、未来展望&#xff1a;二维码门楼牌管理系统的更多可能性 前言 随着信息技术的飞速…

国创证券|存钱有窍门,掌握这五个窍门利息高出不少?

大部分居民会把手中闲置的资金存入银行&#xff0c;享用安稳的收益&#xff0c;其间存在以下五个诀窍&#xff1a; 1、比照不同银行的利率 储户在去银行存钱时&#xff0c;能够比照不同银行的利率&#xff0c;尽量地挑选利率较高的银行存&#xff0c;来获取较多的收益&#x…

UML类图详解

目录 概述1 什么是UMLUML模型和图形UML2.2中一共定义了14种图示。 2 UML类图作用3 类图格式4类与类之间的关系表达 概述 我们在阅读开源项目时&#xff0c;总是希望能比较高效的整理清楚项目中的各个类之间的关系&#xff0c;那么有没有相应的工具能高效、简洁的表示清楚类关系…

CMake:开始

文章目录 在计算机上获取和安装 CMake目录结构基本 CMake 用法CMakeLists文件适用于 CMake 的 Hello World配置和生成运行 CMake GUI运行 ccmake Curses 接口从命令行运行 CMake将编译器指定为 CMake构建配置构建项目 在计算机上获取和安装 CMake 在使用 CMake 之前&#xff0…

Sharding-JDBC源码解析与vivo的定制开发

作者&#xff1a;vivo IT 平台团队 - Xiong Huanxin Sharding-JDBC是在JDBC层提供服务的数据库中间件&#xff0c;在分库分表场景具有广泛应用。本文对Sharding-JDBC的解析、路由、改写、执行、归并五大核心引擎进行了源码解析&#xff0c;并结合业务实践经验&#xff0c;总结…