Vue Composition API 有哪些常用的 API?

前言

随着前端框架的不断演进,Vue.js 也在不断地适应和改进,以提供更优雅和高效的开发体验。在 Vue 3 中,Composition API 的引入给开发者带来了很多新颖的编程方式。
今天,我们来探讨一下 Vue Composition API 的主要特性以及它们所带来的优势。

什么是 Composition API?

在 Vue 2 中,我们主要使用 Options API 来定义组件的逻辑和状态。然而,随着项目规模的扩大,组件逻辑可能会变得复杂且难以维护。Composition API 提供了一种更灵活和可组合的方式来组织代码,使得代码更加清晰和模块化。

常用 API 列表

1. setup

setup 函数是 Composition API 的核心。它是一个新的组件选项,用于定义组件的逻辑和状态。

import { ref } from 'vue';export default {setup() {const count = ref(0);const increment = () => {count.value++;};return { count, increment };},
};

2. ref 和 reactive

ref 和 reactive 是 Composition API 中最常用的两个函数,用于创建响应式变量和对象。

  • ref:用于基本数据类型(如数字、字符串、布尔值等)的响应式状态。
import { ref } from 'vue';const count = ref(0);
count.value++; // 通过 .value 访问和修改值
  • reactive:用于复杂数据类型(如对象和数组)的响应式状态。
import { reactive } from 'vue';const state = reactive({count: 0,user: {name: 'Alice',age: 30}
});state.count++;
state.user.age++;

3. computed

computed 用于创建响应式计算属性,它会根据依赖的数据自动更新。

import { ref, computed } from 'vue';const count = ref(0);
const doubleCount = computed(() => count.value * 2);count.value = 2;  // doubleCount 的值会自动更新为 4

4. watch 和 watchEffect

watch 和 watchEffect 用于监听响应式数据的变化。

  • watch:用于监听特定的响应式数据,并执行副作用。
import { ref, watch } from 'vue';const count = ref(0);
watch(count, (newValue, oldValue) => {console.log(`count changed from ${oldValue} to ${newValue}`);
});
  • watchEffect:用于立即执行并响应所有依赖的变化,适合处理复杂的副作用逻辑。
import { ref, watchEffect } from 'vue';const count = ref(0);
watchEffect(() => {console.log(`count is now ${count.value}`);
});

5. 生命周期钩子

Vue Composition API 通过一系列 onXXX 函数提供了生命周期钩子。

  • onMounted:组件挂载时调用
  • onUnmounted:组件卸载时调用
  • onUpdated:组件更新时调用
  • onBeforeMount:组件挂载前调用
  • onBeforeUnmount:组件卸载前调用
  • onBeforeUpdate:组件更新前调用
import { onMounted, onUnmounted } from 'vue';export default {setup() {onMounted(() => {console.log('Component is mounted');});onUnmounted(() => {console.log('Component is unmounted');});},
};

6. toRefs

当你使用 reactive 创建了一个响应式对象时,可能需要将对象内的属性拆解为单独的引用。toRefs 就是为此而生的。

