本文记录微信小程序开发过程中遇到的种种问题,归纳总结
随着微信生态的不断发展,微信小程序的地位变的重要,几乎所有APP都会做小程序端的应用,虽然在开发过程中,开发成本比常规的网站类型的项目小,但也会遇到很多方案问题和技术瓶颈。
如果不在生命周期方法中做任何操作,此时回退到webview页面不会刷新,如果需要做刷新操作,有两种方案:
记录路由栈不记录路由栈 //在<web-view></web-view>页面的onShow方法中做操作 //这种操作,web-view会记录自己的路由栈,每setData一次,路由栈会增加一级,此时在<web-view></web-view>页面按返回按钮,回退的是<web-view></web-view>自己的路由栈,而不是小程序自身的路由栈 onShow(){ this.setData({ url: params.url }) } //这种操作,web-view不会记录自己的路由栈,先清空url,wx:if="{{url}}"会销毁<web-view></web-view>组件,在回调中重新setData,相当于初始化<web-view></web-view>组件,<web-view></web-view>自身路由栈不会增加,此时在<web-view></web-view>页面按返回按钮,回退小程序自身的路由栈 onShow(){ this.setData({ url: '' },()=>{ this.setData({ url: params.url }) }) } 不记录路由栈的方案,部分机型存在bug实测中,在iPhone X和iPhone XS等机型搭配的iOS 12.4.1系统下,webview的url先清空后赋值的方案中在binderror中报错如下:insertHTMLWebView:fail only one webView component
//webview页面的dom布局 <view class='container'> <web-view wx:if="{{url}}" class='webview' src="{{url}}" bindload="bindload" binderror="binderror" bindmessage="bindmessage"></web-view> </view> //js 文件 data: { url: '' } //webview 组件的原生事件 binderror(e){ console.log(e.detail.errMsg);//insertHTMLWebView:fail only one webView component }终极方案,解决从小程序原生页面回退到webview中,刷新webview并不记录webview自身路由栈的问题,方案如下:
//webview需要的url从公共数据app.globalData中读取,减少页面间通信的耦合度 onLoad(options){ this.setData({ url: app.globalData.url }) } // onShow(){ if(this.firstEnter){ this.firstEnter = false; return } wx.redirectTo({url:'index'}) } //注意:这个方案会触发onUnload事件,如果之前有相关的逻辑,需要做兼容处理 onUnload() { }感谢阅读,欢迎评论^-^