小程序web-view和原生程序交互

交互的前提是安装jssdk

npm i weixin-js-sdk

官方手册:开放能力 / web-view

实现跳转到原生程序的某个页面
wx.miniProgram.navigateTo({url: '/pages/xxx/xxx?from=xx&id=xxx&phone=xxx'});//可以携带参数,此外可以支持redirectTo等详见手册
onLoad(options) {}//小程序对应页面拿到参数
实现小程序分享web-view页面
//H5
wx.miniProgram.postMessage({
    data: {
        type: "share",// 标识分享操作
        title: xxx,// 动态标题
        path: "/pages/xxx/xxx?isofficial=1&pageurl=" + pageurl // 目标路径
    }
});
//Mini
<web-view id="webView1" src="{{pageurl}}" bindmessage="handleMessage">
handleMessage(e) {
    const msgData = e.detail.data[e.detail.data.length - 1]; // 取最新一次消息
    if (msgData.type === "share") {
        this.setData({
            shareTitle: msgData.title,    // 更新分享标题
            sharePath: msgData.path       // 更新分享路径
        });
    }
}
onShareAppMessage() {
    return {
        title: this.data.shareTitle,
        path: this.data.sharePath       // 携带动态路径
    };
}
//此时小程序分享的卡片打开就是这个web-view内的H5页面

记小程序web-view登录后不能拿到store里数据问题

初步怀疑是web-view环境问题,因为内嵌的网页在浏览器环境直接登录是可以拿到请求的数据的。研究了一下小程序的web-view容器加载机制,模块导入先于登录请求数据,需要使用的一个变量在模块导入阶段初始化,此时还没有登录数据,无法正确初始化,即便登录也不能重新赋值,只有重新进入小程序,此时会再次加载import,此时存储的有登录信息了,就正常了。H5环境,登录后还会触发一次import,所以和web-view环境不同。

H5环境
小程序web-view环境

结论:不使用模块级变量,完全绕开模块加载机制的影响。