小程序嵌套H5的方式和技巧(二)
文章接上文,小程序嵌套H5的方式和技巧(一)
四、刷新wev-view嵌套的H5页面
1)我们为什么要刷新wev-view嵌套的H5页面?
很多的业务场景都需要开发者每次打开页面都更新一下页面的数据。原生小程序更新页面的数据就比较简单了,通常在onshow里处理就可以了,每次进入onshow生命周期直接调用接口来刷新数据就可以了,而小程序用web-view组件嵌套H5来刷新页面数据可就没那么简单了。下面我来用实际场景来举例。
我们用三个页面:首页,页面A和页面B,三个页面都有不同的壳,嵌套的不同的H5页面。
首页:页面元素包含banner图,点击banner图会进入活动说明页A
活动说明页A:页面的元素包括参与活动需要满足的条件,获得奖励的人数限制,获得奖励的参与人员列表,去参加活动的按钮
活动详情页B:页面的元素包括活动的主页面,返回上一页的按钮
2)常规方法有回退两次的问题
用户从页面A进入到页面B,用户在B参与活动后返回上一页到页面A,此时需求希望页面刷新。通常我们会这么写:
wxml文件
// 首页
Page({
data: {
},
onReady(){
setTimeout(()=> {
// 模拟点击页面跳转到活动页面A
wx.navigateTo({
url: '/pages/A/A'
})
}, 5000)
}
}) // 页面A
Page({ /**
* 页面的初始数据
*/
data: {
src: ""
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
setTimeout(()=>{
// 模拟点击跳转到页面B
wx.navigateTo({
url: '/pages/B/B'
})
}, 5000)
}, /**
* 生命周期函数--监听页面显示
*/
onShow: function () {
let t = +new Date();
this.setData({
src: `https://www.baidu.com?t=${t}`
})
}
}) // 页面B代码
Page({ /**
* 页面的初始数据
*/
data: {
src: ""
}, /**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
this.setData({
src: `https://developers.weixin.qq.com/community/homepage`
})
}
})
经过上面的描述流程后:首页→活动说明页A→活动详情页B→返回上一页,回到活动说明页A;此时我们点击左上角的返回按钮,我们预期的效果是回到首页,但是实际的效果是web-view嵌套的H5页面刷新了一下,并没有回退至首页。
3)尝试修改问题,反而引发其他更严重问题
尝试解决该问题,修改页面A的代码为
<!--页面A的wxml-->
<view wx:if="{{src}}">
<web-view src="{{src}}"></web-view>
</view>
// 页面A
Page({ /**
* 页面的初始数据
*/
data: {
src: ""
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
setTimeout(()=>{
// 模拟点击跳转到页面B
wx.navigateTo({
url: '/pages/B/B'
})
}, 5000)
}, /**
* 生命周期函数--监听页面显示
*/
onShow: function () {
let t = +new Date();
this.setData({
src: ``
})
this.setData({
src: `https://www.baidu.com?t=${t}`
})
}
})
修改代码后,再经过流程后:首页→活动说明页A→活动详情页B→返回上一页,回到活动说明页A;发现页面A空白且控制台报错:[渲染层错误] 一个页面只能插入一个 '<web-view />'

