由于小程序中不能设置 viewport-fit=cover ,所以也就没有web中的安全区域说法,目前主流的做法是通过 wx.getSystemInfoSync() 判断是否是ipx,若是则给页面底部撑高34px。
const res = wx.getSystemInfoSync() if (res.model.indexOf('iPhone X') >= 0) { this.isIpx = true }
注意是用 res.model.indexOf('iPhone X') ,在开发者工具的iPhone X中,model是全等于 iPhone X 的,但在真机中往往拿到的值是 iPhone X GZxxx ,即后面可能会带一串东西,所以用 indexOf 才是比较稳的,而且对 iPhone XR 等机型也适用。
由于还有其他安卓机的全面屏,不太可能一一判断,而且某些安卓全面屏是没有用iPhone底部的工具条的(不存在冲突的情况),所以我们只判断iPhone X的情况就可以了,其他全面屏就不需要给底部预留了。
至于全面屏布局的适配,需要用 flex 布局或者获取屏幕宽高来慢慢调了,建议最好用flex布局自适应处理。
for循环中的子组件click事件无法触发
Page -> 父组件 -> 子组件 ,在子组件click后 $emit 一个事件出来,发现无法触发。
这个bug一开始没有出现,但偶然 npm run build 出现的,然后排查原因,后面即使回滚所有版本再npm start也还会出现。好像不触发则已,一发就不可收拾,这又是一个大坑,搜issue和加群问人,当晚下班回家研究到1点多都没有解决。
第二天继续研究,感觉可能是框架的原因,最后尝试升级一下mpvue版本,没想到就正常了。直接使用quick-strat项目的 mpvue 版本是 2.0.0, mpvue 和 mpvue-template-compiler 升级到最新 2.0.6 就解决了。
事后查看mpvue版本记录,果然是框架本身原因,并且找到了 issue 。
npm run build后代码报错,再build一次可能报另一些错
解决: 没找到原因,可能是引入vant导致的,打包时丢失了部分文件。多build几次,或者重启下小程序开发者工具就正常了。
mpvue中created() 钩子会在页面初始化时全部一起触发,尽量不要用 小程序生命周期的理解
进入已销毁的page组件时依次触发: onLoad,onShow,onReady,beforeMount,mounted
第一次进入已销毁的子组件时依次触发: onLoad,onReady,beforeMount,mounted
第二次进入已销毁的子组件时依次触发: onLoad,onShow,onReady
再次进入 未被销毁的page组件、子组件时只触发: onShow
mpvue文档中建议尽量不要使用小程序的生命周期,这个应该是为了让项目更好地适应支付宝小程序和头条小程序等,所以才这样建议大家尽量不要使用某一个小程序自身的api。
如果你们的小程序只是微信小程序(不考虑兼容其他平台小程序),我建议 直接用小程序的生命周期 ,而不要用mpvue的生命周期,坑太多了。比如mpvue的created周期,初始化时所有的page都会执行,所以created这个周期是不能用了。
onUnload不触发
小程序中与平常web开发不同的是,它的页面会被缓存。举个例子:
从 page1 跳转到 page2 ,再从 page2 返回 page1 ,此时的 page1 还没销毁,不会触发 onLoad 再重新渲染,而是直接使用之前的数据。从性能上来说,单纯的返回不应该再请求api获取数据重新渲染,这是对的,符合我们的预期。
而有时候,从 page2 返回 page1 时,我们希望 page1 是重新获取数据渲染的。比如在 page2 做了一个退出登录的操作,此时再返回 page1 时,还是会看到之前的数据。实际上我们的预期是:由于已经退出登录了, page1 的数据应该被销毁了。
在平常的web开发中,遇到上面的问题,我们可能是不管缓存,每次返回 page1 都再次请求api渲染最新的数据,牺牲掉部分性能从而保证逻辑的正确性。
在mpvue中我也尝试这样干了:想在 page1 的 onUnload() 生命周期中销毁数据,但是没有成功。即使在 page2 退出登录时,采用 wx.reLaunch() 重新刷一遍, page1 的 onUnload() 生命周期也没有执行。所以 onUnload() 是有可能不执行的,建议慎用。
最后还是得想办法做到 在 page2 控制 page1 的数据销毁或保留 。想到这里, vuex 就不自觉浮现在眼前了,如果page1的数据是通过vuex来控制的,那么我在page2就可以用vuex来灵活管理其他页面的数据了。
如果page2做退出登录操作时,就让page1的数据销毁,如果是不退出登录正常返回,page1的数据还是正常,做到灵活控制。