小程序内嵌网页调用小程序扫码API

如图所示,我需要点击扫码的按钮,调取小程序的API,但是我有两个不同类型的扫码类型,一个是条形码,一个是箱码,所以我在跳转的时候传了一个参数,codeType。
在这里插入图片描
点击事件如下:

		clickScan(type, selectBoxCodesIndex) {
       		 //如果点击的是箱码,需要保存当前点击的index
	        if (selectBoxCodesIndex !== undefined && selectBoxCodesIndex !== null) {
	          this.selectBoxCodesIndex = selectBoxCodesIndex;
	        }
	        //页面的原始地址比如   url?comeInType=addProduct
	        //因为jumpUrl里面带了?的特殊符号所以必须转码一次才能不影响小程序的跳转,
	        //如果不转码则会丢失部分数据
	        //传参都需要转码,对象形式的先转成JSON字符串再转码
	        //去掉之前扫码附加到url上的数据
	        let jumpUrl=window.location.toString().split(`&`)[0]
	        jumpUrl = encodeURIComponent(jumpUrl)
	        //extraParams为一个对象
	        let extraParams = encodeURIComponent(JSON.stringify({codeType:type}))
	        //路径中带两个重要参数,jumpUrl:调取扫码的页面完整路径,extraParams:额外参数,区分条形码还是箱码
	        let path = `/pages/scon/scon?jumpUrl=${jumpUrl}&extraParams=${extraParams}`
	        console.log('跳转到小程序的完整路径', path)
	        window.wx.miniProgram.navigateTo({
	          url: path,
	        })
      },

小程序页面:
页面初始数据中定义jumpUrl和extraParams

data: {
    jumpUrl: ``,
    extraParams: {}
  },

生命周期函数onLoad监听进入页面的加载,得到传过来的参数,jumpUrl和extraParams;

onLoad: function(options) {
    console.log("扫码页面的options", options)
    //jumpUrl需要解码,解码完后即为调取扫码的页面完整路径
    let jumpUrl = decodeURIComponent(options.jumpUrl)
    console.log('jumpUrl', jumpUrl)
    //extraParams:额外参数,为转码后的JSON字符串
    console.log('extraParams', options.extraParams)
    this.setData({
      jumpUrl,
      extraParams: options.extraParams
    })
  },

然后在生命周期函数onReady监听页面初次渲染完成,调用小程序扫码API,成功后将扫码得到的结果传入web网页。

onReady: function() {
    let that = this;
    wx.scanCode({
      success: (res) => {
        let scanResult = res.result
        console.log('扫码结果', scanResult)
        let pages = getCurrentPages()
        let prePage = pages[pages.length - 2]
        //先判断jumpUrl是否路径中带了query,比如:url?a=b
        let hasQuery = that.data.jumpUrl.split(`?`).length != 1
        //构造最终跳转的url,以原始页面的url开始,参数拼到后面
        let finalUrl = `${that.data.jumpUrl}`
        //如果有query,则应该拼接&符号而不是?符号
        if (hasQuery) {
          finalUrl += `&scanResult=${scanResult}`
        } else {
          finalUrl += `?scanResult=${scanResult}`
        }
        //判断是否有额外参数需要拼接
        if (that.data.extraParams) {
          finalUrl += `&extraParams=${that.data.extraParams}`
        }
        console.log(`finalUrl`, decodeURIComponent(finalUrl))
        prePage.setData({
          url: finalUrl
        })
        wx.navigateBack({
          delta: 1
        })
      }
    })
  },

然后web页面再接受从小程序传过来的值。

//将小程序里传过来的值赋给data中的scanValue变量
    beforeRouteUpdate(to, from, next) {
      console.log('进入路由Update钩子')
      console.log('to.query', to.query)
      //扫描条形码返回scanValue
      //url中带了扫码的数据
      if (to.query.scanResult) {
        //取出扫码的结果和附带的额外参数(额外参数用于区分是条形码还是箱码)
        let scanResult = to.query.scanResult
        let extraParams = JSON.parse(decodeURIComponent(to.query.extraParams))
        if (extraParams.codeType === `boxCode`) {
          this.editProductInfo.boxCodes[this.selectBoxCodesIndex].code = scanResult
        } else if (extraParams.codeType === `scavenging`) {
          this.editProductInfo.bottleCode = scanResult
        }
      }
      next()
    },

扫码的功能就完成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值