组合API

组合API

  • 1. 为什么要引入组合API
  • 2. setup()函数
  • 3. 响应式API
    • 3.1 reactive和watchEffect
    • 3.2 ref
    • 3.3 readonly
    • 3.5 watch
  • 4. 生命周期钩子
  • 5. 依赖注入
  • 6. 逻辑提取和重用
  • 7. 小结

1. 为什么要引入组合API

组合API是Vue 3中引入的一种新的编程模式,它将组件的逻辑分散到多个函数中,使得代码更加可读、可维护。通过引入组合API,可以解决Vue 2中使用Options API时遇到的一些问题,如代码复用性差、组件逻辑难以拆分等。

2. setup()函数

在Vue 3中,引入了setup()函数来声明组件的逻辑。在组件创建时,该函数会被调用,我们可以在该函数中进行一些初始化操作,并且返回一个包含模板中要使用的数据、方法等的对象。

代码案例:

<template><div><p>计数器:{{ count }}</p ><button @click="increment">增加</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {const count = ref(0);const increment = () => {count.value++;};return {count,increment};}
};
</script>

代码运行结果:

计数器:0
增加按钮

代码分析:

  • 在上述代码中,我们使用了setup()函数来初始化组件的数据和方法。
  • 在setup()函数中,通过调用ref()创建了一个响应式的数据count,并设置初始值为0。
  • 在increment函数中,我们通过count.value++来增加计数器的值。
  • 最后,我们将count和increment作为返回值,使得在模板中可以使用count和increment。

3. 响应式API

在Vue 3中,提供了一系列的响应式API,用于管理和操作组件中的响应式数据。

代码案例:

<template><div><p>用户名:{{ user.name }}</p ><p>年龄:{{ user.age }}</p ><button @click="changeUser">更改用户</button></div>
</template><script>
import { reactive } from 'vue';export default {setup() {const user = reactive({name: 'Alice',age: 20});const changeUser = () => {user.name = 'Bob';user.age = 25;};return {user,changeUser};}
};
</script>

代码运行结果:

用户名:Alice
年龄:20
更改用户按钮

代码分析:

  • 在上述代码中,我们使用了reactive()函数来创建一个响应式对象user,其中包含了name和age两个属性。
  • 在changeUser函数中,我们通过修改user对象的属性来改变用户的姓名和年龄。
  • 由于使用了响应式API,当user的属性发生变化时,页面上展示的数据也会自动更新。

3.1 reactive和watchEffect

在Vue中,我们可以使用reactive()函数来创建响应式对象,并使用watchEffect()函数来观察响应式数据的变化。

代码案例:

<template><div><p>计数器:{{ count }}</p ><button @click="increment">增加</button></div>
</template><script>
import { reactive, watchEffect } from 'vue';export default {setup() {const state = reactive({count: 0});const increment = () => {state.count++;};watchEffect(() => {console.log('计数器变化:', state.count);});return {count: state.count,increment};}
};
</script>

代码运行结果:

