记录uniapp开发过程中遇到的问题

468 阅读2分钟

前言

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是正常的,真机上传会报错。

后记

暂时先记这么多,持续更新!