现在的逻辑是这样的:我在小程序中使用web-view嵌入了一个我自己的页面,嵌入的url里带了一个token,也就是登录状态,现在这个token失效了,(token是用wx.login方法返回的code与后台获取的,所以token只能在小程序里获取)原本我想的是,通过某种bindmessage告诉小程序,重新给一个token,但是找了很多办法,最后发现,除了通过url地址,小程序不支持主动传递数据给H5页面。于是,我就想,能不能动态修改url地址,最后发现,修改了也没起效果。最后,我想通过wx:if的方式,重新渲染web-view标签,这样就可以刷新整个web-view了。但是,实操下来发现,在bindmessage事件里,修改url、showWeb,也是不生效的,尽管它打印出来的值是false,是'',但是web-view还是没有任何变化,也没有消失。而在其他地方(非bindmessage),修改是成功的,web-view也能消失。
我最终的目的就是,如何将token从小程序中传递给web-view内嵌的H5,或者,如何在bindmessage中执行的代码能生效。
H5页面就一个按钮,点击按钮,触发postMessage方法
----html
<script src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js" />
wx.miniProgram.postMessage({
data: {
action: 'login'
}
})
-----wxml
<web-view src="{{url}}" bindmessage="onMessage" wx:if="{{showWeb}}" bindmessage="onMessage"></web-view>
----js
const app = getApp()
Page({
data: {
showWeb: false,
url: ''
},
onLoad() {
let token = wx.getStorageSync('token') || '';
this.setData({
showWeb: true,
url: `http://192.168.101.230:8081/?token=${token}`
});
// setTimeout(() => {
// this.setData({ // 这边设置false,web-view2秒后能消失
// showWeb: false
// })
// }, 2000);
},
onMessage(e) { // bindmessage事件
console.log('web-view message:', e);
let data = e.detail.data[0];
if (data.action == 'login') {
this.setData({ // 这里设置false,web-view还是显示,没生效
showWeb: false,
url: ''
});
console.log('showWeb', this.data.showWeb) // 但是这里打印的是false
console.log('url', this.data.url);
}
}
})

为啥一定要用wx.login返回的code去获取token,这个code主要是拿来获取用户openid的,不能用openid来获取token么,openid又不会变