前言
uniapp开发过程中,为了方便,使用的方式是直接运行在浏览器,也就是h5模式,开发过程中,一切正常,但是打包到真机上或者运行在模拟器上时就会出现很多问题,这里简要记录一下,方便后续查看,快速解决问题。
报错集锦
1、使用路由$route.query获取路由参数报错
在真机里面无法使用this.$route,会直接报undefined,在h5页面正常,为了解决问题,我们统一采用uniapp的方式,在onLoad里面获取参数。
| onLoad | 监听页面加载,其参数为上个页面传递的数据,参数类型为 Object(用于页面传参),参考示例 |
|---|
onLoad(options){
//直接在options对象上获取参数
console.log(options.id)
}
2、循环报错
TypeError: Invalid attempt to destructure non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method. at view.umd.min.js:1
23:26:31.398 cid unmatched at view.umd.min.js:1
根本原因是循环绑定key值的时候绑定了无用的值,一般使用列表的id作为key值,退一步讲,如果id作为key值还是报错的情况下,我们可以直接使用循环的index为key值。
<ul>
<li v-for="(item, index) in list" :key="index"></li>
</ul>
//必须保证item.id是存在的
<ul>
<li v-for="item in list" :key="item.id"></li>
</ul>
3、返回上一页并携带参数
之前提到过返回上一页并携带参数,可以使用获取页面栈的方式,然后拿到上一页的实例,直接修改。
onUnload(){
// 获取当前页上的栈
var pages = getCurrentPages();
//当前页面
var currentPage = pages[pages.length - 1];
//上一页面
var prevPage = pages[pages.length - 2];
//上两页 以此类推
var prevAgainPage = pages[pages.length - 3];
//直接找到要修改的页面 获取修改页面实例 修改数据
prevPage.$vm.updateQuery = 'someThingData'
}
作者:金环二郎
链接:https://juejin.cn/post/7216518492614328380
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这里的$vm的字段不能丢,也不能换,之所以这次报错的原因是h5端不使用$vm也能拿到实例,但是app端不行,为了避免出现报错,我们统一使用获取$vm的方式去获取实例
4、uniapp上传文件的问题
<uni-file-picker
ref="filePicker"
:auto-upload="false"
@select="select"
></uni-file-picker>
select(e){
uni.uploadFile({
url: basisService + "/file/upload",
filePath:e.tempFilePaths[0],
name: 'file', // 随便填,不为空即可
formData: data, // 接口参数,json格式,底层自动转为FormData的格式数据
header: {
Authorization: getToken()
},
success: (res) => {
resolve(res.data)
},
fail: (res) => {
console.error(res)
reject(res)
}
})
}
注意:这里的filePath必须要传,不能随便传,要传文件对象的tempFilePaths,否则h5是正常的,真机上传会报错。
后记
暂时先记这么多,持续更新!