4)功夫不负有心人,终于找到完美的解决方案
经过多次尝试方案,发现在onHide里面隐藏web-view(卸载we-bview),是可行的,贴上所有文件的代码
<!--首页的wxml-->
<view class="container">
</view>
// 首页
Page({
data: {
motto: '首页'
},
onReady(){
setTimeout(()=> {
// 模拟点击页面跳转到活动页面A
wx.navigateTo({
url: '/pages/A/A'
})
}, 5000)
}
}) <!--页面A的wxml-->
<view wx:if="{{src}}">
<web-view src="{{src}}"></web-view>
</view>
// 页面A
Page({ /**
* 页面的初始数据
*/
data: {
src: ""
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
setTimeout(()=>{
// 模拟点击跳转到页面B
wx.navigateTo({
url: '/pages/B/B'
})
}, 5000)
}, /**
* 生命周期函数--监听页面显示
*/
onShow: function () {
let t = +new Date();
this.setData({
src: `https://www.baidu.com?t=${t}`
})
},
onHide: function () {
this.setData({
src: ``
})
}
}) <!-- 页面B的wxml -->
<web-view src="{{src}}"></web-view>
// 页面B代码
Page({ /**
* 页面的初始数据
*/
data: {
src: ""
}, /**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 页面不需要刷新 所以写到onLoad生命周期里
this.setData({
src: `https://m.mi.com/`
})
}
})
web-view的页面刷新场景是非常常见的,也与我们后面的章节密不可分,因此讲的还是比较详细的,希望能帮助到其他的开发者。
5)精益求精,精简代码
结合我之前的文章,微信小程序如何重写Page方法?以及重写Page方法给开发者带来的好处 我们可以把代码做的更简洁:将Page方法重新,把onHide生命周期卸载web-view的代码提取出来,如果有很多的页面需要web-view刷新H5的话,这样会大大节省我们的工作量和代码量。
首先我们需要先定义一下web-view的页面变量及其含义
refreshSrc:如果页面的data里定义里这个变量,且用这个变量来渲染web-view,则每次打开页面都需要刷新页面;注意:不需要刷新的页面不要把渲染web-view的src属性定义成该变量名
精简后的代码
app.js
// app.js
(function(){
// 小程序原来的Page方法
let originalPage = Page;
// 我们自定义的Page方法
Page = function(config){
// todo 在这里我们可以给配置对象进行加工
// 将配置对象继续想下传递给小程序原来的Page方法
config.onHide = function(){
//如果页面定义了这个变量 且变量有值则在onHide生命周期将该值置空
if(this.data.refreshSrc){
this.setData({
refreshSrc: ''
})
}
}
originalPage (config);
}
})();
App({
onLaunch() {
},
globalData: {
}
}) <!--首页的wxml-->
<view class="container">
</view>
// 首页
Page({
data: {
motto: '首页'
},
onReady(){
setTimeout(()=> {
// 模拟点击页面跳转到活动页面A
wx.navigateTo({
url: '/pages/A/A'
})
}, 5000)
}
}) <!--页面A的wxml-->
<view wx:if="{{refreshSrc}}">
<web-view src="{{refreshSrc}}"></web-view>
</view>
// 页面A
Page({ /**
* 页面的初始数据
*/
data: {
refreshSrc: ""
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady: function () {
setTimeout(()=>{
// 模拟点击跳转到页面B
wx.navigateTo({
url: '/pages/B/B'
})
}, 5000)
}, /**
* 生命周期函数--监听页面显示
*/
onShow: function () {
let t = +new Date();
this.setData({
refreshSrc: `https://www.baidu.com?t=${t}`
})
}
}) <!-- 页面B的wxml -->
<web-view src="{{src}}"></web-view>
// 页面B代码
Page({
/**
* 页面的初始数据
*/
data: {
src: ""
},
/**
* 生命周期函数--监听页面加载
*/
onLoad: function (options) {
// 页面不需要刷新 所以写到onLoad生命周期里
this.setData({
src: `https://m.mi.com/`
})
}
})
这部分还是为了小程序中有很多页面需要刷新web-view嵌套的H5,如果小程序中类似于页面A的页面不多,这部分则可以忽略
小程序嵌套H5的方式和技巧(二)的更多相关文章
- 小程序嵌套H5的方式和技巧(一)
文章内多次使用了关键字"壳",首先先解释一下什么是壳 壳: 小程序由原生的web-view组件形成的页面,页面只包含技术逻辑(如打开H5页面),不包含具体业务接口请求和业务逻辑处理 ...
- 小程序嵌套h5
<web-view src="https://m.boc7.com/driver_unlogin/driver1"></web-view>
- Taro 多端开发的正确姿势:打造三端统一的网易严选(小程序、H5、React Native)
笔者所在的趣店 FED 早在去年 10 月份就已全面使用 Taro 框架开发小程序(当时版本为 1.1.0-beta.4),至今也上线了 2 个微信小程序.2 个支付宝小程序. 之所以选用 Taro, ...
- 承接微信小程序外包 H5外包就找北京动点软件开发团队
承接小程序外包 微信小程序外包 H5外包 就找北京动点软件 长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询,索取案例! QQ:372900288 ...
- 承接小程序外包 微信小程序外包 H5外包 就找北京动点软件
承接小程序外包 微信小程序外包 H5外包 就找北京动点软件 长年承接微信小程序.微信公众号开发 全职的H5开发团队,开发过几十款微信小程序公众号案例 欢迎来电咨询 QQ:372900288 微信:li ...
- 小程序和H5互调
小程序跳H5页面 https://blog.csdn.net/mytljp/article/details/81030687(copy) H5页面跳小程序 https://blog.csdn.net/ ...
- 微信小程序新版用户授权方式处理
最新更新(2018-12-27): 最近做了改版,做成默认进来就是首页,然后去判断有没有用户信息,没有的话再去判断用没授权过,如果授权过直接自动去获取,没有的话再跳转到授权页面.因为用户授权主要就是针 ...
- 小程序与h5的相互跳转
1, 小程序跳h5 <web-view src="https://zgl.seamo.cn/zglh5/kjzjlist1.html"></web-view> ...
- 用 React 编写的基于Taro + Dva构建的适配不同端(微信小程序、H5、React-Native 等)的时装衣橱
前言 Taro 是一套遵循 React 语法规范的 多端开发 解决方案.现如今市面上端的形态多种多样,Web.React-Native.微信小程序等各种端大行其道,当业务要求同时在不同的端都要求有所表 ...
随机推荐
- 20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测
作者 | 江昱 前言 图像分类是人工智能领域的一个热门话题.通俗解释就是,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法. 它利用计算机对图像进行定量分析,把图像或图像中 ...
- 如何通过 Serverless 技术降低微服务应用资源成本?
前言 在大型分布式 IT 架构领域,微服务是一项必不可少的技术.从本质上来讲,微服务是一种架构风格,将一个大型的系统拆分为多个拥有独立生命周期的应用,应用之间采用轻量级的通信机制进行通信.这些应用都是 ...
- 题解 [HAOI2018]反色游戏
题目传送门 题目大意 给出一个 \(n\) 个点 \(m\) 条无向边的图,每个点都有一个 \(\in [0,1]\) 的权值,每次可以选择一条边,然后将该边相连两点权值异或上 \(1\).问有多少种 ...
- 题解 Wide Swap
题目传送门 题目大意 给出一个长度为 \(n\) 的排列 \(a_{1,2,...,n}\) 以及常数 \(k\),每次可以交换两个数 \(a_i,a_j\) 当且仅当 \(j-i\ge k \tex ...
- CF49E Common ancestor(dp+dp+dp)
纪念卡常把自己卡死的一次自闭模拟赛 QWQ 一开始看这个题,以为是个图论,仔细一想,貌似可以直接dp啊. 首先,因为规则只有从两个变为1个,貌似可以用类似区间\(dp\)的方式来\(check\)一段 ...
- Markdown Syntax Images
Markdown Syntax Images Admittedly, it's fairly difficult to devise a "natural" syntax for ...
- javascript-vue介绍
vue.js是一个用于创建web交互页面的库 从技术角度讲,vue专注于MVVM模型的viewModel层,它通过双向数据绑定把view层和model层连接起来,实际DOM封装和输出格式都被抽象为Di ...
- Vue2源码解读 - 响应式原理及简单实现
直接进入主题了,想必大家都知道实现vue响应式核心方法就是 Object.defineProperty,那就从它开始说 Object.defineProperty 缺点: 深度监听,需要递归到底,一次 ...
- '\r'(回车符),'\n'(换行符)与"\r\n"
一.'\n','\r'和"\r\n" 回车\r本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return(回车,carriage有&q ...
- [BUAA]起点 软工第一次作业-热身
项目 内容 这个作业属于哪个课程 2020计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 了解软件开发,提高自己的工程能力和团队协作能力 这个作业在哪 ...