微信小程序原生开发技巧及跳坑心得

常用功能

1、事件带参

在微信小程序中,给事件的回调函数内部传递参数不是通过函数调用传递实参的方式传递的,而是通过在view上绑定属性,然后在回调函数的事件对象的currentTarget属性中的dataset中获取的

  • 视图
// index 为变量
<view data-name="小程序" data-index='{{index}}' bindtap='handle'>测试</view>
  • 逻辑
Page({
  data: {
    ......
  },
  handle (e) {
    let name = e.currentTarget.dataset.name;
    let index = e.currentTarget.dataset.index;
    console.log(name); // "小程序"
    console.log(index);// 变量传递的值
  }
})

2、路由传参

在微信小程序中,带参数跳转页面是通过将参数拼接在url后面,然后在跳转到的页面的生命周期函数onLoad的参数option中获取。

  • A页面
wx.navigateTo({
  // 无法传递对象,如果是对象则需要使用JSON.stringify()转换为字符串,在接受数据页面使用JSON.parse()转换成对象
  url: '/pages/approval_apply/index/index?id=' + id
})
  • B页面
Page({
  data: {
    ....
  },
  onLoad: function(option){
    // 获取传递过来的参数
    let id = option.id
  }
})

3、获取/修改父级页面的数据|调用父级页面方法

小程序中有一个全局方法getCurrentPages()可以获取到打开的页面信息,进而获取到上一级的页面,就可以获取到上一级页面的数据和调用上一级页面的方法,以及更新上一级页面的数据。

  • 父级页面
Page({
  data: {
    name: 'Pony'
  },
  getDataList () {
    console.log(this.data.name);// 'Pony'
  }
})
  • 当前页面
Page({
  onLoad:function(){
    // 获取页面信息
    let pages = geturrentPages(); 
    // 获取当前页面
    let currPage = pages[pages.length - 1];
    // 获取上一级页面
    let prevPage = pages[pages.length - 2];
    // 获取上一级页面数据
    let prevName = prevPage.data.name; // 'Pony'
    // 调用上一级页面方法
    prevPage.getDataList()
    // 修改上一级页面的数据
    prevPage.setData({
      name: 'Jack'
    })
  }
})

4、上传图片(本地图|相机拍照)并预览和删除

  • 图片上传

小程序提供了方便的图片上传api,使用wx.chooseImage方法可进行图片上传,在成功的回调中可以获取到临时的文件路径,然后可以通过文件管理apiwx.getFileSystemManager()readFile方法将图片转化为base64,然后进行上传。同时由于小程序规定上传文件不能超过2M,因此也可以进行控制。

data: {
  imgList: []
},
......

uploadImg() {
  let that = this;
  let imgList = that.data.imgList;
  if (imgList.length < 3){ // 同时上传3张限制
    wx.chooseImage({
      sizeType: ['original', 'compressed'], // 设置图片上传类型,可以是原图,也可是压缩文件
      count: 3, // 规定上传图片张数,设置后在批量选取图片时,相册只能同时选择设定的值的张数
      success(res) {
        let tempFilePaths = res.tempFilePaths
        let tempFilesSize = res.tempFiles[0].size;//获取图片的大小,单位B  
        if ((imgList.length + tempFilePaths.length) <= 3) { // 分批上传总数超过3张限制(处理单独上传不足3张后,再次上传3张导致超出限制的bug )
          if (tempFilesSize <= 2000000) { // 单张超过2M进行限制
            tempFilePaths.forEach(function (item, index) {
              wx.getFileSystemManager().readFile({
                filePath: item, //选择图片返回的相对路径
                encoding: 'base64', //编码格式
                success: res => { //成功的回调
                  imgList.push({
                    fileBytes: 'data:image/jpeg;base64,' + res.data
                  })
                  that.setData({
                    imgList: imgList
                  })
                },
                fail: (err) => {
                  wx.showToast({
                    title: err,
                  })
                }
              })
            })
          } else {
            wx.showToast({
              title: '上传图片不能大于2M',
              icon: 'none'
            })
          }
        } else {
          wx.showToast({
            title: '上传图片不能大于3张',
            icon: 'none'
          })
        }    
      }
    })
  } else {
    wx.showToast({
      title: '上传图片不能大于3张',
      icon: 'none'
    })
  }
}

注意:这种方式上传只是将图片转化为base64编码,并不是直接上传到服务器,因此可以先将图片的编码设置为data的数据,在上传回显时只需要将对应的编码赋值给image组件的src即可。

  • 图片预览

图片上传后,通常需要进行预览上传效果,小程序也提供了api,可以通过wx.previewImage()方法查看上传图片

 previewImage(e) {
    let that = this;
    let index = e.currentTarget.dataset.index * 1;
    wx.previewImage({
      current: that.data.imgList[index], // 当前显示图片的编译后的base64地址
      urls: that.data.imgList
    })
  }
  • 上传后删除

上传后删除很简单,直接删除存储图片地址数组对应的值即可

flieImgClose(e) {
  let that = this;
  let index = e.currentTarget.dataset.index * 1;
  let imgList = that.data.imgList;
  imgList.splice(index, 1);
  that.setData({
    imgList: imgList,
  })
}

5、附件(pdf|word|excel)预览

preViewFile (e) {
    let downloadUrl = e.currentTarget.dataset.url;
    wx.downloadFile({
      url: downloadUrl,
      success: function (res) {
        let filePath = res.tempFilePath
        wx.openDocument({
          filePath: filePath,
          success: function (res) {
            console.log('打开文档成功')
          },
          fail: function (res) {
            wx.showToast({
              title: '打开失败',
              icon: 'none'
            })
          }
        })
      },
      fail: function () {
        wx.showToast({
          title: '下载失败!',
          icon: 'none'
        })
      }
    })
  }

6、上拉加载更多

跳坑心得

1、下拉刷新后无法弹回

在小程序中有一个钩子函数onPullDownRefresh可以监听用户下拉动作,利用该钩子函数可以进行下拉刷新。在该钩子函数中调用获取页面数据的方法,就可以更新页面数据。但在实际开发中发现一个问题,就是下拉刷新后页面无法弹回原来的位置。

  • 解决方法: 可以在获取页面数据的方法中,数据返回后主动调用wx.stopPullDownRefresh()方法可以解决该问题。
onPullDownRefresh: function() {
  this.getInitData()
},
getInitData () {
  // sendRequest为封装的发送请求的方法
  sendRequest({
    // .....
  }).then(res => {
    wx.stopPullDownRefresh()
    ...
  })
}

2、Input和textarea组件穿透自定义遮罩

3、cover-view组件覆盖视图设置透明度opacity无效

4、本地图片模拟器显示正常,真机无法显示

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容