第Ⅷ章-Ⅰ 组合式API初识

第Ⅷ章-Ⅰ 组合式API初识

  • 简介
    • setup 函数
  • 为什么要使用Composition API
    • 逻辑复用和组织
    • 更灵活的逻辑组合
    • 适应未来的 Vue 生态系统
  • options API存在的问题
    • 代码重复:
    • 逻辑分散
    • 缺乏复用性
  • Composition API 中的 setup()入口
    • props 参数
    • context 参数
  • ref 响应式监听
  • reactive与toRefs
    • reactive
    • toRefs
  • computed的用法
  • watch的用法
  • setup()参数 props参数
  • context参数
    • emit
    • attrs
    • slots

简介

Composition API 是 Vue 3 引入的一种新的编写组件逻辑的方式。它通过将组件的逻辑按功能性分组,而不是按生命周期分组,从而提供更灵活的组件逻辑组合方式。Composition API 的核心是 setup 函数,组件内的逻辑通常在 setup 中定义。以下是它的基本概念:

setup 函数

  • 是组件逻辑的入口点,在组件实例创建时被调用。
  • 接收两个参数 props 和 context。
  • 返回的对象属性可以被模板中直接访问。
<!-- 使用 Composition API 的基本示例 -->
<template><div>{{ message }}</div><button @click="increment">Increment: {{ count }}</button>
</template><script setup>
import { ref } from 'vue';const message = ref('Hello, Vue 3!');
const count = ref(0);const increment = () => {count.value++;
};
</script>

为什么要使用Composition API

逻辑复用和组织

  • 问题:在选项式 API 中,组件的逻辑通常分散在 data、methods、computed 等属性中,很难复用和维护。
  • 解决方案:Composition API 可以将相关的逻辑组合在一起,并可以通过自定义组合函数轻松复用逻辑。

更灵活的逻辑组合

  • Composition API 提供了组合逻辑的自由度,可以更清晰地组织组件的功能。

适应未来的 Vue 生态系统

  • Vue 3 和未来的 Vue 工具链都将大量使用 Composition API,因此尽早熟悉它会有助于适应未来的 Vue 生态系统。

options API存在的问题

代码重复:

逻辑相似的功能会在不同的组件中重复出现。

逻辑分散

同一功能的逻辑会分散在 data、methods、computed 和 watch 中,不易追踪。

缺乏复用性

尽管 mixins 可以复用一些逻辑,但存在命名冲突和可读性问题。

Composition API 中的 setup()入口

setup() 函数是 Composition API 的入口点,所有的组件逻辑都可以在这里定义。它接收两个参数 props 和 context。

props 参数

组件接收的属性,具有响应性。

context 参数

包含 attrs、slots 和 emit 属性
attrs:包含没有被显式声明的 props。
slots:传入的插槽内容。
emit:用于触发事件。

ref 响应式监听

ref 函数用于创建单一响应式值,它将一个普通数据类型或对象包装成响应式的引用,并且返回一个包含 .value 属性的对象。

<template><div>Count: {{ count }}</div><button @click="increment">Increment</button>
</template><script setup>
import { ref } from 'vue';const count = ref(0);const increment = () => {count.value++;
};
</script>

reactive与toRefs

reactive

将一个对象变为响应式对象。

<template><div><p>Name: {{ user.name }}</p><p>Age: {{ user.age }}</p></div>
</template><script setup>
import { reactive } from 'vue';const user = reactive({name: 'Alice',age: 30
});
</script>

toRefs

将 reactive 对象中的属性转换为 ref,以便可以解构和保持响应性。

<template><div><p>Name: {{ name }}</p><p>Age: {{ age }}</p></div>
</template><script setup>
import { reactive, toRefs } from 'vue';const user = reactive({name: 'Alice',age: 30
});const { name, age } = toRefs(user);
</script>

computed的用法

computed 用于定义基于其他响应式属性的计算属性,类似于选项式 API 中的 computed 属性。

<template><p>Double Count: {{ doubleCount }}</p>
</template><script setup>
import { ref, computed } from 'vue';const count = ref(2);
const doubleCount = computed(() => count.value * 2);
</script>

watch的用法

watch 用于观察响应式属性的变化并执行副作用操作。

<template><div><input v-model="name" placeholder="Name" /><p>{{ name }}</p></div>
</template><script setup>
import { ref, watch } from 'vue';const name = ref('Alice');watch(name, (newValue, oldValue) => {console.log(`Name changed from ${oldValue} to ${newValue}`);
});
</script>

setup()参数 props参数

props 是 setup 函数的第一个参数,包含父组件传递的属性。它是响应式的,但是不能解构,否则会失去响应性。

<!-- ParentComponent.vue -->
<template><ChildComponent message="Hello, Child!" />
</template><script setup>
import ChildComponent from './ChildComponent.vue';
</script>
<!-- ChildComponent.vue -->
<template><div>{{ message }}</div>
</template><script setup>
import { defineProps } from 'vue';// 使用 defineProps
const props = defineProps({message: String
});
</script>

context参数

context 是 setup 函数的第二个参数,包含 attrs、slots 和 emit 属性。

emit

用于触发事件,类似于选项式 API 中的 $emit。

<!-- ParentComponent.vue -->
<template><ChildComponent @message="handleMessage" /><p>{{ parentMessage }}</p>
</template><script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';const parentMessage = ref('');const handleMessage = (msg: string) => {parentMessage.value = msg;
};
</script>
<!-- ChildComponent.vue -->
<template><button @click="sendMessage">Send Message to Parent</button>
</template><script setup>
import { defineEmits } from 'vue';const emit = defineEmits(['message']);const sendMessage = () => {emit('message', 'Hello from Child Component!');
};
</script>

attrs

包含没有显式声明的属性和事件。

<template><input v-bind="attrs" />
</template><script setup>
import { useAttrs } from 'vue';const attrs = useAttrs();
</script>

slots

包含传递的插槽内容。

<!-- ParentComponent.vue -->
<template><ChildComponent><template #header><h1>Custom Header</h1></template></ChildComponent>
</template><script setup>
import ChildComponent from './ChildComponent.vue';
</script>
<!-- ChildComponent.vue -->
<template><slot name="header"></slot><p>Default Content</p>
</template><script setup>
import { useSlots } from 'vue';const slots = useSlots();
</script>

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

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

相关文章

Vue3(管理系统)-封装axios(utils)

一、在utils下编写request.js实例 1.添加基地址&#xff0c;设置超时时间 import axios from axios const baseURL http://big-event-vue-api-t.itheima.net const instance axios.create({// TODO 1. 基础地址&#xff0c;超时时间baseURL,timeout: 3000 }) 2.添加请求拦截…

[C++][数据结构]红黑树的介绍和模拟实现

前言 之前我们简单学习了一下搜索树和平衡搜索树&#xff0c;今天我们来学习一下红黑树 简介 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着…

为什么技术面一般不谈薪资?

我这些年做了很招聘工作&#xff0c;一般都被告知在技术面时不谈论薪资。 其实我一直觉得挺麻烦的&#xff0c;这人不就是我决定要不要吗&#xff1f; 我除了评估技术能力是否合格&#xff0c;再根据开价情况来做决定不就完事吗。每次面完我再等着HR去谈完薪资&#xff0c;然…

面试官:关于HTTPS/HTTP2/HTTP3你懂多少?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ HTTPS是什么 HTTP为什么不安全&#xff1f; https被认为是通信安全的http&#xff0c;除了http多了s和默认端口改成了443之外&#xff0c;其他都是沿用的http&#xff08;除了明文和不安全&#xff09;&#xff0…

基于FPGA的数字信号处理(9)--定点数据的两种溢出处理模式:饱和(Saturate)和绕回(Wrap)

1、前言 在逻辑设计中&#xff0c;为了保证运算结果的正确性&#xff0c;常常需要对结果的位宽进行扩展。比如2个3bits的无符号数相加&#xff0c;只有将结果设定为4bits&#xff0c;才能保证结果一定是正确的。不然&#xff0c;某些情况如77 14(1110)&#xff0c;如果结果只…

SOLIDWORKS Electrical由3D布局生成2D机柜布局图

想要转换3D装配体到Electrical中需要在3D打开Electrical插件&#xff0c;并使用工程管理器打开需转换工程图的装配体 1、创建2D图纸 打开后在上方工具选项卡中选择-SOLIDWORKS Electrical选项卡-的创建2D图纸 2、选择图纸视角 使用创建2D图纸后就会进入工程图界面&#xff0c;在…

裁员为什么先裁技术人员?

最近这个问题比较火&#xff0c;我分享一个印象深刻的答案&#xff1a;楼盖完了&#xff0c;还需要搬砖的吗&#xff1f; 这个答案让我对互联网/程序员这个行业/职业有了新的认识。 房地产是在现实世界里盖房子&#xff0c;互联网是在虚拟世界里盖房子&#xff0c;只不过互联网…

第78天:WAF攻防-菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

目录 案例一&#xff1a; 菜刀-流量&绕过&特征&检测 菜刀的流量特征 案例二&#xff1a;冰蝎-流量&绕过&特征&检测 冰蝎使用教程 冰蝎的流量特征 案例三&#xff1a; 哥斯拉-流量&绕过&特征&检测 哥斯拉使用教程 哥斯拉的流量特征…

调用第三方接口——支付宝付款

