uniapp 在app和小程序端使用webview进行数据交互

结论:app端支持比较好可以做到实时传递,微信小程序支持比较差,小程序向url传参只能通过url,url向app传参需要特定时机(后退、组件销毁、分享、复制链接)触发才能收到消息。

以下是代码

  1. app端(需要使用nvue)

    复制代码
    <template>  
        <view class="webview-box">  
                <button style="z-index: 999;" @click="handlePostMessage('app向url传值')">点击向url传值</button>
                <web-view ref="webview" class="webview" src="http://192.168.18.103:8080/index?os=wx" @onPostMessage="PostMessage"></web-view>  
            </view>  
    </template>  
    <script>  
        export default {  
            data() {  
                return {  
                                    url:'http://192.168.18.103:8080/index?os=wx'
                }  
            },  
            onLoad() {  
                        this.url += '&t=' + new Date().getTime()
            },  
            methods: {  
                // 接收h5页面发来的键值判断需要执行的操作  
                PostMessage(evt) {  
                    console.log("postMessage: ", evt)
                                    uni.showModal({
                                        title:"提示",
                                        content:evt.detail.data[0].msg
                                    })
                },  
                // 获取到对应webview(关键)通过evalJs(注意大小写,如果不知道evalJ是什么,可自行百度) 执行网页的函数,可对其进行传参,完成与网页的通讯  
                handlePostMessage(res) {  
                                console.log("22")
                    this.$refs.webview.evalJs(`handleMessage('${res}')`);  
                }  
            }  
        }  
    </script>  
    
    <style>  
        .webview-box {  
            position: absolute;  
            left: 0px;  
            right: 0px;  
            top: 0px;  
            bottom: 0px;  
        }  
    
        .webview {  
            flex: 1; 
                     height: 300rpx;
        }  
    </style> 
  2. 微信小程序端(正常vue格式)

    复制代码
    <template>  
        <view class="webview-box">  
                <web-view ref="webview" class="webview" :src="url" @onPostMessage="PostMessage" @message="PostMessage"></web-view>  
            </view>  
    </template>  
    <script>  
        export default {  
            data() {  
                return {  
                                    url:'http://192.168.18.103:8080/index?os=wx'
                }  
            },  
            onLoad() {  
                        this.url += '&t=' + new Date().getTime()
            },  
            methods: {  
                // 接收h5页面发来的键值判断需要执行的操作  
                PostMessage(evt) {  
                    console.log("postMessage1: ", evt)  
                },  
                // 获取到对应webview(关键)通过evalJs(注意大小写,如果不知道evalJ是什么,可自行百度) 执行网页的函数,可对其进行传参,完成与网页的通讯  
                handlePostMessage(res) {  
                                console.log("22")
                }  
            }  
        }  
    </script>  
    
    <style>  
        .webview-box {  
            position: absolute;  
            left: 0px;  
            right: 0px;  
            top: 0px;  
            bottom: 0px;  
        }  
    
        .webview {  
            flex: 1; 
                     height: 300rpx;
        }  
    </style> 

    3、html端

    复制代码
    <!doctype html>
    <html lang="ch" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no,viewport-fit=cover">
        <title>默认的title</title>
        <!-- 微信 JS-SDK 如果不需要兼容小程序,则无需引用此 JS 文件。 -->  
        <script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.3.2.js"></script>  
        <!-- uni 的 SDK,必须引用。 -->  
        <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script>
    
        <body>
            <div id="box"></div>
            <div class="btn" >点击1</div>
            <button id="to_shiming">向上传递数据</button>
           
        </body>
        <script>  
                
            // 在引用依赖的文件后,需要在 HTML 中监听 UniAppJSBridgeReady 事件触发后,才能安全调用 uni 的 API。  
            document.addEventListener('UniAppJSBridgeReady', function() {
    
            // 下面就是js知识了,点击某个按钮后发消息。
            document.getElementById('to_shiming').addEventListener('click', function() {
    
                // 这里调用uniapp的api执行消息发送
                uni.postMessage({
                    data: {
                        msg:'url向app传值'
                    }
                });
            });
            });
            window.handleMessage = function(msg){
                console.log("接收到消息",msg);
                alert("接收到消息"+msg);
                document.getElementById('box').innerText = msg;
                        }
    
        </script>
    </head>
        
    
    </html>
相关推荐
熊猫钓鱼>_>10 小时前
ArkTS 装饰器总览:V1 / V2 / 通用装饰器完整学习笔记
笔记·学习·华为·交互·harmonyos·arkts·arkweb
古韵14 小时前
你的 uni-app 分页,一个 hook 搞定竞态和加载
javascript·vue.js·uni-app
lialaka17 小时前
「声纹迷宫(Acoustic Labyrinth)」:具身交互智能驱动的实时声学解构与全双工语音数字人控制台
人工智能·3d·交互
熊猫钓鱼>_>20 小时前
ArkTS 基础入门:从零搭建第一个交互页面
华为·架构·交互·ts·harmonyos·arkts·鸿蒙
游戏开发爱好者820 小时前
iOS应用加固方案全解析:源码加固与IPA在线加固对比
android·macos·ios·小程序·uni-app·cocoa·iphone
lialaka21 小时前
「极客智库(The Architect‘s Nexus)」——全语音 3D AI 首席架构师与具身交互智能会话推演舱
人工智能·3d·交互
满栀58521 小时前
uni-app 小程序开发实战:从路由踩坑、数据对接到 UI 优化的全方位复盘
ui·uni-app·notepad++
2301_810313181 天前
宠物服务APP开发宠物社交上门喂养洗护商城系统源码搭建
小程序·团队开发·软件需求·宠物
momodira82 天前
防溺水作品投票小程序选哪个?
小程序·投票工具·线上制作教程
鲁Q同志2 天前
微信小程序【uni-file-picker文件预览】
微信小程序·小程序