【vue3之组合式API】

组合式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. 跨层传递方法

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

一、setup

1.写法

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

<script.
export default{
	setup(){
	},
	beforeCreate(){
	}
}

但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>

注:数据和函数需要在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 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>

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'
// 原始数据
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选项接收数据

在这里插入图片描述

2. 子传父

基本思想

  1. 父组件中给子组件标签通过@绑定事件
  2. 子组件内部通过 emit 方法触发事件
    在这里插入图片描述

七、模版引用

概念:通过 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. 跨层传递方法

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

在这里插入图片描述

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

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

相关文章

数字创新的风口:创业者如何在Web3时代抢占先机

随着区块链技术的不断发展&#xff0c;Web3正成为数字创新的新风口&#xff0c;为创业者们带来了前所未有的机遇和挑战。本文将从另一个角度探讨Web3对创业者的影响&#xff0c;并提出创业者在Web3时代抢占先机的策略和方法。 1. Web3重新定义了商业模式 Web3不仅仅是一种技术…

Java设计模式:建造者模式之经典与流式的三种实现(四)

本文将深入探讨Java中建造者模式的两种实现方式&#xff1a;经典建造者与流式建造者。建造者模式是一种创建型设计模式&#xff0c;它允许你构建复杂对象的步骤分解&#xff0c;使得对象的创建过程更加清晰和灵活。我们将通过示例代码详细解释这两种实现方式&#xff0c;并分析…

重塑Android通信新格局:探秘Android 8.0之后的Binder架构革新

重塑Android通信新格局:探秘Android 8.0 之后的Binder架构革新 1. 引言 Android作为全球主流移动操作系统,在移动设备领域扮演着举足轻重的角色。其开放性、灵活性和广泛的应用生态系统使得无数用户和开发者受益。作为一个基于Linux内核的操作系统,Android的核心架构设计至…

Spring Webflux 详解

目录 0、组件对比 1、WebFlux 1、引入 2、Reactor Core 1、HttpHandler、HttpServer 3、DispatcherHandler 1、请求处理流程 4、注解开发 1、目标方法传参 2.返回值写法 5、文件上传 6、错误处理 7、RequestContext 8、自定义Flux配置 9、Filter WebFlux&am…

Elasticsearch模拟网络丢包

背景 Elasticsearch一旦遇到网络抖动就可能节点&#xff08;单个或者多个&#xff09;掉出集群。从而集群出现red/yellow状态&#xff0c;理论情况下ES会自愈&#xff0c;但某些情况下可能非预期&#xff0c;此时就需要我们模拟各种case了&#xff0c;比如网络丢包。 操作 1…

postman Unable to load data as you are offline解决办法 重新登陆无效

postman Unable to load data as you are offline解决办法 重新登陆无效 也能如下一直打不开 - 重新登陆试过了 没有效果 - 刚刚代理切换到了全局,软件内的开关开启了 修改后

鸿蒙NEXT开发实战:【网络管理-数据请求】

概述 本示例仿postman输入API接口地址&#xff0c;获取相应数据&#xff0c;介绍数据请求接口的用法。 样例展示 基础信息 Http 介绍 本示例通过[ohos.net.http]等接口&#xff0c;实现了根据URL地址和相关配置项发起http请求的功能。 效果预览 首页结果页 使用说明 1.…

java上传本地文件到服务器共享

在Windows系统中,将本地文件夹中的某个文件上传到另一台Windows服务器电脑上,前提:两台电脑网络互通,要接收文件的Windows服务器文件夹开启了共享,可以被本机用如下方式进行写入和读取: 如何配置服务器共享请自行百度查找。 所需要的maven依赖如下: <dependency>…

备战蓝桥杯————二分查找(二)

引言 在上一篇博客中&#xff0c;我们深入探讨了二分搜索算法及其在寻找数组左侧边界的应用。二分搜索作为一种高效的查找方法&#xff0c;其核心思想在于通过不断缩小搜索范围来定位目标值。在本文中&#xff0c;我们将继续这一主题&#xff0c;不仅会回顾二分搜索的基本原理&…

