uni-app x 通过webview引入js sdk,nvue页面收到message后无法对收到的data进行更多操作

发布于 1周前 作者 itying888 来自 Uni-App

uni-app x 通过webview引入js sdk,nvue页面收到message后无法对收到的data进行更多操作

示例代码:

// webview message事件
message(event : WebViewMessageEvent) {  
    if(event.detail.data !== null){  
        const data = event.detail.data;  
        const websdk  = data?.get('websdk');  
        // 如代码所示, websdk上的属性,等无法进行访问,无法 new   
        console.log((websdk as any as Web).connection , 'websdk')  
    }  
},

操作步骤:

  • webview页面postMessage 给 nvue页面
  • nve页面收到消息后,由于类型问题,无法对收到的data进行更多操作

预期结果:

  • nve页面收到消息后,可以对data进行类型处理,使其可以正常访问

实际结果:

  • 无法对收到的data进行更多操作

bug描述:

如图所示,uniappx, 引入第三方js sdk, 通过postMessage 发送sdk实例。 但在nvue使用的时候,一直提示类型错误, 无法进行初始化等

信息类别 信息内容
产品分类 uni-app x/App
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 mac os 11.4
HBuilderX版本号 3.98
手机系统 Android
手机系统版本号 Android 13
手机厂商 1+
手机机型 1+ ace2

Image Image


3 回复

因为类型问题,运行到安卓无法正常编译。我不理解如何才能访问 event.detail.data.xxx.xxx属性


设置any类型也不行, as 类型 也不行

uni-app x 中,如果你在 nvue 页面中通过 webview 引入了 JS SDK,并且在收到 message 后无法对收到的 data 进行更多操作,可能是由于以下原因导致的:

1. 数据类型问题

webview 传递的 message 数据通常是字符串类型。如果你需要对数据进行操作,可能需要先将其解析为对象或其他数据类型。

// 假设收到的 message 是 JSON 字符串
const receivedData = JSON.parse(data);

2. 作用域问题

确保你在处理 message 的代码中,能够访问到 data 并且在其作用域内进行操作。

3. 异步问题

如果你在 message 事件处理函数中进行了异步操作,确保在异步操作完成后再进行数据处理。

// 异步操作示例
webview.addEventListener('message', async (event) => {
    const data = event.data;
    const parsedData = JSON.parse(data);
    // 异步操作
    const result = await someAsyncFunction(parsedData);
    // 处理结果
});

4. nvue 页面的限制

nvue 页面使用的是 weex 渲染引擎,与 vue 页面有所不同。某些 JavaScript 操作在 nvue 页面中可能不被支持或表现不同。确保你使用的 JavaScript 特性在 nvue 环境中是支持的。

5. webviewnvue 页面的通信

确保 webviewnvue 页面之间的通信是正常的。你可以使用 uni.postMessageuni.onMessage 来进行通信。

// webview 中发送消息
uni.postMessage({
    data: 'your data'
});

// nvue 页面中接收消息
uni.onMessage((event) => {
    const data = event.data;
    // 处理 data
});

6. 调试

使用 console.log 或其他调试工具来检查 data 的内容和类型,确保数据传递和处理过程中没有问题。

console.log('Received data:', data);
console.log('Parsed data:', JSON.parse(data));

示例代码

以下是一个完整的示例,展示如何在 nvue 页面中处理 webview 传递的 message

// nvue 页面中的代码
export default {
    onLoad() {
        // 监听 webview 的消息
        uni.onMessage((event) => {
            const data = event.data;
            console.log('Received data:', data);

            try {
                // 解析 data
                const parsedData = JSON.parse(data);
                console.log('Parsed data:', parsedData);

                // 对 parsedData 进行更多操作
                this.processData(parsedData);
            } catch (error) {
                console.error('Failed to parse data:', error);
            }
        });
    },
    methods: {
        processData(data) {
            // 处理 data
            console.log('Processing data:', data);
            // 其他操作...
        }
    }
};
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!