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 使用笔记的更多相关文章

  1. Windows 8.1 store app 开发笔记

    原文:Windows 8.1 store app 开发笔记 零.简介 一切都要从博彦之星比赛说起.今年比赛的主题是使用Bing API(主要提到的有Bing Map API.Bing Translat ...

  2. Android APP性能测试笔记(一)

    Android APP性能测试笔记(一) (1)工具使用   Android Studio  GT, root的真机 (2)记录apk大小(对比竞品)   使用Android Studio导入需要测试 ...

  3. uni app中使用自定义图标库

    项目中难免会用到自定义图标,那在uni app中应该怎么使用呢? 首先, 将图标目录放在static资源目录下: 在main.js中引入就可以全局使用了 import '@/static/icon-o ...

  4. 安卓app开发笔记

    移动app应用开发也是信息技术课程科技创新的范畴,所以在个人开发app时候记录一些笔记,可能会很乱,所以选择按点来写. 首先是一些入门的资料,有很多需要自己学习的 https://www.oschin ...

  5. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  6. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

  7. 小学英语课文朗读APP开发笔记(一):创建Win7虚拟机

    1 缘起 以小米盒子为代表的OTT机顶盒.智能电视的快速普及,快速推动了Android技术在机顶盒.智能电视领域的普及.既然都是用的Android操作系统,那么从技术上来说应该是大同小异的,当然和手机 ...

  8. 手机web app开发笔记

    各位朋友好,最近自学开发了一个手机Web APP,“编程之路”,主要功能包括文章的展示,留言,注册登录,音乐播放等.为了记录学习心得,提高自己的编程水平,也许对其他朋友有点启发,特整理开发笔记如下. ...

  9. uni app 零基础小白到项目实战-1

    uni-app是一个使用vue.js开发跨平台应用的前端框架. 开发者通过编写vue.js代码,uni-app将其编译到Ios,android,微信小程序等多个平台,保证其正确并达到优秀体验. Uni ...

  10. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

随机推荐

  1. SpringMVC —— 响应

    响应页面    响应文本数据    响应json数据    响应json集合数据    注解      转换json时使用了类型转换器     

  2. MVC模式与三层架构

    MVC 模式    三层架构    MVC 模式 与 三层架构 的关系   

  3. QT6新旧版本功能模块对比:QT6做了哪些优化重组?QT6新增加了哪些功能模块?QT6做了哪些改进、提升和优化?

    简介 本文介绍了QT6新旧版本都有的功能模块.QT6优化掉了或转移了的功能模块.QT6新增加的功能模块,以及QT6做了哪些改进.提升和优化. 文章目录 QT6新旧版本都有的功能模块 QT6优化掉了或转 ...

  4. Qt中一些关于中文的使用

    本文包含以下内容: 中文编码 按中文字典排序 中文首字母查找 版本:Qt5.14.2 中文编码     在一些老项目中,发现项目中使用的文件是GBK编码,而新项目使用的是Unicode编码,在有一些操 ...

  5. SD卡的基本知识与选购指南

    1.SD卡与TF卡 SD 卡:又叫标准 SD 卡,其尺寸大小为 32 x 24 x 2.1 mm ,一般用于数码相机.声卡和采集卡等设备. TF 卡:又叫 micro SD 卡,其尺寸大小为 15 x ...

  6. 《Cloudera Hadoop大数据平台实战指南》代码下载

    <Cloudera Hadoop大数据平台实战指南>代码下载 本书图书资源下载地址链接:https://pan.baidu.com/s/1-P7Go5gdJLim33_Iju1rfg 提取 ...

  7. foobar2000 v2.1.3 汉化版(更新日期:2024.04.02)

    foobar2000 v2.1.3 汉化版 -----------------------[软件截图]---------------------- -----------------------[软件 ...

  8. USB2.0 的LPM和USB3.0的LPM区别

    USB 2.0 和 USB 3.0 都支持低功耗管理机制(LPM,Link Power Management),但两者的实现方式和目标不同.以下是 USB 2.0 的 LPM 和 USB 3.0 的 ...

  9. 「模拟赛」A 层多校联训 4(卖品:CTH)

    双倒一啦! 感觉这次最大的错误就是没看 T2.(本质原因还是时间浪费的太多了) 赛时记录在闲话啦 accoder 多校比赛链接 02 表示法 唐诗题!考高精的人都\(**\),输出深度优先搜索解决.高 ...

  10. 2021年7月国产数据库排行榜:openGauss成绩依旧亮眼,Kingbase向Top 10发起冲刺

    7月份的国产数据库流行度排行榜已经揭晓.本期榜单展示的136个数据库中,近三分之二实现了评分增长.笔者认为这与6月份中国信通院发布第十二批大数据产品能力评测结果有关,65家企业的120款产品通过了本次 ...