沙箱环境是支付宝开放平台为开发者提供的用于接口开发及主要功能联调的模拟环境。 参考 登录 - 支付宝 在沙箱环境下&#xff0c;已经分配好了用于模拟测试的应用信息、商家信息、买家信息等 小程序文档 - 支付宝文档中心 内网穿透&#xff08;支付宝付款需要在公网进行检查…

PyTorch深度学习框架:从入门到实战

前言 学习 PyTorch 深度学习框架之前先学会深度学习和卷积神经网络 CNN &#xff0c;这样学习起来会更香嗷。 Windows系统下PyTorch的环境配置 Anaconda是什么&#xff1a; Anaconda是一个开源的Python发行版本&#xff0c;专注于数据分析领域。它包含了conda、Python等190多…

为什么感觉没有效果

以前在辅导小儿作业的时候&#xff0c;我会在常用的搜索引擎里去寻找答案&#xff0c;一般情况下都能解决问题。 但是最近一段时间&#xff0c;我发现&#xff0c;搜索引擎搜出来的结果还没有利用短视频搜出来的答案更全面&#xff0c;短视频软件不仅可以显示AI整理出来的答案…

CTF(Web)中关于执行读取文件命令的相关知识与绕过技巧

在我遇到的题目中&#xff0c;想要读取文件必然是要执行cat /flag这个命令&#xff0c;但是题目当然不会这么轻松。让你直接cat出来&#xff0c;必然会有各种各样的滤过条件&#xff0c;你要做的就是尝试各种方法在cat /flag的基础上进行各种操作构建出最终的payload。 下面我…

【C++风云录】跨越星辰大海:六大库在宇宙物理学和天文学的实际应用

走近科学&#xff1a;理解和利用宇宙物理学与天文学的科研工具 前言 本文将探讨六个不同的库&#xff0c;分别是HEALPix&#xff0c;CCfits&#xff0c;CFITSIO&#xff0c;WCSLIB&#xff0c;AstroPy和ROOT&#xff0c;他们在宇宙物理学和天文学中的重要应用。我们将详细介绍…

【LeetCode 121】买卖股票的最佳时机

思路 思路&#xff1a; 所谓代码的复杂性来源于业务的复杂性&#xff0c;如果能够想清楚业务实现逻辑&#xff0c;就能够轻松写出代码&#xff1b; 假设当前是第i天&#xff0c;如何在第i天赚到最多的钱&#xff1f;需要在第i天之前以最低价买入股票&#xff1b; 所以需要求…

微博视频怎么下载无水印

在当今社交媒体时代&#xff0c;微博已经成为人们获取信息、分享生活的重要平台之一。许多人在浏览微博时常常遇到一个问题&#xff1a;如何下载微博视频而不留下烦人的水印呢?今天&#xff0c;我将分享一些神秘的方法&#xff0c;让你轻松解锁微博视频的无水印下载技巧。 第…

Python实现2048游戏

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待! 在这篇博客中,我们将使用 Python 和 Pygame 库来编写经典的 2048 游戏。2048 是一个益智类游戏,通过在 4x4 网格上滑动方块并合并它们来创建一个新的数字,直到获得数字 2048 或者无法继…

武汉星起航:跨境电商行业领航者,一站式孵化服务引领全球趋势

在全球化日益深入的今天&#xff0c;跨境电商作为连接各国市场的桥梁&#xff0c;其重要性日益凸显。在这一潮流中&#xff0c;武汉星起航电子商务有限公司以其前瞻性的战略眼光和丰富的运营经验&#xff0c;迅速崛起为跨境电商行业的领军者。公司不仅自营亚马逊跨境电商业务&a…

一对一WebRTC视频通话系列(四)——offer、answer、candidate信令实现

本篇博客主要讲解offer、answer、candidate信令实现&#xff0c;涵盖了媒体协商和网络协商相关实现。 本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点&#xff0c;代码全部进行了注释&#xff0c;便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客 一…

vue3引入element-plus完整步骤

在Vue 3项目中引入Element Plus的完整步骤如下&#xff1a; 安装Element Plus&#xff1a; 使用npm&#xff08;或cnpm&#xff0c;如果你在中国并且希望使用淘宝的npm镜像&#xff09;来安装Element Plus。在项目的根目录下&#xff0c;打开命令行工具并执行以下命令&#x…

Python深度学习:【模型系列】强化学习简介及优质学习资源

文章目录 1.强化学习概述基本组成主要算法类别应用领域2.优质在线学习资源1.强化学习概述 强化学习(Reinforcement Learning, RL)是机器学习的一个子领域,它涉及智能体(agent)通过与环境的交互来学习如何在给定的任务中最大化某种累积奖励。 强化学习不同于监督学习,它…