小程序开发实战经验分享:踩坑与解决方案

小程序开发实战经验分享:踩坑与解决方案

做了几年小程序开发,遇到的坑不少,把一些典型的拿出来说说。不讲理论,直接说遇到了什么问题、怎么解决的。


第一个坑,页面栈溢出。这个问题太常见了。小程序页面栈最多十层,超过之后 navigateTo 就失效了,用户点击没反应,程序员还不知道为啥。解决方法有两个:一是用 redirectTo 替换一部分 navigateTo,redirectTo 不会新增页面栈;二是及时用 navigateBack 手动返回。这两个方案结合着用,基本能控制住页面层数。


第二个坑,图片加载显示空白。小程序里用 image 标签,src 用本地路径有时候不显示,用网络路径有时候也不显示。本地图片要放在项目目录下,网络图片必须用 HTTPS,而且域名要在后台白名单里配置。如果图片还是不显示,先打开调试器的network面板,看请求有没有发出去。没发出去说明路径写错了,发出去但不显示,可能是图片本身有问题,换张图试试就知道了。


第三个坑,onLoad 和 onShow 分不清。onLoad 是页面加载时执行一次,onShow 是每次页面显示都执行。如果你在 onShow 里请求数据,页面切来切去会重复请求,用户体验很差。正确做法是,初始化数据放 onLoad 里,onShow 只处理需要实时刷新的部分。比如聊天列表,每次进入都需要最新消息,就放 onShow;用户基本信息基本不变,放 onLoad 就够了。


第四个坑,this指向问题。在回调函数里用 this,指向的不是页面对象,而是回调内部。解决方法是用箭头函数,或者在函数开头写 const that = this 先保存一份。这个问题JavaScript本身就有,小程序里写异步回调的时候特别容易踩。建议统一用 async/await 来处理异步,代码简洁,this 的问题也少很多。


第五个坑,setData 传递大对象。小程序的数据绑定靠 setData,如果一次性传一个很大的对象,每次都要做数据 diff,影响性能。正确做法是只传变化的部分。比如你有一个列表,想更新其中一条数据的某个字段,写法是 setData({ 'list[3].status': 'done' }),用字段路径的方式只更新那一个点,别整个列表传进去。


第六个坑,表单数据获取混乱。表单里多个输入框,用户填完点提交,结果有些字段没拿到值。检查一下 input 标签有没有绑定正确的 value 和 bindinput 处理函数。建议每个表单字段都对应 js 里一个明确的变量,change 事件触发时直接更新这个变量,提交时统一从这个变量取。表单简单还好,字段多了容易乱。


第七个坑,线上数据和本地测试数据混淆。开发时开了不校验域名的选项,一切正常。上线后接口请求失败了,才发现后台根本没配置域名白名单。上线前一定要切换回来测试一遍,确认所有接口都能请求成功再发布。这个坑很多人第一次上线都会踩一次。


第八个坑,ios 和安卓表现不一致。小程序在两个平台上有细微差异,比如时间格式化、字体渲染、flex布局都有可能出现偏差。测试的时候两个系统都要覆盖到,不要只看模拟器。


这些都是实战中真实遇到的。写出来希望后来人少踩几个。开发中的问题大多数不是能力问题,是经验问题。多踩几次,多总结几次,自然就通了。