小程序二级页面tabbar_小程序页面推广踩坑记

1e9d95e86302d4e11e9c8ab4981ed863.gif

前几天,团队里有个小伙伴遇到一个问题,卡壳了大半天。我觉得这个例子值得拿出来分享给大家。希望大家以后遇到类似的问题能顺利绕过这种坑。

业务场景很常见,就是为了配合小程序中特定页面的推广,区分推广渠道和人员,逐步实现较高精准度的投放。稍微特殊一点的地方在于,这个页面在小程序中。

为了达到区分推广渠道和人员的目的,我们决定采用在页面url末尾添加参数src和uid的方法。由于这样的推广不能使用体验版进行测试,所以全程我们只能在微信开发者工具中模拟推广行为。

页面本身的交互是这样的:

在index页面点击按钮跳转到webview嵌套的h5页面pages/webhref/webhref?url=xxx。跳转时需要携带index页面设置的参数uid和src,以及目标页面地址url。在webhref页面的onload方法中再接收options对象并解析。

首先,在编译模式中设置index页面的启动参数,模拟index页面被推广的场景:      

bea78966e43371a203a7e78ebd13228c.png       

然后在对应按钮的点击事件中执行跳转:

let newurl = api.host+'/m/'+ pageurl +'&src=' + this.data.src + '&uid=' + this.data.uid;wx.navigateTo({  url: '../webhref/webhref?url=' + newurl});

这样,在跳转后的页面webhref的onload方法中就可以接收到这几个参数了:

onLoad: function (options) {  if (options.url.indexOf('/pages') == -1) {    console.log('options--',options);    this.setData({      url: options.url + '?src=' + options.src + '&uid=' + options.uid    })  }}    // {url: "https://xxxxx.com.cn/m/bj", src: "111", uid: "222"}

像上面这样,将接收到的这三个参数拼接起来就好了。

看起来的确就是这么简单,然鹅~

如果过不了几天,options.url中需要带?该怎么办呢?

那我们就需要兼容一下options.url有没有?两种情况了。这个好说:

onLoad: function (options) {      if (options.url.indexOf('/pages') == -1) {          let tourl = options.url;          let params = (tourl.indexOf('?')!=-1 ? '&': '?') + options.src + '&uid=' + options.uid          this.setData({              url: tourl + params          })  }}

也不难嘛,是不是~

可是我们貌似忽略了另一个问题,如果options.url中如果有?的话,webhref页面setData的url就会包含两个?了,这……这就需要用到encodeURIComponent和decodeURIComponent两个方法了。

encodeURIComponent() 函数可把字符串作为 URI 组件进行编码。decodeURIComponent()可以进行对应的解码。

So,为了避免浏览器误解,我们在index页面执行跳转时,需要使用encodeURIComponent()将url进行转码,到webhref之后再用decodeURIComponent()进行解码。然后使用setData重置一下webhref页面地址就好了。就像这样:

// pages/index/index.jslet newurl = api.host+'/m/'+ pageurl;wx.navigateTo({  url: '../webhref/webhref?url=' + encodeURIComponent(newurl) + '&src=' + this.data.src + '&uid=' + this.data.uid});// pages/webhref/webhref.jslet newurl = decodeURIComponent(options.url);let params = (newurl.indexOf('?')!=-1 ? '&': '?') + options.src + '&uid=' + options.uidthis.setData({  url: newurl + params})
看到这里,可能有的小伙伴会说,为什么不把tourl和参数src/uid一起编码解码呢?那样不是更方便吗?

其实,如果只推广一个页面完全可以如此。但这里关联着我们另一个小需求,就是webhref页面也要做推广。所以,webhref页面接收options时,只需要获取url部分,然后拼接自身页面设置的参数src和uid,拼接成完整的推广链接。如果一起编码解码,options.url中就会包含index页面中的src和uid参数,增加url部分的分离难度。

说句俗话,行百里者半九十。果然如此。分析代码确认没问题了,但是webhref页面的数据入库情况依然有问题。

找了各种原因,最终发现,在设置启动参数时,小伙伴使用了编码后的url和编码前的src和uid,类似这种:url=https%3A%2F%2F100audio.com%2F%3Furl_targeting%3D1&src=111&uid=bbb。原来是自己挖的坑,还说啥呢?

所以,大家还需要注意:

设置启动参数时,url和后面的参数要保持编码的一致性。切记!

还是那句话,我们踩的不是坑,而是我们自己技术上的模糊点。每一个点踩实了,我们的技术能力才能得到切实的提高。和大家共勉~

原创不易,你的鼓励是我持续进步的动力,希望亲爱的们给一个在看或者小小的❤哟~ 

CC推荐· 加我微信(codenotes66),进我的技术交流群· 关注我的公众号,做一个有趣的技术人………
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值