当“uniapp-微信小程序”遇上“uniapp-h5”

463 阅读1分钟

当“uniapp-微信小程序”遇上“uniapp-h5”

需求

  • 微信小程序中接入H5页面,在H5中计算出结果,点击推荐科室,返回小程序中科室排班页面。
  • H5中的接口需要微信小程序传入appKey才可以使用。

1.微信小程序中打开H5

微信小程序中新建一个页面,用于单独放web-view组件,同时也便于后续内容的复用。

// webview.vue
<template>
  <view class="container">
    <web-view v-if="url" :src="url" @message="getH5Message"></web-view>
  </view>
</template>

2.微信小程序向H5传参

可通过url直接传参。需要注意这里的传参方式,因为h5项目使用的是history模式,所以需要增加/#/

// webview.vue
onLoad(query) {
    switch (query.type) {
      // 这里可根据传参不同,进入不同的h5页面
      case "smartGuide":
        this.url = "http://xxx.com/#/?appKey=xxx";
        break;
      default:
        break;
    }
 },

3.H5接收传参

App.vue文件的onLaunch中接收,传参相关数据,在query中,可存储相关数据,供后续使用。

// App.vue
onLaunch: function (dataObj) {
    // #ifdef H5
    const appKey = dataObj.query.appKey;
    // #endif
}

4.H5向微信小程序传参

h5中不支持uni.postMessage,所以要使用微信SDK。h5项目中,安装weixin-js-sdk

npm install --save-dev weixin-js-sdk

引入微信SDK,并调用miniProgram.postMessage方法,数据格式{ data: '' }

// res.vue
<script>
import jsWX from "weixin-js-sdk"; // 引入微信SDK
export default {
    methods:{
        handleClick(item){
          // #ifdef H5
          jsWX.miniProgram.getEnv((res) => {
            // 1.判断小程序环境
            if (res.miniprogram) {
              // 2.传数据
              const postData = {
                from: "smartGuide",
                backData: {
                  appHisId: item.appHisId,
                  officeName: item.officeName,
                },
              };

              jsWX.miniProgram.postMessage({ data: postData });

              // 3.返回小程序,触发@message事件
              jsWX.miniProgram.navigateBack();
            }
          });
          // #endif
        }
    }
}
</script>

5.H5返回微信小程序

调用微信SDK中的miniProgram.navigateBack方法,返回到小程序,触发web-view中的@message事件。

// res.vue
jsWX.miniProgram.navigateBack(); // 返回小程序,触发@message事件

6.微信小程序接收传参

web-view组件所在页面中接收,使用组件的@message方法,传参相关数据,在e.detail.data中。

// webview.vue
export default {
  methods: {
    getH5Message(e) {
      const H5Msg = e.detail.data[0]; // webview 返回传参
      
      // 跳转页面
      uni.redirectTo({ url: "/xxxx/xxxx/xxx" });
    },
  },
};