UniApp 与微信小程序详细对比
UniApp 与微信小程序详细对比
1. 开发环境
- 微信小程序:
- 主要使用微信开发者工具
- 提供模拟器、调试工具和性能监控
- 只能开发微信小程序
- UniApp:
- 主要使用 HBuilderX,但也支持 VS Code 等其他编辑器
- HBuilderX 提供可视化界面、代码提示、调试工具等
- 可以开发多平台应用,包括小程序、H5、App 等
2. 项目结构
- 微信小程序:
├── pages/ # 页面文件夹 ├── components/ # 自定义组件文件夹 ├── utils/ # 工具函数文件夹 ├── app.js # 全局 JS ├── app.json # 全局配置 ├── app.wxss # 全局样式 └── project.config.json # 项目配置文件 - UniApp:
├── pages/ # 页面文件夹 ├── components/ # 自定义组件文件夹 ├── static/ # 静态资源文件夹 ├── store/ # Vuex 状态管理(可选) ├── App.vue # 应用配置,用来配置App全局样式以及监听应用生命周期 ├── main.js # Vue 初始化入口文件 ├── manifest.json # 配置应用名称、图标、权限等打包信息 └── pages.json # 配置页面路由、导航条、选项卡等页面类信息
3. 页面文件
- 微信小程序:
- .wxml:页面结构(类似 HTML)
- .wxss:页面样式(类似 CSS)
- .js:页面逻辑
- .json:页面配置
- UniApp:
- .vue 文件,包含三个部分:
<template>:页面结构(支持小程序组件和 HTML 标签)<script>:页面逻辑<style>:页面样式(支持 CSS 预处理器,如 SCSS、Less)
- .vue 文件,包含三个部分:
4. 基础组件
| 微信小程序 | UniApp | 说明 |
|---|---|---|
| view | view | 视图容器,类似于 div |
| text | text | 文本组件 |
| image | image | 图片组件 |
| button | button | 按钮组件 |
| input | input | 输入框组件 |
| textarea | textarea | 多行输入框组件 |
| scroll-view | scroll-view | 可滚动视图区域 |
| swiper | swiper | 滑块视图容器 |
| navigator | navigator | 页面链接组件 |
| progress | progress | 进度条组件 |
| checkbox | checkbox | 多选框组件 |
| radio | radio | 单选框组件 |
| picker | picker | 底部弹起的滚动选择器 |
| slider | slider | 滑动选择器 |
| switch | switch | 开关选择器 |
| form | form | 表单组件 |
注:UniApp 支持更多 HTML5 标准组件,在 App 端和 H5 端表现更接近标准 HTML。
5. 生命周期
| 微信小程序 | UniApp (Vue3 组合式 API) | 说明 |
|---|---|---|
| onLoad | onLoad | 页面加载时触发 |
| onShow | onShow | 页面显示时触发 |
| onReady | onReady | 页面初次渲染完成时触发 |
| onHide | onHide | 页面隐藏时触发 |
| onUnload | onUnload | 页面卸载时触发 |
| onPullDownRefresh | onPullDownRefresh | 用户下拉刷新时触发 |
| onReachBottom | onReachBottom | 页面上拉触底时触发 |
| onShareAppMessage | onShareAppMessage | 用户点击右上角分享时触发 |
| onPageScroll | onPageScroll | 页面滚动时触发 |
| onTabItemTap | onTabItemTap | 点击 tab 时触发 |
| onResize | onResize | 页面尺寸变化时触发 |
注:
- UniApp 在 Vue3 组合式 API 中,这些钩子需要单独引入使用。
- UniApp 还提供了额外的应用生命周期,如 onLaunch、onShow、onHide 等。
6. 数据绑定与更新
-
微信小程序:
Page({data: {message: 'Hello',list: [1, 2, 3]},changeMessage() {this.setData({ message: 'Hi','list[0]': 4 // 修改数组元素})} })<view>{{message}}</view> <view wx:for="{{list}}" wx:key="*this">{{item}}</view> -
UniApp (Vue3 组合式 API):
import { ref, reactive } from 'vue'export default {setup() {const message = ref('Hello')const list = reactive([1, 2, 3])function changeMessage() {message.value = 'Hi'list[0] = 4 // 直接修改响应式数组}return {message,list,changeMessage}} }<view>{{message}}</view> <view v-for="item in list" :key="item">{{item}}</view>
7. 条件渲染
- 微信小程序:
<view wx:if="{{condition}}">True</view> <view wx:elif="{{condition2}}">Condition2</view> <view wx:else>False</view> - UniApp:
<view v-if="condition">True</view> <view v-else-if="condition2">Condition2</view> <view v-else>False</view>
8. 列表渲染
- 微信小程序:
<view wx:for="{{items}}" wx:key="id">{{index}}: {{item.name}} </view> - UniApp:
<view v-for="(item, index) in items" :key="item.id">{{index}}: {{item.name}} </view>
9. 事件处理
- 微信小程序:
<button bindtap="handleClick" data-id="{{item.id}}">点击</button>Page({handleClick(event) {const id = event.currentTarget.dataset.idconsole.log('Clicked item:', id)} }) - UniApp:
<button @click="handleClick(item.id)">点击</button>export default {methods: {handleClick(id) {console.log('Clicked item:', id)}} }
10. 路由导航
- 微信小程序:
// 页面跳转 wx.navigateTo({ url: '/pages/about/about?id=1' })// 页面重定向 wx.redirectTo({ url: '/pages/login/login' })// 页面返回 wx.navigateBack({ delta: 1 })// Tab 切换 wx.switchTab({ url: '/pages/home/home' }) - UniApp:
// 页面跳转 uni.navigateTo({ url: '/pages/about/about?id=1' })// 页面重定向 uni.redirectTo({ url: '/pages/login/login' })// 页面返回 uni.navigateBack({ delta: 1 })// Tab 切换 uni.switchTab({ url: '/pages/home/home' })
11. 网络请求
- 微信小程序:
wx.request({url: 'https://api.example.com/data',method: 'GET',data: { id: 1 },header: {'content-type': 'application/json'},success(res) {console.log(res.data)},fail(err) {console.error(err)} }) - UniApp:
注:UniApp 还支持使用uni.request({url: 'https://api.example.com/data',method: 'GET',data: { id: 1 },header: {'content-type': 'application/json'},success(res) {console.log(res.data)},fail(err) {console.error(err)} })async/await语法:try {const res = await uni.request({url: 'https://api.example.com/data',method: 'GET',data: { id: 1 }})console.log(res.data) } catch (err) {console.error(err) }
12. 存储
- 微信小程序:
// 设置存储 wx.setStorageSync('key', 'value')// 获取存储 const value = wx.getStorageSync('key')// 移除存储 wx.removeStorageSync('key')// 清除所有存储 wx.clearStorageSync() - UniApp:
// 设置存储 uni.setStorageSync('key', 'value')// 获取存储 const value = uni.getStorageSync('key')// 移除存储 uni.removeStorageSync('key')// 清除所有存储 uni.clearStorageSync()
13. 组件创建和使用
-
微信小程序:
创建组件(my-component.js):Component({properties: {myProperty: {type: String,value: ''}},data: {innerValue: ''},methods: {myMethod() {// 方法实现}} })使用组件(在页面的 json 文件中):
{"usingComponents": {"my-component": "/components/my-component/my-component"} }在 wxml 中:
<my-component my-property="value"></my-component> -
UniApp:
创建组件(MyComponent.vue):<template><view>{{myProperty}}</view> </template><script> export default {name: 'MyComponent',props: {myProperty: {type: String,default: ''}},data() {return {innerValue: ''}},methods: {myMethod() {// 方法实现}} } </script>使用组件(在父组件中):
<template><my-component :my-property="value"></my-component> </template><script> import MyComponent from '@/components/MyComponent.vue'export default {components: {MyComponent} } </script>
14. 全局配置
- 微信小程序(app.json):
{"pages": ["pages/index/index","pages/logs/logs"],"window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#fff","navigationBarTitleText": "WeChat","navigationBarTextStyle": "black"},"tabBar": {"list": [{"pagePath": "pages/index/index","text": "首页"},{"pagePath": "pages/logs/logs","text": "日志"}]} } - UniApp:
pages.json:{"pages": [{"path": "pages/index/index","style": {"navigationBarTitleText": "首页"}},{"path": "pages/logs/logs","style": {"navigationBarTitleText": "日志"}}],"globalStyle": {"navigationBarTextStyle": "black","navigationBarTitleText": "UniApp","navigationBarBackgroundColor": "#F8F8F8","backgroundColor": "#F8F8F8"},"tabBar": {"color": "#7A7E83","selectedColor": "#3cc51f","borderStyle": "black","backgroundColor": "#
相关文章:
UniApp 与微信小程序详细对比
UniApp 与微信小程序详细对比 1. 开发环境 微信小程序: 主要使用微信开发者工具提供模拟器、调试工具和性能监控只能开发微信小程序 UniApp: 主要使用 HBuilderX,但也支持 VS Code 等其他编辑器HBuilderX 提供可视化界面、代码提示、调试工…...
【用大模型提示工程处理NLP任务】
Batch API Prompt 工程 任务一:文本分类 任务二:情感分析 任务三:文档处理 任务四:信息抽取 任务五:机器翻译 任务六:生成任务 任务七:文本纠错 Batch API Prompt 工程 Batch API 适用于…...
适配器模式、代理模式(C++)
适配器模式: 定义:适配器模式是一种结构型设计模式,它允许接口不兼容的类一起工作。它通过将一个类的接口转换成客户端期望的另一个接口,使原本由于接口不兼容而不能一起工作的那些类可以一起工作。 代理模式: 定义&a…...
unity 2d 近战攻击判定的三种方式以及精确获取碰撞点
精确获取碰撞点 核心是获取武器碰撞盒最顶点,然后获取敌人碰撞盒距离该点最近的点 /// <summary>/// 获取获取武器前端位置 碰撞盒最左或最右顶点/// </summary>/// <param name"collider"></param>/// <param name"…...
矩形函数的傅里叶变换——从一维到二维,从连续到离散
一维连续矩形函数的傅里叶变换 二维连续矩形函数的傅里叶变换 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P109 2D DFT 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系…...
潜水打捞系统助力,破解汽车打捞难题
随着人类活动的不断扩展,汽车落水事故频发,成为救援工作中的一大难题。汽车因其重量和结构特性,一旦沉入水体,打捞工作将面临巨大挑战。传统的打捞方法往往效率低下,且在操作过程中可能会对汽车造成进一步的损害&#…...
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5
【深度学习】经典的深度学习模型-01 开山之作:CNN卷积神经网络LeNet-5 Note: 草稿状态,持续更新中,如果有感兴趣,欢迎关注。。。 0. 论文信息 article{lecun1998gradient, title{Gradient-based learning applied to document r…...
LeetCode 每日一题 2024/10/7-2024/10/13
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/7 871. 最低加油次数10/8 1436. 旅行终点站10/9 3171. 找到按位或最接近 K 的子数组10/10 3162. 优质数对的总数 I10/11 3164. 优质数对的总数 II10/12 3158. 求出出现两…...
ZYNQ使用XGPIO驱动外设模块(前半部分)
目录 目录 一、新建BD文档,添加ZYNQ处理器 1.BD文档: 2.在Vivado中,BD文件的生成过程通常包括以下步骤: 1)什么是Tcl Console: 3.PL部分是FPGA可编程逻辑部分,它提供了丰富的IO资源,可以用于实现各种硬件接口和功…...
【FastAdmin】全栈视角下的页面跳转实现:从原生html、javascrpt、php技术到jQuery、FastAdmin框架
全栈视角下的页面跳转实现:从原生html、javascrpt、php技术到jQuery、FastAdmin框架 1 引言 页面跳转是Web开发中的基本操作,不同的技术栈提供了不同的实现方法。本文将详细介绍在原生JavaScript、原生HTML、原生PHP、jQuery以及FastAdmin框架中实现页…...
从零开始搭建一个node.js后端服务项目
目录 一、下载node.js及配置环境 二、搭建node.js项目及安装express框架 三、集成nodemon,实现代码热部署 四、Express 应用程序生成器 一、下载node.js及配置环境 网上很多安装教程,此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0…...
自定义注解和组件扫描在Spring Boot中动态注册Bean(一)
博客主页: 南来_北往 系列专栏:Spring Boot实战 在Spring Boot中,自定义注解和组件扫描是两种强大的机制,它们允许开发者以声明性的方式动态注册Bean。这种方式不仅提高了代码的可读性和可维护性,还使得Spring Boot应用的…...
如何在 IDEA 中导入 Java 项目的 Git 仓库并启动
目录 前言1. 从 Git 仓库导入 Java 项目2. 配置 Maven2.1 配置 Maven 仓库和设置文件2.2 加载依赖 3. 配置 Tomcat 并运行项目3.1 配置 Tomcat3.2 配置 Server URL3.3 启动项目 4. 常见问题与解决方法4.1 Maven 依赖无法下载4.2 Tomcat 部署失败4.3 项目启动后无法访问 结语 前…...
BIO与NIO学习
BIO:同步阻塞IO,客户端一个连接请求(socket)对应一个线程。阻塞体现在: 程序在执行I/O操作时会阻塞当前线程,直到I/O操作完成。在线程空闲的时候也无法释放用于别的服务只能等当前绑定的客户端的消息。 BIO的代码实现 …...
麒麟操作系统:解决umount命令卸载USB存储设备时报“device is busy”错误
麒麟操作系统:解决umount命令卸载USB存储设备时报“device is busy”错误 1、问题描述2、问题解决方法步骤1:尝试强制卸载步骤2:查找占用设备的进程步骤3:终止占用进程步骤4:卸载USB设备 💐The Begin&#…...
Git客户端使用之TortoiseGit和Git
git客户端有两个分别是TortoiseGit和Git Git用于命令行TortoiseGit用于图形界面。无论是Git还是TortoisGit都需要生成公/私钥与github/gitlab建立加密才能使用。 一、先介绍Git的安装与使用 1、下载与安装 安装Git-2.21.0-64-bit.exe(去官网下载最新版64位的),安…...
regionprops函数详解及应用
一、regionprops函数及应用 regionprops 函数在 MATLAB 中是一个强大的工具,用于计算和分析二值图像(或更一般地说,标注矩阵)中连通区域的属性。当处理二值图像时,连通区域通常对应于图像中的前景对象,而背…...
FPAG学习(5)-三种方法实现LED流水灯
目录 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 1.1.2仿真代码 1.1.3仿真 1.2实验结果 1.2.1总结 2.循环移位实现LED流水灯 3.38译码器实现LED流水灯 3.1原理 3.2源程序 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 利用计数器计数到…...
科迅网络阅卷系统存在存储型XSS漏洞
漏洞描述 科迅网络阅卷系统存在存储型XSS漏洞,在项目列表添加项目的地方没有过滤用户的输入 漏洞复现 FOFA "科迅网络阅卷系统" POC <script>alert(/xss/)</script> <h1>1</h1>...
【AAOS】Android Automotive 11模拟器源码下载及编译
源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-11.0.0_r48 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch car_x86_64-userdebug make -j12 运行效果 emualtor Home Map All apps Setting…...
GLM-4v-9b效果展示:直播带货截图→话术分析+转化点提炼
GLM-4v-9b效果展示:直播带货截图→话术分析转化点提炼 1. 模型能力概览 GLM-4v-9b是智谱AI在2024年开源的多模态视觉-语言模型,拥有90亿参数。这个模型最大的特点是能够同时理解图片和文字,支持中英文多轮对话,在11201120高分辨…...
OpenProject:构建高效团队协作的终极开源项目管理平台
OpenProject:构建高效团队协作的终极开源项目管理平台 【免费下载链接】openproject OpenProject is the leading open source project management software. 项目地址: https://gitcode.com/GitHub_Trending/op/openproject OpenProject 是一款领先的开源项…...
手把手教你搭建PaddleOCR开发环境:从CUDA配置到模型验证
1. 环境准备:从零搭建PaddleOCR开发环境 最近在做一个票据识别的项目,需要用到OCR技术。对比了几种开源方案后,发现PaddleOCR不仅识别准确率高,而且对中文支持特别好。但在搭建环境时踩了不少坑,特别是CUDA和cuDNN的版…...
Java外部函数接口不是“能用就行”——从内存泄漏、线程崩溃到ABI不兼容,这9类致命缺陷正在 silently 摧毁你的微服务
第一章:Java外部函数接口(JEP 454)核心原理与演进脉络Java外部函数接口(Foreign Function & Memory API,JEP 454)标志着Java平台原生互操作能力的根本性重构。它取代了长期受限且易出错的JNI࿰…...
自指宇宙学形式化验证套件 (Coq‑SRU v1.2.0)
自指宇宙学形式化验证套件 (Coq‑SRU v1.2.0)技术摘要 正式整编版 项目标识:Coq Formalization of Self‑Referential Universe (Coq‑SRU) 版本:v1.2.0(对齐《世毫九自指宇宙学》理论第三部分) 代码仓库:https://git…...
Mermaid Live Editor:重新定义图表创作的开源利器
Mermaid Live Editor:重新定义图表创作的开源利器 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-editor …...
为什么90%的词库转换都会失败?输入法词库迁移的终极解决方案:全方位指南
为什么90%的词库转换都会失败?输入法词库迁移的终极解决方案:全方位指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 在数字化时代&#x…...
OpenClaw语音控制之多麦克风阵列与声源定位技术的应用
7.1 麦克风阵列基础 7.1.1 阵列定义与原理 麦克风阵列是由多个麦克风按照特定几何结构排列组成的声学传感器系统。与单麦克风相比,阵列系统通过空间采样能够实现声场的时空联合处理,从而获得方向性选择能力。这种空间处理能力是语音交互系统在复杂声学环境中保持高性能的关…...
Flow.js源码深度解析:分块算法、上传策略与事件系统的实现原理
Flow.js源码深度解析:分块算法、上传策略与事件系统的实现原理 【免费下载链接】flow.js A JavaScript library providing multiple simultaneous, stable, fault-tolerant and resumable/restartable file uploads via the HTML5 File API. 项目地址: https://gi…...
r5:天气预测
- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/o-DaK6aQQLkJ8uE4YX1p3Q) 中的学习记录博客** - **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 文章目录 概要整体架构流程代码运行技术名词解释小…...
