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. Figma 学习笔记 – Variants

    参考 Create and use variants 定义与用途 Variants 是 Component 的扩展使用方式. 它就像 HTML 元素的属性一样, 通过修改属性, 元素就会变成相应的样式 ...

  2. 安装nginx-http-flv-module模块

    简介 nginx-http-flv-module是什么 流程 注意事项 详细步骤 查看当前已经安装的nginx版本 下载对应版本的nginx源代码 下载nginx-http-flv-module模块源 ...

  3. 关于BarchNorm的一些学习

    <Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift> ...

  4. web端ant-design-vue Modal.info组件自定义icon和title使用小节

    web端ant-design-vue Modal.info组件自定义icon和title整理小节,最近在项目中用到了自定义icon和title的功能,经过测试发现,如果自定义icon title会自动 ...

  5. 71.登录失效,token过期怎么处理

    1. 清除用户数据,直接跳转登录页重新登录 : 2. 短token 过期,使用 长 token 重新获取短 token ,然后重新请求 : 如果长 token 也过期了,就去重新登录获取 token ...

  6. blocks 单调栈、单调队列题解

    blocks题解: 1.题面: 2.分析: 题意大概就是说,找一段最长的区间,并且这段区间的平均值>=k,那么我们可以对他的每一个值减去k,最终求和>=0即可. 那我们需要对每个可能的左端 ...

  7. 探索 Kubernetes 持久化存储之 Longhorn 初窥门径

    作者:运维有术星主 在 Kubernetes 生态系统中,持久化存储扮演着至关重要的角色,它是支撑业务应用稳定运行的基石.对于那些选择自建 Kubernetes 集群的运维架构师而言,选择合适的后端持 ...

  8. 云原生周刊:Istio 1.19 发布 | 2023.9.11

    开源项目推荐 Timoni Timoni 是 Kubernetes 的软件包管理器,由 CUE 提供支持,灵感来自 Helm. Timoni 项目致力于改善编写 Kubernetes 配置的用户体验. ...

  9. 题解:AT_abc370_c [ABC370C] Word Ladder

    题目传送门 luogu观看 简要题意 给两个序列 \(S\) 和 \(T\),输出的第一个数是它能改变的总个数,后面跟着的第 \(i\) 个是改变 \(i\) 个数之后,字典序最小的结果. 思路 当 ...

  10. 自建互联网档案馆「GitHub 热点速览」

    这两天北京的气温骤降,仿佛在提醒我们冬日的脚步已悄然而至,让人不禁感叹时间的飞逝,一年的时间"转瞬即逝". 如果你想留下互联网上的珍贵瞬间,避免它们消失在 404 错误中.这款开源 ...