小记最近几个月和公司的同事一直在马不停蹄的开发小程序,经历了几个版本的迭代后也总算是稳定了下来。而我们的小程序也是得到了腾讯的认可,还拿了个奖
开发小程序的过程中踩的坑不可谓不多,而有些坑也实在是让人郁闷,不扒一扒难以平我心头之愤呐。
数据绑定 Mustache 语法(双大括号)
这个 {{}} 里面不能执行任何的方法,只能做简单的四则运算和Boolen判断,比如:
你这么干是不行的,你只能在拿到数据的时候就先对数据格式化一遍。是不是很恶心~~~
<wxs module="m1">
var parse = function(str) {
return parseInt(str);
};
module.exports.parse = parse;
</wxs>
<view wx:for="{{['1.22', '2.22', '3.222']}}" wx:for-item="i">
{{m1.parse(i)}}
</view>
wx.navigateBack() 无法向回退的页面传参
小程序的几个导航api,都可以通过 url 给对应的页面传参。而 w x.navigateBack({delta}), 只接受一个delta(返回的页面数)参数。但是有时候确确实实有向回退页面传参数的情况,这时候就只能通过localstorage或是redux等来处理了。
rpx 单位适配问题
小程序提供的 rpx 单位确实让我们开发的时候在高精度还原设计稿上省了很多事情。但是小记发现当你使用1rpx在一些机型上特别容易出问题。
.border {
border: 1rpx solid #000;
}
如果你这样设置边框的时候,大多数情况下它都能正常显示,但是在一些机器上尤其是 iPhone X 边框有时候根本不显示。所以我现在都改成 2rpx
绑定事件获取的target与currentTarget是有区别的
在绑定事件获取当前组件数据的时候,拿到的envt里面有target和currentTarget 这两个玩意儿里面都有一个dataset,而我们需要获取的数据就在dataset对象里面。正确的我们应该取 currentTarget 里面的就行,但是有时候这两个的数据是完全一样的,一不小心你就取错了。
那这个 target 和 currentTarget 有什么区别呢,官方的解释:
target:触发事件的源组件;
currentTarget: 事件绑定的当前组件;
看个例子:
<view id="outer" bindtap="handleTap1">
outer view
<view id="middle" catchtap="handleTap2">
middle view
<view id="inner" bindtap="handleTap3">
inner view
</view>
</view>
</view>
其实很容易区分,target就是事件开始的地方,currentTarget就是你绑定事件的地方。可以去看看
CSS引用静态资源问题
iconfont, 图片不能通过css,哦~应该该叫 wxss 本地引入。
view 添加点击效果
需要主动开启
<view hover hover-class="view-hover">
page wxss样式层级
下面是一个page 示例:
<!-- wxml -->
<view class="page-layout">
<view class="page__title">flex-direction: row</view>
<view class="flex-wrp" style="flex-direction:row;">
<view class="flex-item green">1</view>
<view class="flex-item red">2</view>
<view class="flex-item blue">3</view>
</view>
</view>
/* wxss */
.page-layout {
color: #000;
}
/* 下面这种写法 .red 是不生效的 */
.red {
color: #f00;
}
/* 必须这么写 */
.page-layout .red {
color: #f00;
}
WXS iOS 8.0
wxs 中如果使用了较新的 ES6 语法会导致小程序在iOS8机器上无法运行。小程序开发工具估计是没对wxs里面的ES6进行编译
// wxs
var getDesc = function(str) {
var strAry = str.split('·');
var desc1 = strAry[1] ? strAry[1] : '';
var desc2 = strAry[0];
//return {desc1, desc2} // 这里这种写法在iOS8上是没法正常运行的
return { // 必需采用ES5 的写法
desc1: desc1,
desc2: desc2
}
}
module.exports.getDesc = getDesc;
笔者之前在使用 <image/>的时候启用了延迟加载,也就是
<image mode="widthFix" src="{{imgurl}}" lazy-load></image>
这个绝大部分情况下是没问题的,但是有一天运营突然来找我说,他们配的活动页面上的部分图片在部分机型(比如:笔者的Iphone 7)上加载不出来。直觉告诉我估计是 “lazy-load” 问题,干掉后固然都正常了。后面特意对比了一下,发现无法load出来的图片都比较大,基本上是1500的宽度。
不知道是不是个例,抛出来给大家看看。
wx.getUserInfo() 调整
获取用户信息接口如果之前用户未授权过,调用该接口将直接报错,不再出现授权弹窗。只能通过button组件拉起授权。具体看
<button open-type="getUserInfo"></button>
微信小程序自 基础库 1.6.4开始支持了web-view组件,也就是可以在小程序里面内嵌网页,但是个人类型与海外类型的小程序暂不支持使用。
小程序无法和网页通信,如果需要携带参数,只能通过web-view url 中携带参数,网页可以通过 wx.miniProgram.postMessage
向小程序传数据但是基础库版本要在1.7.1以上且小程序只能在特定时机(小程序后退、组件销毁、分享)接收到信息。
小程序内置网页环境判断
小程序内置网页可通过 window.__wxjs_environment
变量判断是否在小程序环境。一般情况下web需要适配在判断是否在微信浏览器中打开,普通浏览器中打开,小程序中打开,然后会有以下代码:
// 判断是否在微信浏览器中
function isWeixinBrowser() {
return /micromessenger/i.test(navigator.userAgent.toLowerCase());
}
if ( isWeixinBrowser() ) {
// to do something
} else if ( window.__wxjs_environment ) {
// to do something
} else {
// to do something
}
如果这么写那么小程序的那个分支永远也进不去,为什么?自己想
// 判断是否在微信浏览器中
function isWeixinBrowser() {
return /micromessenger/i.test(navigator.userAgent.toLowerCase());
}
if ( window.__wxjs_environment ) {
// to do something
} else if ( isWeixinBrowser() ) {
// to do something
} else {
// to do something
}
这么写就好了
其他注意点
写于 2018年1月26日 Web 4609
如非特别注明,文章皆为原创。
转载请注明出处: