一、UniApp 核心优势
-
跨平台能力
-
一套代码可编译到 iOS、Android、H5、小程序等多个平台,大幅减少重复开发。
-
通过条件编译处理平台差异:
javascript
复制
下载
// #ifdef H5 console.log("仅在H5平台生效"); // #endif
-
-
基于 Vue.js 生态
-
熟悉 Vue 语法即可快速上手,支持 Vuex 状态管理。
-
注意差异点:如没有 DOM 操作,需改用
uni
API。
-
-
丰富的组件和插件市场
-
内置
scroll-view
、swiper
等高性能组件。 -
插件市场(如 uViewUI)可快速集成常用功能。
-
二、关键学习心得
1. 项目结构与配置
-
目录规范:
复制
下载
/components // 公用组件 /pages // 页面文件(需在pages.json注册) /static // 静态资源 /store // Vuex 状态管理
-
重要配置文件:
-
manifest.json
:应用名称、图标等原生配置。 -
pages.json
:路由、导航栏样式、页面配置。
-
2. 开发调试技巧
-
多端调试:
-
H5:直接浏览器调试。
-
小程序:需下载开发者工具,注意微信的域名白名单限制。
-
App:真机调试必备,使用
uni-app
官方调试基座。
-
-
性能优化:
javascript
复制
下载
// 图片懒加载 <image lazy-load mode="widthFix" src="..."></image> // 避免过度使用响应式数据 export default { data() { return { staticData: {}, // 非必要不响应式的数据 __rawData: null // 使用__前缀标记非响应数据 } } }
3. 常见坑与解决方案
-
样式兼容性问题:
-
使用
rpx
替代px
实现自适应布局。 -
部分 CSS 属性需加前缀(如
-webkit-box-orient
)。
-
-
原生功能调用:
javascript
复制
下载
// 调用摄像头 uni.chooseImage({ count: 1, success: (res) => { this.avatar = res.tempFilePaths[0]; } });
-
生命周期注意:
-
App 专有生命周期
onLaunch
、onShow
。 -
页面返回需用
uni.navigateBack()
而非浏览器历史。
-
三、实战经验
1. 多端适配策略
-
API 兼容:
javascript
复制
下载
function getSystemInfo() { return new Promise((resolve) => { // #ifdef APP-PLUS plus.device.getInfo(resolve); // #endif // #ifdef MP-WEIXIN wx.getSystemInfo({ success: resolve }); // #endif }); }
-
UI 适配方案:
-
使用 Flex 布局 +
rpx
单位。 -
复杂场景通过
uni.getSystemInfoSync()
动态计算布局。
-
2. 状态管理优化
-
Vuex 模块化:
javascript
复制
下载
// store/modules/user.js export default { state: { token: '' }, mutations: { SET_TOKEN(state, token) { state.token = token; } } }
-
持久化存储:
javascript
复制
下载
uni.setStorageSync('token', res.token); // 同步存储
3. 打包发布要点
-
App 打包:
-
使用 HBuilderX 云打包或本地打包。
-
注意证书配置(Android 用 keystore,iOS 需开发者账号)。
-
-
小程序提审:
-
压缩图片资源,主包不超过 2MB。
-
提前配置合法域名。
-
四、学习资源推荐
-
官方文档:uniapp.dcloud.io(必读)
-
实战课程:
-
B站《UniApp 跨平台开发实战》
-
慕课网《UniApp 商业级应用开发》
-
-
社区:
-
DCloud 论坛
-
GitHub 开源项目(如 uni-starter 模板)
-
五、关键知识点
1. 条件编译
不同平台的代码差异化处理:
javascript
复制
下载
// #ifdef H5 console.log("仅H5平台生效"); // #endif // #ifdef MP-WEIXIN wx.login(); // 仅微信小程序执行 // #endif
2. 自适应单位 rpx
自动根据屏幕宽度缩放(750rpx = 100%屏幕宽度):
css
复制
下载
.container { width: 750rpx; /* 满屏宽度 */ font-size: 32rpx; /* 约等于16px */ }
3. 基础组件
-
视图容器:
html
复制
下载
运行
<scroll-view scroll-y @scrolltolower="loadMore"> <view v-for="item in list">{{item}}</view> </scroll-view>
-
表单组件:
html
复制
下载
运行
<input v-model="text" @confirm="submit" /> <button @click="scanQRCode">扫码</button>
4. 路由导航
javascript
复制
下载
// 跳转页面(类似vue-router) uni.navigateTo({ url: '/pages/detail?id=1' }); // 接收参数 onLoad(options) { console.log(options.id); // 输出1 }
5. 平台专有API调用
javascript
复制
下载
// 调用摄像头 uni.chooseImage({ count: 1, success: (res) => { this.avatar = res.tempFilePaths[0]; } });
6. 样式兼容方案
css
复制
下载
/* 解决iOS滚动卡顿 */ scroll-view { -webkit-overflow-scrolling: touch; } /* 安卓按钮点击高亮 */ button { -webkit-tap-highlight-color: transparent; }
7. Vuex 模块化
javascript
复制
下载
// store/modules/user.js export default { state: { token: '' }, mutations: { SET_TOKEN(state, token) { state.token = token; } } }
8. 持久化存储
javascript
复制
下载
// 存数据 uni.setStorageSync('token', 'abc123'); // 取数据 const token = uni.getStorageSync('token');
9. 图片懒加载
html
复制
下载
运行
<image lazy-load mode="widthFix" src="..."></image>
10. 减少响应式数据
javascript
复制
下载
export default { data() { return { __staticList: [], // 非响应式数据(加__前缀约定) reactiveData: {} // 需要响应式的数据 } } }
11. 多平台配置
manifest.json
中配置各平台参数:
json
复制
下载
"mp-weixin": { "appid": "wx123456", "requiredBackgroundModes": ["audio"] }
12. 分包加载
pages.json
中配置分包:
json
复制
下载
"subPackages": [{ "root": "subpackage", "pages": [{ "path": "pageA", "style": { ... } }] }]
13. 微信小程序白名单
需在 manifest.json
配置域名:
json
复制
下载
"mp-weixin": { "networkTimeout": { "request": 10000 }, "permission": { "scope.userLocation": { "desc": "需要获取您的地理位置" } } }
14. App端权限处理
Android需在 manifest.json
声明:
json
复制
下载
"android": { "permissions": [ "<uses-permission android:name=\"android.permission.CAMERA\"/>" ] }
一、平台差异与兼容性
1. 条件编译是核心技能
-
问题:不同平台(H5/小程序/App)的API和组件表现不一致
-
解决:
javascript
复制
下载
// #ifdef H5 alert('H5弹窗'); // #endif // #ifdef MP-WEIXIN wx.showToast({ title: '微信Toast' }); // #endif
2. CSS 兼容性坑
-
典型问题:
-
iOS 滚动卡顿
-
Android 按钮点击高亮
-
-
解决方案:
css
复制
下载
/* 修复iOS滚动 */ .scroll-view { -webkit-overflow-scrolling: touch; } /* 去除Android高亮 */ button { -webkit-tap-highlight-color: transparent; }
二、性能优化要点
1. 图片处理
-
错误示范:直接使用大图无优化
-
正确做法:
html
复制
下载
运行
<image lazy-load webp="true" :src="imgUrl" mode="widthFix" ></image>
2. 数据渲染优化
-
长列表必用:
<scroll-view>
+ 分页加载javascript
复制
下载
loadData() { if(this.loading) return; this.loading = true; api.getList().then(res => { this.list = [...this.list, ...res.data]; this.loading = false; }) }
三、路由与导航陷阱
1. 页面栈限制
-
小程序限制:最多10层页面栈
-
解决方案:
javascript
复制
下载
// 超过5层时用redirectTo if(getCurrentPages().length >= 5) { uni.redirectTo({ url: '/pages/new' }); } else { uni.navigateTo({ url: '/pages/new' }); }
2. 传参安全
-
危险做法:
javascript
复制
下载
uni.navigateTo({ url: `/detail?id=${敏感数据}` });
-
推荐方案:
javascript
复制
下载
uni.setStorageSync('temp_data', {id: 123}); uni.navigateTo({ url: '/pages/detail' });
四、原生功能开发
1. App端权限处理
-
必须配置:
json
复制
下载
// manifest.json "android": { "permissions": [ "<uses-permission android:name=\"android.permission.CAMERA\"/>" ] }
-
动态申请:
javascript
复制
下载
uni.authorize({ scope: 'scope.camera', success: () => { uni.chooseImage() } })
2. 插件使用原则
-
选择标准:
-
查看插件最近更新时间(半年内最佳)
-
优先选DCloud官方认证插件
-
测试Demo再集成
-
五、调试技巧
1. 多端同步调试
bash
复制
下载
# H5 npm run dev:h5 # 微信小程序 npm run dev:mp-weixin
2. 真机调试必备
-
Android:开启USB调试 + HBuilderX真机运行
-
iOS:需苹果开发者账号 + TestFlight
六、学习过程中需要注意的问题
学习 UniApp 时需要注意以下关键点,结合具体场景和解决方案,帮助你高效避坑:
1.1平台差异与兼容性
1. 条件编译是核心技能
-
问题:不同平台(H5/小程序/App)的API和组件表现不一致
-
解决:
javascript
复制
下载
// #ifdef H5 alert('H5弹窗'); // #endif // #ifdef MP-WEIXIN wx.showToast({ title: '微信Toast' }); // #endif
2. CSS 兼容性坑
-
典型问题:
-
iOS 滚动卡顿
-
Android 按钮点击高亮
-
-
解决方案:
css
复制
下载
/* 修复iOS滚动 */ .scroll-view { -webkit-overflow-scrolling: touch; } /* 去除Android高亮 */ button { -webkit-tap-highlight-color: transparent; }
2.1.性能优化要点
1. 图片处理
-
错误示范:直接使用大图无优化
-
正确做法:
html
复制
下载
运行
<image lazy-load webp="true" :src="imgUrl" mode="widthFix" ></image>
2. 数据渲染优化
-
长列表必用:
<scroll-view>
+ 分页加载javascript
复制
下载
loadData() { if(this.loading) return; this.loading = true; api.getList().then(res => { this.list = [...this.list, ...res.data]; this.loading = false; }) }
3.1路由与导航陷阱
1. 页面栈限制
-
小程序限制:最多10层页面栈
-
解决方案:
javascript
复制
下载
// 超过5层时用redirectTo if(getCurrentPages().length >= 5) { uni.redirectTo({ url: '/pages/new' }); } else { uni.navigateTo({ url: '/pages/new' }); }
2. 传参安全
-
危险做法:
javascript
复制
下载
uni.navigateTo({ url: `/detail?id=${敏感数据}` });
-
推荐方案:
javascript
复制
下载
uni.setStorageSync('temp_data', {id: 123}); uni.navigateTo({ url: '/pages/detail' });
4.1原生功能开发
1. App端权限处理
-
必须配置:
json
复制
下载
// manifest.json "android": { "permissions": [ "<uses-permission android:name=\"android.permission.CAMERA\"/>" ] }
-
动态申请:
javascript
复制
下载
uni.authorize({ scope: 'scope.camera', success: () => { uni.chooseImage() } })
2. 插件使用原则
-
选择标准:
-
查看插件最近更新时间(半年内最佳)
-
优先选DCloud官方认证插件
-
测试Demo再集成
-