leetcode 热题 100_最小覆盖子串

题解一&#xff1a; 双指针滑动窗口&#xff1a;暴力解法——用双指针来表示字符串s中的子串首尾&#xff0c;遍历所有子串并与字符串t判断是否符合条件。我们可以对遍历和判断的过程进行优化&#xff0c;首先是遍历&#xff0c;右指针先移动直到涵盖所以需要的字母&#xff0c…

弹性地基梁matlab有限元编程 | 双排桩支护结构 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

记一次systemd服务启动找不到Java命令

首先systemd服务文件 /etc/systemd/system/test.service(文件简化处理了) [Unit] Descriptiontest Afternetwork.target [Service] ExecStart/opt/test/bin/test_start.sh [Install] WantedBymulti-user.target其中启动命令ExecStart指向的是一个sh启动脚本&#xff0c; 脚本内…

Zabbix(三)

监控Nginx服务 nginx配置 增加location{} [rootwenzi ~]#vim /etc/nginx/sites-enabled/defaultserver_name _; #_是通配符。服务器将响应任何域名的请求 ...location /status { stub_status;} ...访问 http://IP/status 即可 zabbix配置 Nginx by HTTP&#xff1a;无…

【重要公告】BSV区块链上线TypeScript SDK,未来将支持更多开发语言

​​发表时间&#xff1a;2024年2月21日 BSV区块链协会宣布上线JavaScript和TypeScript SDK&#xff08;即“标准开发工具包”&#xff09;。TypeScript SDK旨在为开发者提供新版统一核心代码库&#xff0c;以便利开发者在BSV区块链上开发能够任意扩容的应用程序。新上线的SDK替…

目标检测评估指标

目录 一、检测精度1、TP、FP、TN、FN概念正样本和负样本TP(True Positive---正确的正向预测)FP(False Positive---错误的正向预测&#xff09;FN(False Negative---错误的负向预测)TN(True Negative---正确的负向预测) 2、Precision(准确率)和Recall(召回率)3、P-R curve &…

C++STL【list链表】

list 1. list介绍 list文档&#xff08;非官方&#xff09; 官方文档list是双向带头循环链表&#xff0c;它可以在常数范围内的任意位置进行插入和删除操作。list的迭代器是双向迭代器(bidirectional iterator)&#xff0c;它可以前后双向迭代。 由容器的底层结构决定&#xf…

SQOOP安装与使用

SQOOP安装及使用 文章目录 SQOOP安装及使用SQOOP安装1、上传并解压2、修改配置文件3、修改环境变量4、添加MySQL连接驱动5、测试 准备MySQL数据登录MySQL数据库创建student数据库切换数据库并导入数据另外一种导入数据的方式使用Navicat运行SQL文件导出MySQL数据库 importMySQL…

HarmonyOS应用开发-环境搭建(windows环境)

官网地址&#xff1a;链接 DevEco Studio 3.1.1 Release&#xff1a;下载地址 1、安装DevEco Studio 直接安装即可 2、配置开发环境 1.运行已安装的DevEco Studio&#xff0c;首次使用&#xff0c;请选择Do not import settings&#xff0c;单击OK。 2.安装Node.js与ohpm。注…

【MySQL】索引优化与关联查询优化

数据库调优的几个维度&#xff1a; 索引失效&#xff0c;没有充分用到索引——索引建立关联查询太多JOIN——SQL优化服务器调优以及各个参数设置——调整my.cnf数据过多——分库分表 SQL查询优化的几种方式&#xff1a; 物理查询优化&#xff1a;通过索引以及表连接方式进行…

微服务分布式中为什么要分库分表呢?

什么是分库分表&#xff1f; 概念&#xff1a; 分库分表是一种数据库水平扩展的方法&#xff0c;通过将数据分散存储在多个数据库实例或多张表中&#xff0c;以提高系统的性能和扩展性。在Java应用中&#xff0c;可以使用一些数据库中间件或框架来实现分库分表。 为什么要分…