uni-app 使用笔记
1.前言
也不知道是我水平菜还是文档太烂,这个框架使用的过程中踩了无数的坑,屡次想砸键盘,最后贫穷让我平复了心情。为了纪念这段操蛋的日子,我决定把这些坑都记录下来。
2.数据请求
在实际的项目中,数据请求需要配合一些UI效果,例如请求数据时展示'loading'效果,数据回来后又要取消这种'loading'效果,既然每次都要使用,干脆进行封装。
在utils目录下新建ajax.js文件,写入
export default(params)=>{
uni.showLoading({
title:"加载中",
});
return new Promise((resolve,reject)=>{
wx.request({
...params, //es6语法
success(res){
//请求成功
resolve(res.data);
},
fail(err){
//请求失败
reject(err);
},
complete(){
//请求无论成功还是失败都会执行
uni.hideLoading();
}
});
});
}
用法:
- 1.在main.js文件中,将其挂载到原型链中
//引入ajax模块
import ajax from './utils/ajax.js'
//挂载到原型链中
Vue.prototype.$ajax = ajax
- 2.在页面上配合async和await使用
async getData(){
try{
const result = await this.$ajax({
url:'/api/ensample',
})
}catch(e){
console.log(e)
}
},
3.下拉刷新
项目需求:头部区域保持固定,主体区域存放内容,下拉刷新,上拉加载。
候选实现方式:
(1)使用页面级下拉刷新
(2)使用区域滚动view-scroll组件
分析:view-scroll不合适这种分页场景,只适合一次性加载数据展示。
下面是使用页面级下拉刷新的注意事项:
- 1.要在哪个页面中使用下拉刷新,需要在page.json中进行配置 "enablePullDownRefresh" 为 true
{
"path": "pages/device-management/device-management",
"style": {
"navigationBarTitleText": "设 备 管 理",
"enablePullDownRefresh":true
}
},
- 2.配置生命周期,为下拉刷新的手势设置回调。要注意的是,除了设置回调函数请求数据,页面会有一个 "正在刷新" 的UI效果,这个效果需要在特定时机调用 uni.stopPullDownRefresh() 取消掉这个UI效果
onPullDownRefresh(){
//判断当前是否属于刷新状态,避免重复执行
if(this.is_refresh) return
//模拟发送请求
this.is_refresh = true
console.log('发送请求')
setTimeout(()=>{
//数据回来后取消刷新的UI效果
uni.stopPullDownRefresh()
//更新刷新状态
this.is_refresh = false
},1000)
},
4.上拉加载更多
项目需求:头部区域保持固定,主体区域存放内容,下拉刷新,上拉加载。
下面是使用页面级上拉加载的注意事项:
- 1.页面上拉到底是有一个临界值的,默认情况下这个值是50px,一旦滚动条与页面底部的距离超过这个值,就触发生命周期,这个值在page.json中进行配置
{
"path": "pages/device-management/device-management",
"style": {
"navigationBarTitleText": "设 备 管 理",
"onReachBottomDistance":50,//onReachBottomDistance单位只支持px
}
},
- 2.设置生命周期 onReachBottom。在生命周期中修改页码,发送新的请求,到了最后一页提示没有更多数据。
//上拉加载
onReachBottom(){
//判断当前是否属于加载状态,避免重复执行
if(this.is_loading) return
//页码增加
this.page_number++
//判断是否已经到最后一页
if(this.page_number >= this.page_total){
uni.showToast({
title:"已经是最后一页",
icon:"none"
})
}
//请求数据
},
5.扫码
问题:在小程序端和app端可以直接调用扫码api,但是在H5端,因为浏览器本身没有统一的扫码接口,导致这个扫码api无法使用。
解决办法:要想要H5的网页支持扫码功能,需要运行环境的支持,在uniapp中使用5+app的plus对象,可以帮助H5页面调用扫码功能。
解决思路:使用条件编译,如果是H5页面,则使用uniapp提供的全局plus对象来完成扫码功能,非H5环境直接调用uni扫码接口
步骤一:条件编译
scanCode() {
//H5统一跳转到H5扫码页面进行扫描码
// #ifdef H5
uni.navigateTo({
url: '/pages/h5-scan/h5-scan',
success(res) {
console.log('跳转成功')
},
fail(err) {
console.log('跳转失败')
}
}) return
// #endif
//纯app扫码
var that = this
//调用扫描接口
uni.scanCode({
//扫描完成
complete() {
console.log('complete')
},
//扫描成功
success(res) {
//保存扫码结果
that.qrcode = res.result console.log(res.result) //res.result 为二维码对应的字符串
},
//取消扫描
fail() {
console.log('取消扫码')
}
})
}
步骤二:一进入页面立即调用扫码功能
//定义扫码方法
methods: {
//创建扫码实例并开启扫描
startRecognize() {
try {
if (!this.h5_scan) {
//创建扫码实例
this.h5_scan = plus.barcode.create('barcode', [plus.barcode.QR], {
top: '44px',
//留出头部导航空间
left: '0',
width: '100%',
height: '50%',
position: 'static'
});
//配置扫码回调
this.h5_scan.onmarked = this.onmarked;
//将扫码实例添加到当前页面中
plus.webview.currentWebview().append(this.h5_scan);
}
//开启扫码
this.h5_scan.start();
} catch(e) {
alert("出现错误啦:\n" + e);
}
},
//扫码回调
onmarked(type, result) {
//扫码成功后扫码关闭扫码界面
this.h5_scan != null && this.h5_scan.close();
//console.log(result)
uni.showToast({
title: result,
duration: 5000
})
//跳转到上一个页面
uni.navigateBack({})
}
},
//H5扫码页面
data() {
return {
h5_scan: null,//扫码实例
}
},
onLoad() {
if (window.plus) {
this.startRecognize()
} else {
document.addEventListener('plusready', this.startRecognize)
}
},
onUnload() {
//页面卸载是关闭扫码
this.h5_scan != null && this.h5_scan.close()
},
6.页面默认全屏
- 当页面的根标签需要默认高度100%时,不同平台有不同的处理方式
- 在H5中,给 uni-page-body 这个标签设置高度,页面根标签才可以继承100%高度
/* #ifdef H5 */
uni-page-body{
height:100%;
}
/* #endif */
- 而在非H5中,需要过给最外层的page标签设定高度,页面根标签才可以继承100%高度,注意,不要给scoped属性影响
<style>
page{
height:100%;
}
</style>
7.拍照与选图
相关接口:uni.chooseImage()
说明:在打包成H5模式后,这个接口仍然能够使用,在手机浏览器和pc浏览器中,会打开文件浏览的功能,让用户选择相应的图片。而在uniapp打包的app中运行改H5网页时,会弹窗让用户选择 "拍照" "文件" "图库等功能",可以说,这是一个兼容性非常好的接口。
相关代码:
var that = this
uni.chooseImage({
count: 3, //默认9
sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
sourceType: ['album'], //从相册选择
success: function (res) {
console.log(res)
},
})
打包成H5后,接口调用成功后,返回值如下:
参数 | 类型 | 说明 |
---|---|---|
tempFilePaths | Array | 返回值是图片列表,纯路径(blob格式) |
tempFiles | Array | 返回值是图片列表,包括图片名称,图片大小,图片路径(blob格式) |
var reader = new FileReader()
reader.readAsDataURL(res.tempFiles[0])
var formData = new FormData()
formData.append('imgTitle',res.tempFiles[0])
uni-app 使用笔记的更多相关文章
- Windows 8.1 store app 开发笔记
原文:Windows 8.1 store app 开发笔记 零.简介 一切都要从博彦之星比赛说起.今年比赛的主题是使用Bing API(主要提到的有Bing Map API.Bing Translat ...
- Android APP性能测试笔记(一)
Android APP性能测试笔记(一) (1)工具使用 Android Studio GT, root的真机 (2)记录apk大小(对比竞品) 使用Android Studio导入需要测试 ...
- uni app中使用自定义图标库
项目中难免会用到自定义图标,那在uni app中应该怎么使用呢? 首先, 将图标目录放在static资源目录下: 在main.js中引入就可以全局使用了 import '@/static/icon-o ...
- 安卓app开发笔记
移动app应用开发也是信息技术课程科技创新的范畴,所以在个人开发app时候记录一些笔记,可能会很乱,所以选择按点来写. 首先是一些入门的资料,有很多需要自己学习的 https://www.oschin ...
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例
引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...
- Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境
引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...
- 小学英语课文朗读APP开发笔记(一):创建Win7虚拟机
1 缘起 以小米盒子为代表的OTT机顶盒.智能电视的快速普及,快速推动了Android技术在机顶盒.智能电视领域的普及.既然都是用的Android操作系统,那么从技术上来说应该是大同小异的,当然和手机 ...
- 手机web app开发笔记
各位朋友好,最近自学开发了一个手机Web APP,“编程之路”,主要功能包括文章的展示,留言,注册登录,音乐播放等.为了记录学习心得,提高自己的编程水平,也许对其他朋友有点启发,特整理开发笔记如下. ...
- uni app 零基础小白到项目实战-1
uni-app是一个使用vue.js开发跨平台应用的前端框架. 开发者通过编写vue.js代码,uni-app将其编译到Ios,android,微信小程序等多个平台,保证其正确并达到优秀体验. Uni ...
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
随机推荐
- SpringMVC —— 响应
响应页面 响应文本数据 响应json数据 响应json集合数据 注解 转换json时使用了类型转换器
- MVC模式与三层架构
MVC 模式 三层架构 MVC 模式 与 三层架构 的关系
- QT6新旧版本功能模块对比:QT6做了哪些优化重组?QT6新增加了哪些功能模块?QT6做了哪些改进、提升和优化?
简介 本文介绍了QT6新旧版本都有的功能模块.QT6优化掉了或转移了的功能模块.QT6新增加的功能模块,以及QT6做了哪些改进.提升和优化. 文章目录 QT6新旧版本都有的功能模块 QT6优化掉了或转 ...
- Qt中一些关于中文的使用
本文包含以下内容: 中文编码 按中文字典排序 中文首字母查找 版本:Qt5.14.2 中文编码 在一些老项目中,发现项目中使用的文件是GBK编码,而新项目使用的是Unicode编码,在有一些操 ...
- SD卡的基本知识与选购指南
1.SD卡与TF卡 SD 卡:又叫标准 SD 卡,其尺寸大小为 32 x 24 x 2.1 mm ,一般用于数码相机.声卡和采集卡等设备. TF 卡:又叫 micro SD 卡,其尺寸大小为 15 x ...
- 《Cloudera Hadoop大数据平台实战指南》代码下载
<Cloudera Hadoop大数据平台实战指南>代码下载 本书图书资源下载地址链接:https://pan.baidu.com/s/1-P7Go5gdJLim33_Iju1rfg 提取 ...
- foobar2000 v2.1.3 汉化版(更新日期:2024.04.02)
foobar2000 v2.1.3 汉化版 -----------------------[软件截图]---------------------- -----------------------[软件 ...
- USB2.0 的LPM和USB3.0的LPM区别
USB 2.0 和 USB 3.0 都支持低功耗管理机制(LPM,Link Power Management),但两者的实现方式和目标不同.以下是 USB 2.0 的 LPM 和 USB 3.0 的 ...
- 「模拟赛」A 层多校联训 4(卖品:CTH)
双倒一啦! 感觉这次最大的错误就是没看 T2.(本质原因还是时间浪费的太多了) 赛时记录在闲话啦 accoder 多校比赛链接 02 表示法 唐诗题!考高精的人都\(**\),输出深度优先搜索解决.高 ...
- 2021年7月国产数据库排行榜:openGauss成绩依旧亮眼,Kingbase向Top 10发起冲刺
7月份的国产数据库流行度排行榜已经揭晓.本期榜单展示的136个数据库中,近三分之二实现了评分增长.笔者认为这与6月份中国信通院发布第十二批大数据产品能力评测结果有关,65家企业的120款产品通过了本次 ...