详细介绍uni-app中Composition API和Options API的使用方法
uni-app 中 Composition API 和 Options API 的使用方法详解
一、Options API(Vue 2.x 传统方式)
1. 基本结构
Options API 通过配置对象的不同选项(如 data
、methods
、computed
等)组织代码:
<template><view><text>{{ count }}</text><button @click="increment">+1</button><text>{{ doubleCount }}</text></view>
</template><script>
export default {// 数据data() {return {count: 0,name: 'uni-app'};},// 计算属性computed: {doubleCount() {return this.count * 2;}},// 方法methods: {increment() {this.count++;}},// 生命周期钩子onLoad() {console.log('页面加载');},// 监听属性变化watch: {count(newVal, oldVal) {console.log('count changed:', newVal, oldVal);}}
};
</script>
2. 特点
- 代码组织清晰:通过不同选项明确区分逻辑类型
- 学习成本低:适合 Vue 新手
- 与 uni-app 生命周期集成:如
onLoad
、onShow
等 - 组件通信:通过
props
、$emit
、$parent
等方式
3. 局限性
- 大型组件逻辑分散:相关功能(如表单验证)可能分散在不同选项中
- 代码复用困难:难以提取和复用跨组件的逻辑
- TypeScript 支持有限:类型推导不够直观
二、Composition API(Vue 3.0 新特性)
1. 基本结构
Composition API 通过 setup()
函数组织代码,使用 Vue 3.0 的响应式系统:
<template><view><text>{{ count }}</text><button @click="increment">+1</button><text>{{ doubleCount }}</text></view>
</template><script>
import { ref, computed, onMounted, watch } from 'vue';export default {setup() {// 响应式数据const count = ref(0);const name = ref('uni-app');// 计算属性const doubleCount = computed(() => count.value * 2);// 方法const increment = () => {count.value++;};// 生命周期钩子onMounted(() => {console.log('页面加载');});// 监听属性变化watch(count, (newVal, oldVal) => {console.log('count changed:', newVal, oldVal);});// 返回需要在模板中使用的数据和方法return {count,name,doubleCount,increment};}
};
</script>
2. <script setup>
语法糖
更简洁的写法:
<template><view><text>{{ count }}</text><button @click="increment">+1</button><text>{{ doubleCount }}</text></view>
</template><script setup>
import { ref, computed, onMounted, watch } from 'vue';// 响应式数据
const count = ref(0);
const name = ref('uni-app');// 计算属性
const doubleCount = computed(() => count.value * 2);// 方法
const increment = () => {count.value++;
};// 生命周期钩子
onMounted(() => {console.log('页面加载');
});// 监听属性变化
watch(count, (newVal, oldVal) => {console.log('count changed:', newVal, oldVal);
});
</script>
3. 特点
- 逻辑集中:相关功能(如表单验证)可以组织在一起
- 代码复用性高:可以提取为组合函数(Composable Functions)
- 更好的 TypeScript 支持:类型推导更直观
- 与 uni-app 生命周期集成:如
onLoad
、onShow
等
4. 组合函数(Composable Functions)
提取可复用逻辑:
// useCounter.js
import { ref, computed } from 'vue';export function useCounter(initialValue = 0) {const count = ref(initialValue);const increment = () => count.value++;const decrement = () => count.value--;const doubleCount = computed(() => count.value * 2);return {count,increment,decrement,doubleCount};
}
在组件中使用:
<template><view><text>{{ count }}</text><button @click="increment">+1</button><button @click="decrement">-1</button><text>{{ doubleCount }}</text></view>
</template><script setup>
import { useCounter } from './useCounter';const { count, increment, decrement, doubleCount } = useCounter(5);
</script>
三、在 uni-app 中使用 Composition API 处理生命周期
Composition API 可以通过以下方式与 uni-app 生命周期集成:
import { onLoad, onShow, onReady, onHide, onUnload } from 'vue';export default {setup() {// 页面加载时onLoad(() => {console.log('页面加载');});// 页面显示时onShow(() => {console.log('页面显示');});// 页面初次渲染完成时onReady(() => {console.log('页面初次渲染完成');});// 页面隐藏时onHide(() => {console.log('页面隐藏');});// 页面卸载时onUnload(() => {console.log('页面卸载');});return {};}
};
四、响应式系统
1. ref
和 reactive
import { ref, reactive } from 'vue';// ref 用于基本类型
const count = ref(0);
console.log(count.value); // 访问值
count.value++; // 修改值// reactive 用于对象
const state = reactive({name: 'uni-app',age: 30
});
console.log(state.name); // 访问值
state.age++; // 修改值
2. computed
import { ref, computed } from 'vue';const count = ref(0);
const doubleCount = computed(() => count.value * 2);
const message = computed({get() {return `Count is ${count.value}`;},set(newValue) {count.value = parseInt(newValue);}
});
3. watch
和 watchEffect
import { ref, watch, watchEffect } from 'vue';const count = ref(0);// 监听单个响应式值
watch(count, (newVal, oldVal) => {console.log('count changed:', newVal, oldVal);
});// 监听多个响应式值
watch([count, name], ([newCount, newName], [oldCount, oldName]) => {console.log('values changed');
});// 自动追踪依赖
watchEffect(() => {console.log('count is:', count.value);
});
五、与 uni-app 特定 API 集成
1. 使用 uni-app API
import { ref, onLoad } from 'vue';export default {setup() {const location = ref(null);onLoad(() => {uni.getLocation({success: (res) => {location.value = res;}});});return {location};}
};
2. 自定义组合函数
// useLocation.js
import { ref, onLoad, onUnload } from 'vue';export function useLocation() {const location = ref(null);const error = ref(null);const getLocation = () => {uni.getLocation({success: (res) => {location.value = res;error.value = null;},fail: (err) => {error.value = err;}});};onLoad(() => {getLocation();});return {location,error,getLocation};
}
六、两种 API 的对比与选择
特性 | Options API | Composition API |
---|---|---|
代码组织 | 按选项(data、methods 等) | 按功能逻辑 |
逻辑复用 | 混入(Mixins)、高阶组件 | 组合函数(Composable) |
大型组件 | 逻辑分散 | 逻辑集中 |
TypeScript 支持 | 一般 | 优秀 |
学习曲线 | 平缓 | 较陡 |
与 Vue 2.x 兼容性 | 100% | 部分特性需适配 |
七、推荐使用方式
-
新项目:
- 优先使用 Composition API +
<script setup>
- 利用组合函数提高代码复用性
- 优先使用 Composition API +
-
现有项目:
- 逐步迁移到 Composition API
- 复杂组件优先迁移
- 保持两种 API 并存
-
注意事项:
- 熟悉 Vue 3.0 的响应式系统(ref、reactive)
- 正确处理 uni-app 生命周期
- 注意
ref
值的访问(需通过.value
)
总结
Composition API 是 Vue 3.0 的核心特性,在 uni-app 中使用可以提高代码的可维护性和复用性。对于大型项目或需要复杂逻辑复用的场景,推荐使用 Composition API;对于小型项目或初学者,可以继续使用 Options API。两种 API 可以在同一个项目中并存,开发者可以根据具体需求选择合适的方式。
相关文章:
详细介绍uni-app中Composition API和Options API的使用方法
uni-app 中 Composition API 和 Options API 的使用方法详解 一、Options API(Vue 2.x 传统方式) 1. 基本结构 Options API 通过配置对象的不同选项(如 data、methods、computed 等)组织代码: <template><…...
delphi7 链表 使用方法
在 Delphi 中,链表是一种常见的数据结构,用于存储一系列的元素,其中每个元素都包含一个指向列表中下一个元素的引用。在 Delphi 7 中,你可以手动实现链表,或者使用一些现有的集合类,例如 TList 或者 TLinke…...

Linux 系统中的算法技巧与性能优化
引言 Linux 系统以其开源、稳定和高度可定制的特性,在服务器端、嵌入式设备以及开发环境中得到了极为广泛的应用。对于开发者而言,不仅要掌握在 Linux 环境下实现各类算法的方法,更要知晓如何利用系统特性对算法进行优化,以提升…...

【C++系列】模板类型特例化
1. C模板类型特例化介绍 定义:模板类型特例化(Template Specialization)是C中为模板的特定类型提供定制实现的机制,允许开发者对通用模板无法处理的特殊类型进行优化或特殊处理。 产生标准: C98/03…...

K8S认证|CKS题库+答案| 7. Dockerfile 检测
目录 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、修改 Dockerfile 3)、 修改 deployment.yaml 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 您必须在以…...
JAVA 对象 详解
对象 对象结构: 对象头(元数据和指向class的指针)、实例数据、对齐填充 数组对象: 对象头(元数据和指向class的指针)、数组长度、数组数据、对齐填充 对象创建: 一、当Java虚拟机遇到一条…...
MATLAB实战:四旋翼姿态控制仿真方案
以下是一个基于MATLAB/Simulink的四旋翼姿态控制仿真方案。本方案使用简化姿态动力学模型,并设计PID控制器进行稳定控制。 1. 四旋翼姿态动力学模型 核心方程:I * ω̇ ω (I * ω) τ 其中: I diag([Ixx, Iyy, Izz]) 为转动惯量矩阵 …...

基于Scala实现Flink的三种基本时间窗口操作
目录 代码结构 代码解析 (1) 主程序入口 (2) 窗口联结(Window Join) (3) 间隔联结(Interval Join) (4) 窗口同组联结(CoGroup) (5) 执行任务 代码优化 (1) 时间戳分配 (2) 窗口大小 (3) 输出格式…...

c++对halcon的动态链接库dll封装及调用(细细讲)
七个部分(是个大工程) 一,halcon封装函数导出cpp的内容介绍 二,c++中对halcon环境的配置 三,在配置环境下验证halcon代码 四,dll项目创建+环境配置 五,编辑dll及导出 六,调用打包好的动态链接库的配置 七,进行测试 一,halcon的封装及导出cpp的介绍 1,我这里…...

【优选算法】分治
一:颜色分类 class Solution { public:void sortColors(vector<int>& nums) {// 三指针法int n nums.size();int left -1, right n, i 0;while(i < right){if(nums[i] 0) swap(nums[left], nums[i]);else if(nums[i] 2) swap(nums[--right], num…...
QGraphicsView中鼠标点击与移动事件传递给MainWindow
在Qt图形应用程序开发中,QGraphicsView和QGraphicsScene框架提供了强大的2D图形显示功能。然而,当我们需要在主窗口(MainWindow)中处理这些视图中的鼠标事件。 问题背景 在典型的Qt图形应用程序架构中: MainWindow └── QGraphicsView└── QGraphicsScene└── QGra…...

【图片识别改名】如何批量将图片按图片上文字重命名?自动批量识别图片文字并命名,基于图片文字内容改名,WPF和京东ocr识别的解决方案
应用场景 在日常工作和生活中,我们经常会遇到需要对大量图片进行重命名的情况。例如,设计师可能需要根据图片内容为设计素材命名,文档管理人员可能需要根据扫描文档中的文字对图片进行分类命名。传统的手动重命名方式效率低下且容易出错&…...

RabbitMQ 的高可用性
RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用的RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。 单机模式 单机模式,生产几乎不用。 普通集群模式(无高可用性) 普通集群模…...
DAY 48 随机函数与广播机制
知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 作…...
计算机基础知识(第五篇)
计算机基础知识(第五篇) 架构演化与维护 软件架构的演化和定义 软件架构的演化和维护就是对架构进行修改和完善的过程,目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等,是一个不断迭代的过程࿰…...
从零开始制作小程序简单概述
以下是结合案例的“从零制作小红书风格小程序”的全流程指南,采用小红书爆款笔记的结构呈现,并附CSDN参考资源👇: 一、核心开发步骤(附工具推荐) 账号与定位 ✅ 注册类型选择:个人店(…...

AI架构师修炼之道
1 AI时代的架构革命 与传统软件开发和软件架构师相比,AI架构师面临着三重范式转换: 1.1 技术维度,需处理异构算力调度与模型生命周期管理的复杂性; 1.2 系统维度,需平衡实时性与资源约束的矛盾; 1.3 价…...
三十五、面向对象底层逻辑-Spring MVC中AbstractXlsxStreamingView的设计
在Web应用开发中,大数据量的Excel导出功能是常见需求。传统Apache POI的XSSF实现方式在处理超大数据集时,会因全量加载到内存导致OOM(内存溢出)问题。Spring MVC提供的AbstractXlsxStreamingView通过流式处理机制,有效…...
Unity的日志管理类
脚本功能: 1,打印日志到控制台 2,显示日志到UI Text 3,将日志写入本地文件 这对unity开发安卓平台来说很有用 using System; using System.IO; using System.Text; using UnityEngine; using UnityEngine.UI;public class FileLo…...
【PhysUnits】17.2 配套变量结构体 Var(variable.rs)
一、源码 这段代码定义了一个泛型结构体 Var,用于封装数值类型并提供各种运算操作。 /** 变量结构体 Var* 该结构体泛型参数 T 需满足 Numeric 约束*/use core::ops::{Neg, Add, Sub, Mul, Div, AddAssign, SubAssign, MulAssign}; use crate::constant::Integer;…...

iview组件库:当后台返回到的数据与使用官网组件指定的字段不匹配时,进行修改某个属性名再将response数据渲染到页面上的处理
1、需求导入 当存在前端需要的数据的字段渲染到表格或者是一些公共的表格组件展示数据时的某个字段名与后台返回的字段不一致时,那么需要前端进行稍加处理,而不能直接this.list res.data;这样数据是渲染不出来的。 2、后台返回的数据类型 Datalist(pn) …...

服务器 | Centos 9 系统中,如何部署SpringBoot后端项目?
系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放 虚拟机 | Ubuntu操作系统:su和sudo理解及如何处理忘记root密码 文章目录 系列文章目录前言一、环境介绍二、 使用syst…...
qt network 整体框架
以下是 Qt 网络模块中 QNetworkInterface、TCP、UDP 及相关类的层次关系图及说明: 一、Qt 网络模块层次结构 ┌─────────────────────────────────────────────────────────────┐ │ QtNetwork 模…...
C++ map基础概念、map对象创建、map赋值操作、map大小操作、map数据插入、map数据删除、map数据修改、map数据统计
map的使用频率很高,仅次于vector,先了解下pair的概念: pair 概念: template<class _Ty1, class Ty2> struct pair{ _Ty1 first; // 这两个可以是任意的类型 _Ty2 second; }; eg:pair<int, int> p(13,…...

(2025)Windows修改JupyterNotebook的字体,使用JetBrains Mono
(JetBrains Mono字体未下载就配置,这种情况我不知道能不能行,没做过实验,因为我电脑已经下载了,不可能删了那么多字体做实验,我的建议是下载JetBrains Mono字体,当你使用VsCode配置里面的JetBrains字体也很有用) 首先参考该文章下载字体到电脑上 VSCode 修改字体为JetBrains …...

小番茄C盘清理:专业高效的电脑磁盘清理工具
在使用电脑的过程中,我们常常会遇到系统盘空间不足、磁盘碎片过多、垃圾文件堆积等问题,这些问题不仅会导致电脑运行缓慢,还可能引发系统崩溃。为了解决这些问题,小番茄C盘清理应运而生。它是一款专业的C盘清理软件,能…...
CSS 预处理器与工具
目录 CSS 预处理器与工具1. Less主要特性 2. Sass/SCSS主要特性 3. Tailwind CSS主要特性 4. 其他工具PostCSSCSS Modules 5. 选择建议 CSS 预处理器与工具 1. Less Less 是一个 CSS 预处理器,它扩展了 CSS 语言,添加了变量、嵌套规则、混合࿰…...

AUTOSAR实战教程--标准协议栈实现DoIP转DoCAN的方法
目录 软件架构 关键知识点 第一:PDUR的缓存作用 第二:CANTP的组包拆包功能 第三:流控帧的意义 配置过程 步骤0:ECUC模块中PDU创建 步骤1:SoAD模块维持不变 步骤2:DoIP模块为Gateway功能添加Connection 步骤3:DoIP模块为Gateway新增LA/TA/SA 步骤4:PDUR模…...

【MySQL系列】MySQL 导出表数据到文件
博客目录 一、使用 SELECT INTO OUTFILE 语句基本语法参数详解注意事项实际示例 二、使用 mysqldump 工具基本语法常用选项实际示例 三、使用 MySQL Workbench 导出导出步骤高级选项 四、其他导出方法1. 使用 mysql 命令行客户端2. 使用 LOAD DATA INFILE 的逆向操作3. 使用编程…...

vue3:十五、管理员管理-页面搭建
一、页面效果 实现管理员页面,完成管理员对应角色的中文名称显示,实现搜索栏,表格基本增删改查,分页等功能 二、修改问题 1、修改搜索框传递参数问题 (1)问题图示 如下图,之前搜索后,传递的数据不直接是一个value值,而是如下图的格式 查询可知这里传递的数据定义的是…...