计数器:0
增加按钮
(点击增加按钮后,控制台输出:计数器变化:1

代码分析:

  • 在上述代码中,我们使用reactive()函数创建了一个响应式对象state,并在其中定义了一个count属性。
  • 在increment方法中,我们通过state.count++来增加计数器的值。
  • 使用watchEffect()函数来观察state.count的变化,并在变化时执行回调函数,此处简单地在控制台输出计数器的变化值。
  • 最后,我们将state.count和increment作为返回值,以供模板中使用。

3.2 ref

在Vue中,我们可以使用ref()函数创建一个包装的容器,用于在组件中包裹一个简单值,并保持响应式。

代码案例:

<template><div><p>计数器:{{ count.value }}</p ><button @click="increment">增加</button></div>
</template><script>
import { ref } from 'vue';export default {setup() {const count = ref(0);const increment = () => {count.value++;};return {count,increment};}
};
</script>

代码运行结果:

计数器:0
增加按钮
(点击增加按钮后,计数器的值会随之增加)

代码分析:

  • 在上述代码中,我们使用ref()函数创建了一个容器count,并初始化其值为0。
  • 在increment方法中,我们通过count.value++来增加计数器的值。需要注意的是,由于count是ref容器,我们需要通过.count来访问实际的值。
  • 最后,我们将count和increment作为返回值,以供模板中使用。

3.3 readonly

在Vue中,我们可以使用readonly()函数将一个对象或数组设置为只读,从而使其变为只读的响应式数据。

代码案例:

<template><div><p>只读数据:{{ message }}</p ></div>
</template><script>
import { readonly } from 'vue';export default {setup() {const data = readonly({message: 'Hello Vue!'});return {message: data.message};}
};
</script>

代码运行结果:

只读数据:Hello Vue!

代码分析:

  • 在上述代码中,我们使用readonly()函数将一个对象data设置为只读的响应式数据。
  • 在模板中,我们通过data.message来访问只读数据。
  • 由于只读数据不可修改,所以我们不能在组件中直接修改data.message的值。

3.4 computed:
在Vue中,我们可以使用computed()函数创建一个计算属性,用于根据依赖的响应式数据进行计算。

代码案例:

<template><div><p>半径:{{ radius }}</p ><p>圆的面积:{{ area }}</p ></div>
</template><script>
import { ref, computed } from 'vue';export default {setup() {const radius = ref(5);const area = computed(() => {return Math.PI * radius.value * radius.value;});return {radius,area};}
};
</script>

代码运行结果:

半径:5
圆的面积:78.54

代码分析:

  • 在上述代码中,我们使用ref()函数创建了一个容器radius,并初始化其值为5。
  • 使用computed()函数来创建一个计算属性area,其值是根据radius.value计算得出的圆的面积。
  • 最后,我们将radius和area作为返回值,以供模板中使用。

3.5 watch

在Vue中,我们可以使用watch()函数来监听响应式数据的变化,并在变化时执行回调函数。

代码案例:

<template><div><p>用户名:{{ username }}</p ><p>年龄:{{ age }}</p ></div>
</template><script>
import { ref, watch } from 'vue';export default {setup() {const username = ref('');const age = ref(0);watch([username, age], ([newUsername, newAge], [oldUsername, oldAge]) => {console.log('用户信息变化:', newUsername, newAge);});return {username,age};}
};
</script>

代码运行结果:

用户名:
年龄:
(当username和age发生变化时,控制台输出用户信息变化的内容)

代码分析:

  • 在上述代码中,我们使用ref()函数分别创建了username和age两个容器,并初始化其初始值为空字符串和0。
  • 使用watch()函数来监听username和age的变化,并在变化时执行回调函数,回调函数接收两个参数:新值和旧值。
  • 在回调函数中,我们简单地在控制台输出用户信息的变化内容。
  • 最后,我们将username和age作为返回值,以供模板中使用。

4. 生命周期钩子

Vue中的生命周期钩子函数用于在组件的不同生命周期阶段执行特定的逻辑。它们可以帮助我们在组件创建、更新和销毁的过程中做一些额外的操作。

5. 依赖注入

依赖注入是一种设计模式,用于提供组件之间的依赖关系。在Vue中,可以使用provide和inject方法来实现依赖注入,通过父组件提供数据,并在子组件中接收和使用这些数据。

6. 逻辑提取和重用

在开发过程中,我们经常会遇到需要重复使用的逻辑。Vue提供了mixin、自定义指令、插件等方法来实现逻辑的提取和重用,以便我们更高效地开发和维护代码。

7. 小结

在本章中,我们学习了Vue中的生命周期钩子、依赖注入和逻辑提取和重用的方法。生命周期钩子函数帮助我们在组件不同的生命周期阶段执行特定的逻辑,依赖注入提供了一种方便的方式来实现组件之间的数据传递,逻辑提取和重用通过mixin、自定义指令、插件等方法帮助我们更高效地开发和维护代码。

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

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

相关文章

Linux 下centos 查看 -std 是否支持 C17

实际工作中&#xff0c;可能会遇到c的一些高级特性&#xff0c;例如std::invoke&#xff0c;此函数是c17才引入的&#xff0c;如何判断当前的gcc是否支持c17呢&#xff0c;这里提供两种办法。 1.根据gcc的版本号来推断 gcc --version&#xff0c;可以查看版本号&#xff0c;笔者…

数据结构【线性表】

数据结构入门级 第二章 线性表 一、线性表的定义和基本操作 线性表的定义&#xff1a;具有相同属性数据类型的数据元素组成的一个有限序列&#xff1b;除第一个元素外的元素都有直接前驱&#xff0c;除最后一个元素外的元素都有直接后继&#xff1b;存在一个唯一被称为“第一个…

从简单线性回归到TensorFlow深度学习

大家好&#xff0c;人工智能近年来变得越来越流行&#xff0c;学习人工智能的需求也随之增加&#xff0c;尤其是许多IT专业人士希望利用机器学习的强大功能&#xff0c;但面临不小的挑战&#xff0c;尤其是在理论和数学上。 步骤1&#xff1a;线性回归 线性回归是一种统计学中…

lucene、solr、es的区别以及应用场景

目录 1. Lucene:2. Solr:3. Elasticsearch: Lucene、Solr 和 Elasticsearch(ES) 都是基于 Lucene 引擎的搜索引擎&#xff0c;它们之间有相似之处&#xff0c;但也有一些不同之处。 Lucene 是一个低级别的搜索引擎库&#xff0c;它提供了一种用于创建和维护全文索引的 API&…

RNN架构解析——GRU模型

目录 GRU模型实现优点和缺点 GRU模型 实现 优点和缺点

【C语言day06】

逻辑或运算如果前表达式为真&#xff0c;后表达式不计算&#xff0c;第一次循环时i为0&#xff0c;执行i&#xff0c;第二次循环时i为1&#xff0c;是个真值&#xff0c;不再执行i&#xff0c;也就死循环了 在C语言中&#xff0c;一个函数如果不写返回值类型&#xff0c;那么就…

【MyBatis 学习三】子段不一致问题 多表查询 动态SQL

目录 一、解决Java实体类属性与数据库表字段不一致问题 &#x1f337;现象1&#xff1a;显示字段不对应&#xff1a;使用ResultType查询结果为null&#xff1b; &#x1f337;解决办法&#xff1a;字段不对应&#xff1a;使用ResultMap解决。 二、数据库的多表查询 &#…

Go整合ElasticSearch

go整合elasticsearch 基于docker搭建开发环境在开发之前我们首先需要借助docker来构建我们的开发环境,先创建一个文件名称为docker-compose.yaml, 里面写入下面的内容: ---version: "3"services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsea…

Centos 7 - Anaconda3 安装教程及报错集锦

序言 这里笔者下载清华镜像&#xff0c;总会有问题&#xff0c;例如 wget 下载报错 安全证书什么的&#xff0c;就算解决证书问题&#xff0c;还不能下载&#xff0c;直接报错 Forbidden 403 &#xff0c;但是中科大镜像就不会。 中科大镜像 1、报错 WARNING: cannot verify…

【Spring Cloud Alibaba】Sentinel运行原理

文章目录 前言1、基本原理2、SphU.entry()2.1、StringResourceWrapper2.2、Entry 3、entry.exit()4、Context 前言 本文基于sentinel-1.8.0版本 Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保…

AVFoundation - 音视频组合编辑

文章目录 一、简要说明二、使用1、音频和视频合成2、视频的拼接一、简要说明 相关类 AVMutableCompositionAVMutableCompositionTrack二、使用 1、音频和视频合成 - (void)testCom1{AVMutableComposition *mutableComposition = [AVMutableComposition composition];AVMu

ajax axios json

目录 一、ajax概述 1. 概念 2. 实现方式 &#xff08;1&#xff09;原生的JS实现方式&#xff08;了解&#xff09; &#xff08;2&#xff09; JQeury实现方式 二、axios 介绍 三、axios使用 1. axios 发送get/post请求 2. axios验证用户名称是否存在 四、json 1. …

设计模式——观察者模式

文章目录 1 概述2 实现3 总结 1 概述 观察者模式可以分为观察者和被观察者&#xff0c;观察者通过注册到一个被观察者中&#xff0c;也可视为订阅&#xff0c;当被观察者的数据发生改变时&#xff0c;会通知到观察者&#xff0c;观察者可以据此做出反应。 可以类比订阅报纸&am…

vue3+ts+elementui-plus二次封装弹框

一、弹框组件BaseDialog <template><div classmain><el-dialog v-model"visible" :title"title" :width"dialogWidth" :before-close"handleClose"><!-- 内容插槽 --><slot></slot><template…

每天一个linux小技巧

1.nohup no hang up&#xff0c;用nohup运行命令可以使命令永久的执行下去&#xff0c;和用户终端没有关系&#xff0c;例如我们断开SSH连接都不会影响他的运行&#xff0c;注意了nohup没有后台运行的意思。 加&的作用是将&#xff0c;命令放到后台运行&#xff0c;使得终端…

【Docker】Consul的容器服务更新与发现

目录 一、Consul二、什么是服务注册与发现1.2什么是consul1.3consul提供的一些关键特性 二、Consul部署2.1环境配置2.2Consul服务器配置1. 建立 Consul 服务2. 查看集群信息3. 通过 http api 获取集群信息 2.3 registrator服务器配置1. 安装 Gliderlabs/Registrator2. 测试服务…

代码随想录算法训练营第四十九天|动态规划part10|● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

● 121. 买卖股票的最佳时机 Best Time to Buy and Sell Stock - LeetCode dp[i][0] 持有股票得到的最大现金 dp[i][1] 不持有股票得到的最大现金 dp[i][0] max(dp[i - 1][0], -price[i]); dp[i - 1][1] dp[i - 1][0] price[i] dp[i][1] max(dp[i - 1][0], dp[i - 1] pric…

【数据挖掘】PCA/LDA/ICA:A成分分析算法比较

一、说明 在深入研究和比较算法之前&#xff0c;让我们独立回顾一下它们。请注意&#xff0c;本文的目的不是深入解释每种算法&#xff0c;而是比较它们的目标和结果。 如果您想了解更多关于PCA和ZCA之间的区别&#xff0c;请查看我之前基于numpy的帖子&#xff1a; PCA 美白与…

Leetcode-每日一题【114.二叉树展开为链表】

题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。 展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例…

JavaEE——Spring中存取Bean的注解

目录 一、存储Bean对象 1、定义 2、存储方式 &#xff08;1&#xff09;、类注解 【1】、Controller&#xff08;控制器存储&#xff09; 【2】、Service&#xff08;服务存储&#xff09; 【3】、Repository&#xff08;仓库存储&#xff09; 【4】、Component&#xf…