import { reactive, toRefs } from 'vue';export default {setup() {const state = reactive({count: 0,name: 'Vue'});// 将 state 的属性解构为单独的 refconst { count, name } = toRefs(state);return { count, name };},
};

7. toRef

与 toRefs 类似,但 toRef 只将对象中的单个属性转换为引用。

import { reactive, toRef } from 'vue';export default {setup() {const state = reactive({count: 0,name: 'Vue'});const count = toRef(state, 'count');return { count };},
};

8. provide 和 inject

Composition API 提供了 provide 和 inject,用于在组件树中进行依赖注入,允许父组件向子组件传递数据或方法,而无需通过 props 层层传递。

// 父组件
import { provide } from 'vue';export default {setup() {const theme = 'dark';provide('theme', theme);},template: '<Child />',
};// 子组件
import { inject } from 'vue';export default {setup() {const theme = inject('theme');return { theme };},template: '<div>{{ theme }}</div>',
};

9. customRef

customRef 允许你自定义一个响应式引用,这在需要精细控制响应式行为时非常有用。

import { customRef } from 'vue';function useDebouncedRef(value, delay = 200) {let timeout;return customRef((track, trigger) => ({get() {track();return value;},set(newValue) {clearTimeout(timeout);timeout = setTimeout(() => {value = newValue;trigger();}, delay);},}));
}export default {setup() {const debouncedValue = useDebouncedRef('initial value');return { debouncedValue };},
};

10. markRaw 和 shallowRef

这些 API 用于创建非响应式或浅响应式的数据。

  • markRaw:标记一个对象,使其不被 Vue 转换为响应式对象。
import { markRaw } from 'vue';const rawData = markRaw({foo: 'bar'
});
  • shallowRef:创建一个浅响应式引用,仅对其值的顶层属性进行响应式处理。
import { shallowRef } from 'vue';const state = shallowRef({nested: {value: 123}
});state.value = { newProp: 'new' }; // 响应式
state.value.nested.value = 456;  // 非响应式11.  shallowReactive
与 shallowRef 类似,但用于创建浅响应式对象。
import { shallowReactive } from 'vue';const state = shallowReactive({nested: {value: 123}
});state.nested.value = 456; // 非响应式

12. readonly

创建一个只读的响应式对象,防止其被修改。

import { reactive, readonly } from 'vue';const state = reactive({count: 0
});const readonlyState = readonly(state);readonlyState.count = 1; // 无效操作,readonlyState 是只读的

Composition API 的优势

1. 代码可重用性

Composition API 允许我们将逻辑提取到独立的函数中,这些函数可以在不同的组件中复用。这种方式大大提高了代码的可重用性和可维护性。

// hooks/useCounter.js
import { ref } from 'vue';export function useCounter() {const count = ref(0);const increment = () => {count.value++;};return { count, increment };
}// 组件中使用
import { useCounter } from './hooks/useCounter';export default {setup() {const { count, increment } = useCounter();return { count, increment };},
};

2. 更好的逻辑组织

通过 Composition API,我们可以将相关的逻辑聚合在一起,而不是分散在组件的生命周期钩子和选项中。这使得代码更具组织性和可读性。

3. 更容易的类型推断

由于 Composition API 主要使用函数和标准的 JavaScript 语法,TypeScript 可以更好地推断出类型,提高了类型安全性和代码的可靠性。

4. 支持更强的逻辑组合

在开发复杂应用时,我们通常会有一些跨组件的逻辑,而 Composition API 允许我们更方便地组合这些逻辑,使得开发复杂的功能变得更加简单和直观。

实际应用场景

1. 表单处理

在表单处理方面,Composition API 可以让我们更清晰地组织表单的验证逻辑和数据管理。

import { ref } from 'vue';export default {setup() {const username = ref('');const password = ref('');const login = () => {if (!username.value || !password.value) {alert('Please enter username and password');return;}// 处理登录逻辑};return { username, password, login };},
};

2. 使用自定义 Hook

自定义 Hook 可以帮助我们将逻辑抽象出来,变得更可重用。

// hooks/useFetch.js
import { ref, onMounted } from 'vue';export function useFetch(url) {const data = ref(null);const error = ref(null);const fetchData = async () => {try {const response = await fetch(url);data.value = await response.json();} catch (err) {error.value = err;}};onMounted(fetchData);return { data, error, fetchData };
}// 组件中使用
import { useFetch } from './hooks/useFetch';export default {setup() {const { data, error, fetchData } = useFetch('https://api.example.com/data');return { data, error, fetchData };},
};

3. 动态主题切换

我们可以利用 reactive 和 watch 实现动态主题切换。

import { reactive, watch } from 'vue';export default {setup() {const theme = reactive({color: 'light'});watch(() => theme.color,(newColor) => {document.body.className = newColor;});const toggleTheme = () => {theme.color = theme.color === 'light' ? 'dark' : 'light';};return { theme, toggleTheme };},
};

总结

Vue Composition API 为我们提供了一种更灵活和模块化的方式来编写 Vue 组件。它不仅增强了代码的可重用性和可维护性,还使得复杂逻辑的组织变得更加清晰。通过了解和掌握 Composition API,我们可以更高效地开发和维护 Vue 应用。

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

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

相关文章

Java中String的length与Oracle数据库中VARCHAR2实际存储长度不一致的问题

目录 一、根本原因 二、解决方案 一、根本原因 Oracle数据库新增数据的时候报如下错误&#xff1a; 先给大家看个小案例&#xff0c;这样更好去理解&#xff0c;下面是一段测试代码&#xff1a; 这里面我分别列举了三种字符串&#xff0c;中文&#xff0c;英文和数字以及两种…

shodan6-7---清风

shodan6-7 1.shodan网页版 以cve-2019-0708漏洞指纹特征为例 "\x03\x00\x00\x0b\x06\xd0\x00\x00\x124\x00"在这里插入图片描述 搜索命令参考 https://www.shodan.io/search/filters这个网页中有搜索关键词 对指定网址进行监控&#xff0c;这里可以对ip进行扫描&…

Spring5学习记录(四)声明式事务管理

Spring5学习记录&#xff08;四&#xff09;声明式事务管理 一、事务管理1、事务四个特性ACID2、事务的两种方式 二、基于注解实现声明式事务管理1、配置xml文件2、添加事务注解 Transactional 三、声明式事务管理的参数配置1、propagation&#xff1a;事务传播行为2、isolat…

Linux上python离线安装教程

一. 安装Python 1. 下载python离线包 安装包下载地址&#xff1a;https://www.python.org/downloads/source/ 我下载的是Python 3.10.14 下面是linux服务器上的部署过程 2. 系统更新 sudo yum update -y 3. 安装必要的依赖项 sudo yum groupinstall “Development Tools” -y…

快速入门CSS

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗 如有错误&#xff0c;欢迎指出~ 目录 CSS css的三种引入方式 css书写规范 选择器分类 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 color颜色设置 border边框设置 width/heigth 内/外边距 C…

ssm基于vue搭建的新闻网站+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…

MATLAB计算朗格朗日函数

1. 朗格朗日函数介绍 朗格朗日函数&#xff08;Lagrange function&#xff09;通常用于优化问题&#xff0c;尤其是带有约束的优化问题。其一般形式为&#xff1a; 其中&#xff1a; f(x) 是目标函数。 是约束条件。 是拉格朗日乘子。 为了编写一个MATLAB代码来计算和绘制…

商场应急响应:SpringBoot技术优化

3系统分析 3.1可行性分析 通过对本大型商场应急预案管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大型商场应急预案管理系统采用SSM框架&#xff0…

WebSocket的理解与应用

WebSocket的理解与应用 一、是什么二、特点1、全双工2、二进制帧3、协议名4、握手5、优点 三、应用场景 一、是什么 WebSocket&#xff0c;是一种网络传输协议&#xff0c;位于OSI模型的应用层。可在单个TCP连接上进行全双工通信&#xff0c;能更好的节省服务器资源和带宽并达…

【C++ 算法进阶】算法提升八

复杂计算 &#xff08;括号问题相关递归套路 重要&#xff09; 题目 给定一个字符串str str表示一个公式 公式里面可能有整数 - * / 符号以及左右括号 返回最终计算的结果 题目分析 本题的难点主要在于可能会有很多的括号 而我们直接模拟现实中的算法的话code会难写 要考虑…

Node学习记录-until实用工具

来源&#xff1a;Nodejs 第十八章&#xff08;util&#xff09; util 是Node.js内部提供的很多实用或者工具类型的API util.promisify 用于将遵循Node回调风格&#xff08;即最后一个参数为回调函数&#xff09;的函数转换成返回Promise的函数&#xff0c;这样可以使得异步代…

Vue生命周期

Vue生命周期&#xff1a;Vue实例从创建到销毁的过程&#xff0c;即指从创建、初始化数据、编译模板、挂载DOM到渲染、更新到渲染、销毁等一系列过程。主要分为创建前后、载入前后、更新前后、销毁前后以及一些特殊场景的生命周期。 …

注意力机制的目的:理解语义;编码器嵌入高纬空间计算;注意力得分“得到S*V”;解码器掩码和交叉注意力层用于训练;最终的编码器和输出实现大模型

目录 注意力机制的目的:理解语义中的它是小白兔 词编码器嵌入高纬空间 计算注意力得分“得到S*V” 权重QKV:连接权重 训练阶段使用解码器:翻译后的语句 解码器掩码和交叉注意力层用于训练 最终的编码器和输出实现大模型 Transformer模型中,QKV QKV的作用 举例说明…

鸿蒙5.0时代:原生鸿蒙应用市场引领开发者服务新篇章

前言 10月22日原生鸿蒙之夜发布会宣布HarmonyOS NEXT正式发布&#xff0c;首个版本号&#xff1a;鸿蒙5.0。这次“纯血鸿蒙”脱离了底层安卓架构成为纯国产的独立系统&#xff0c;仅凭这一点就有很多想象空间。 目前鸿蒙生态设备已超10亿&#xff0c;原生鸿蒙操作系统在中国市…

联动香港、成都、武汉三所高校!“2024 深圳国际金融科技大赛”校园行圆满结束

在金融科技蓬勃发展的当下&#xff0c;人才培养成为推动行业前行的关键。为推进深圳市金融科技人才高地建设&#xff0c;向高校学子提供一个展示自身知识、能力和创意的平台&#xff0c;2024 FinTechathon 深圳国际金融科技大赛——西丽湖金融科技大学生挑战赛重磅开启&#xf…

【真题笔记】16年系统架构设计师要点总结

【真题笔记】16年系统架构设计师要点总结 存储部件接口嵌入式处理器产品配置配置管理用户文档系统文档CMM&#xff08;能力成熟度模型&#xff09;螺旋模型敏捷软件开发的方法学软件工具面向对象的分析模型设计模型COP&#xff08;面向构件的编程&#xff09;构件原子构件模块S…

【力扣打卡系列】二分查找(红蓝染色法)

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为go&#xff0c;Day8 在排序数组中查找元素的第一个和最后一个位置 题目描述解题思路 二分查找 注意勿漏循环&#xff0c;条件为left < right注意比较的是nums[mid]与target的值&#xff0c;不是mid注意if s…

NGINX 交叉编译 arm32

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

openstack之guardian介绍与实例创建过程

运行特征 采集模块&#xff1a;扩展Ceilometer&#xff0c;采集存储网、业务网连通性、nova目录是否可读写&#xff1b; 收集模块&#xff1a;将采集到的数据存储到数据库中&#xff1b; 分析模块&#xff1a;根据采集的结果&#xff0c;分析各节点状态&#xff0c;并进行反向检…

操作集成、数据集成、界面集成-系统架构师(八十八)

1软件开发环境由软件工具集和环境集成机制构成&#xff0c;前者支持软件活动的过程和任务&#xff0c;后者提供统一数据模式和数据接口规范的数据集成机制&#xff0c;支持个各开发活动之间通信、切换、调度和协同的&#xff08;&#xff09;。 A 操作集成机制 B 控制集成机制…