uniapp的webview与vue项目通信

  • Post author:
  • Post category:uniapp


需求:vue的h5项目,向uniapp嵌入的webview里面传值,调uniapp的页面切换路由方法,uni.navigateTo
(注:uniapp的webview组件地址,https://uniapp.dcloud.net.cn/component/web-view.html#web-view)
思路:
1、在vue项目的index.html中引入<script type="text/javascript" src="https://unpkg.com/@dcloudio/uni-webview-js@0.0.3/index.js"></script>,必须引,才能使用uniapp的内部方法
2、通过注册UniAppJSBridgeReady事件,在里面调用uniapp提供的相关方法,实现数据通信(注:也是在index.html中)
<script>
    document.addEventListener('UniAppJSBridgeReady', function() {
      uni.webView.getEnv(function(res) {
        console.log('当前环境:' + JSON.stringify(res));
      });
      // uni.webView.navigateTo(...)
    });
  </script>
  注:支持的uniapp方法有如下:
  uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab,uni.navigateBack,uni.postMessage(h5端向app端发送消息),uni.getEnv(获取当前环境)
  
3、当前的问题是如何实现index.html与操作的vue页面之间进行通信,解决方法如下:
    1>在main.js为window绑定一个全局变量,eventBus,通过vue兄弟组件传值的形式($emit,$on)
    window.eventBus=new Vue();
    window.isShowMap=false;
    2>在vue页面发出一个事件,传递相应参数(Home.vue)
    goMap() {
      window.eventBus.$emit("goMapExtend",true);
    },
    3>在index.html接收这个发出的变量,然后注册UniAppJSBridgeReady事件,在里面监听dom事件,因为UniAppJSBridgeReady在$on里面无法触发,所以必须给它一个触发的条件,
    所以创建了一个span标签,在$on里面触发标签的点击事件,在UniAppJSBridgeReady中监听标签的点击事件,在里面执行相应的操作
    <script>
    //注:window.eventBus必须用setTimeout包一下,否则会出现undefined的情况,导致报错
      setTimeout(function(){
        if(window.eventBus) {
          window.eventBus.$on("goMapExtend",(info)=>{
            window.isShowMap=info;
            if(window.isShowMap){
              let spanItem=document.getElementById('changeMsg');
              spanItem.click()
            };
          });
        };
      },1000);
      document.addEventListener("UniAppJSBridgeReady", function () {
        // uni.getEnv(function(res) {  
        //   console.log('当前环境:' + JSON.stringify(res));  
        // }); 
        // 传参
        // uni.postMessage({
        //   data: {
        //     local: '测试哈哈哈',
        //   },
        // });
        document.getElementById('changeMsg').addEventListener('click', function() {
          uni.navigateTo({
            url: '/pages/map/map'
          })
        });
      });
    </script>
    <span id="changeMsg"></span>



版权声明:本文为Syracuse123_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。