详细介绍uni-app中Composition API和Options API的使用方法

news2025/6/9 8:46:45

uni-app 中 Composition API 和 Options API 的使用方法详解

一、Options API(Vue 2.x 传统方式)
1. 基本结构

Options API 通过配置对象的不同选项(如 datamethodscomputed 等)组织代码:

<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 生命周期集成:如 onLoadonShow
  • 组件通信:通过 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 生命周期集成:如 onLoadonShow
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. refreactive
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. watchwatchEffect
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 APIComposition API
代码组织按选项(data、methods 等)按功能逻辑
逻辑复用混入(Mixins)、高阶组件组合函数(Composable)
大型组件逻辑分散逻辑集中
TypeScript 支持一般优秀
学习曲线平缓较陡
与 Vue 2.x 兼容性100%部分特性需适配
七、推荐使用方式
  1. 新项目

    • 优先使用 Composition API + <script setup>
    • 利用组合函数提高代码复用性
  2. 现有项目

    • 逐步迁移到 Composition API
    • 复杂组件优先迁移
    • 保持两种 API 并存
  3. 注意事项

    • 熟悉 Vue 3.0 的响应式系统(ref、reactive)
    • 正确处理 uni-app 生命周期
    • 注意 ref 值的访问(需通过 .value

总结

Composition API 是 Vue 3.0 的核心特性,在 uni-app 中使用可以提高代码的可维护性和复用性。对于大型项目或需要复杂逻辑复用的场景,推荐使用 Composition API;对于小型项目或初学者,可以继续使用 Options API。两种 API 可以在同一个项目中并存,开发者可以根据具体需求选择合适的方式。

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

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

相关文章

Linux 系统中的算法技巧与性能优化

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

【C++系列】模板类型特例化

1. C模板类型特例化介绍 ​​定义​​&#xff1a;模板类型特例化&#xff08;Template Specialization&#xff09;是C中为模板的特定类型提供定制实现的机制&#xff0c;允许开发者对通用模板无法处理的特殊类型进行优化或特殊处理。 ​​产生标准​​&#xff1a; C98/03…

K8S认证|CKS题库+答案| 7. Dockerfile 检测

目录 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、修改 Dockerfile 3&#xff09;、 修改 deployment.yaml 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 您必须在以…

基于Scala实现Flink的三种基本时间窗口操作

目录 代码结构 代码解析 (1) 主程序入口 (2) 窗口联结&#xff08;Window Join&#xff09; (3) 间隔联结&#xff08;Interval Join&#xff09; (4) 窗口同组联结&#xff08;CoGroup&#xff09; (5) 执行任务 代码优化 (1) 时间戳分配 (2) 窗口大小 (3) 输出格式…

c++对halcon的动态链接库dll封装及调用(细细讲)

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

【优选算法】分治

一&#xff1a;颜色分类 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…

【图片识别改名】如何批量将图片按图片上文字重命名?自动批量识别图片文字并命名,基于图片文字内容改名,WPF和京东ocr识别的解决方案

应用场景 在日常工作和生活中&#xff0c;我们经常会遇到需要对大量图片进行重命名的情况。例如&#xff0c;设计师可能需要根据图片内容为设计素材命名&#xff0c;文档管理人员可能需要根据扫描文档中的文字对图片进行分类命名。传统的手动重命名方式效率低下且容易出错&…

RabbitMQ 的高可用性

RabbitMQ 是比较有代表性的&#xff0c;因为是基于主从&#xff08;非分布式&#xff09;做高可用的RabbitMQ 有三种模式&#xff1a;单机模式、普通集群模式、镜像集群模式。 单机模式 单机模式,生产几乎不用。 普通集群模式&#xff08;无高可用性&#xff09; 普通集群模…

AI架构师修炼之道

1 AI时代的架构革命 与传统软件开发和软件架构师相比&#xff0c;AI架构师面临着三重范式转换&#xff1a; 1.1 技术维度&#xff0c;需处理异构算力调度与模型生命周期管理的复杂性&#xff1b; 1.2 系统维度&#xff0c;需平衡实时性与资源约束的矛盾&#xff1b; 1.3 价…

iview组件库:当后台返回到的数据与使用官网组件指定的字段不匹配时,进行修改某个属性名再将response数据渲染到页面上的处理

1、需求导入 当存在前端需要的数据的字段渲染到表格或者是一些公共的表格组件展示数据时的某个字段名与后台返回的字段不一致时&#xff0c;那么需要前端进行稍加处理&#xff0c;而不能直接this.list res.data;这样数据是渲染不出来的。 2、后台返回的数据类型 Datalist(pn) …

服务器 | Centos 9 系统中,如何部署SpringBoot后端项目?

系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 虚拟机 | Ubuntu图形化系统&#xff1a; open-vm-tools安装失败以及实现文件拖放 虚拟机 | Ubuntu操作系统&#xff1a;su和sudo理解及如何处理忘记root密码 文章目录 系列文章目录前言一、环境介绍二、 使用syst…

(2025)Windows修改JupyterNotebook的字体,使用JetBrains Mono

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

小番茄C盘清理:专业高效的电脑磁盘清理工具

在使用电脑的过程中&#xff0c;我们常常会遇到系统盘空间不足、磁盘碎片过多、垃圾文件堆积等问题&#xff0c;这些问题不仅会导致电脑运行缓慢&#xff0c;还可能引发系统崩溃。为了解决这些问题&#xff0c;小番茄C盘清理应运而生。它是一款专业的C盘清理软件&#xff0c;能…

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值,而是如下图的格式 查询可知这里传递的数据定义的是…

基于51单片机的红外防盗及万年历仿真

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能&#xff1a; &#xff08;1&#xff09;实时显示年、月、日、时、分、秒、星期信息&#xff1b; &#xff08;2&#xff09;红外传感器&#xff08;仿真中用按键模拟&#xff09;检测是否有…

【飞腾AI加固服务器】全国产化飞腾+昇腾310+PCIe Switch的AI大模型服务器解决方案

以下是全国产化飞腾AI加固服务器采用飞腾昇腾PCIe Switch解决方案&#xff1a; &#x1f5a5;️ 一、硬件架构亮点 ‌国产算力双擎‌ ‌飞腾处理器‌&#xff1a;搭载飞腾FT2000/64核服务器级CPU&#xff08;主频1.8-2.2GHz&#xff09;&#xff0c;支持高并发任务与复杂计算&a…

应用层协议:HTTPS

目录 HTTPS&#xff1a;超文本传输安全协议 1、概念 2、通信过程及关键技术 2.1 通信过程 1> TLS握手协商&#xff08;建立安全通道&#xff09; 2> 加密数据传输 2.2 关键技术 1> 对称加密算法 2> 非对称加密 3> 对称加密和非对称加密组合 4> 数…

【ArcGIS技巧】—村庄规划规划用地规划状态字段生成工具

"国土空间规划后续也是走向数据治理&#xff0c;数据建库已经是涉及到城市规划、建筑、市政、农业、地理信息、测绘等等方方面面。不得不说以后数据库建设跟维护&#xff0c;是很多专业的必修课。小编就湖南省的村庄规划建库过程中规划用地用海中规划状态字段写了个小工具…