uni-app vue3 使用renderjs打包wgt包后 :change 导致白屏,去掉:change正常。在真机调试和安卓运行均正常。

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

uni-app vue3 使用renderjs打包wgt包后 :change 导致白屏,去掉:change正常。在真机调试和安卓运行均正常。

示例代码:

<template>
<view id="map-container" :prop="isLocation" :change:prop="mapModule.geolocation" ></view>
</template>

<script>
import { ref, reactive, defineComponent, toRefs, watch } from 'vue';
import { onShow } from '@dcloudio/uni-app'
export default defineComponent({
setup() {
const markers = ref([]);
const state = reactive({
isLocation: false
})
return {
...toRefs(state)
}
}
})
</script>

<script module="mapModule" lang="renderjs">
export default {
data () {
return {
map: null,
}
},
created() {},
methods: {
geolocation(newLocation, oldLocation) {}
}
}
</script>

操作步骤:

真机和安卓运行 :change正常显示,打包wgt访问包白屏 去掉 :change打包wgt后才能正常。

预期结果:

:change能够操作renderjs层。

实际结果:

:change打包wgt白屏

bug描述:

vue3 使用renderjs打包wgt包后 :change 导致白屏 去掉:change正常。在真机调试和安卓运行都正常。

Image

信息类别 详细信息
产品分类 uniapp/App
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 10
HBuilderX类型 正式
HBuilderX版本号 3.98
手机系统 Android
手机系统版本号 Android 11
手机厂商 红米
手机机型 9A
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

4 回复

我这边在安卓机上测试并无问题,请检查你的代码是否有误,我贴一下我的测试工程请供参考 <template>
<view>




<view :prop="msg" :change:prop="testRenderjs.onChange" id="renderjs-view">{{msg}}</view>

    <button @tap="changeMsgFn">点击修改options旧版版</button>  

    <button @tap="testRenderjs.emitData">直接调用renderjs中的emitData方法</button>  

    <button @click="update">更新版本</button>  
</view>  
</template> <script> // 原先的script,这里被称为service层 export default { data() { return { //这里存放准备传递给renderjs的数据 msg: "我是service层原来的msg" } }, methods: { // 触发service层 出入renderjs数据改变 changeMsgFn() { // 修改msg 触发change this.msg = "msg的值变了" }, // 接收renderjs发回的数据 acceptDataFromRenderjs(data) { console.log('从renderjs中接收到的数据', data) this.msg = data.content }, update() { console.log("更新版本") uni.downloadFile({ url: "https://mp-def56af1-b497-4158-bdaa-adb4eb12820e.cdn.bspapp.com/cloudstorage/__UNI__9FEA80B.wgt", success: res => { console.log("res:", res) // 下载好直接安装,下次启动生效 plus.runtime.install(res.tempFilePath, { force: true }, (success) => { console.log(success) plus.runtime.restart(); }, (fail) => { console.log("失败" + fail) }); } }); } } } </script> <script module="testRenderjs" lang="renderjs"> export default { data() { return { content: "我是来自renderjs的数据" } }, created() { console.log('renderjs初始化完毕') }, mounted() { const view = document.getElementById('renderjs-view') const button = document.createElement('button') button.innerText = '一个按钮' view.appendChild(button) }, methods: { // 接收逻辑层service层发送的数据 onChange(newValue, oldValue, ownerInstance, instance) { console.log('service层中的options发生变化') console.log('新值newValue', newValue) console.log('旧值oldValue', oldValue) // ownerInstance和this.$ownerInstance一样,可用来向service层通信 // instance和ownerInstance的区别是: // instance.$el指向的是触发事件的那个节点;ownerInstance.$el指向当前vue文件中的根节点; // instance的作用目前尚不明确,官方没有给出用法 }, // 发送数据到service层 emitData(event, ownerInstance) { // event是事件对象
            ownerInstance.callMethod('acceptDataFromRenderjs', {  
                content: this.content  
            })  
            // 或者  
            /* this.$ownerInstance.callMethod('acceptDataFromRenderjs',{  
                content:this.content  
            }) */  
            // 需要注意的是:只有通过在template中用户手动操作触发renderjs的方法参数是这两个:event, ownerInstance;通过其他方法触发的函数参数不一样  
        }  

    }  
}  

</script>


我这边今天也出现lang="renderjs"处理map 地图出现白屏问题

我这边也出现同样问题,报错是找不到renderjs中的方法,测试是发现在nvue中renderjs没有触发生命周期,后面换成vue,问题解决,能正常触发生命周期

uni-app 中使用 renderjs 打包 wgt 包后,遇到 :change 导致白屏的问题,可能是由于 renderjswgt 包在某些环境下的兼容性问题导致的。以下是一些可能的原因和解决方案:

1. 检查 renderjs 的兼容性

  • renderjsuni-app 提供的一种在 webview 中运行 JavaScript 的机制,但它可能在某些环境下(尤其是打包成 wgt 包后)存在兼容性问题。
  • 确保你使用的 renderjs 代码在 wgt 包中能够正常运行。可以尝试简化 renderjs 代码,逐步排查问题。

2. 检查 :change 事件的处理

  • :change 事件可能会导致某些状态变化或 DOM 操作,这些操作在 wgt 包中可能无法正确处理。
  • 确保 :change 事件处理函数中没有可能导致白屏的操作,比如频繁的 DOM 操作、异步操作未正确处理等。

3. 调试 wgt

  • wgt 包中,console.log 可能无法正常输出,因此可以使用 uni.showToastuni.showModal 来调试代码,查看 :change 事件是否被触发,以及触发后的状态变化。

4. 使用 v-ifv-show 替代 :change

  • 如果 :change 事件导致白屏,可以尝试使用 v-ifv-show 来控制组件的显示和隐藏,避免直接使用 :change

5. 检查 wgt 包的打包配置

  • 确保 wgt 包的打包配置正确,尤其是 manifest.json 中的配置项。某些配置项可能会影响 renderjs 的运行。

6. 更新 uni-app 版本

  • 如果你使用的是较旧版本的 uni-app,尝试更新到最新版本,可能会修复一些已知的兼容性问题。

7. 真机调试和安卓运行正常

  • 由于在真机调试和安卓运行均正常,说明问题可能出在 wgt 包的打包过程或运行环境上。可以尝试在不同的设备或模拟器上运行 wgt 包,看看问题是否依然存在。

8. 使用 uni-app 官方社区或论坛

  • 如果以上方法都无法解决问题,可以在 uni-app 官方社区或论坛上寻求帮助,可能会有其他开发者遇到过类似的问题。

示例代码

假设你有一个 input 组件,使用了 :change 事件:

<template>
  <input :value="value" @change="handleChange" />
</template>

<script>
export default {
  data() {
    return {
      value: ''
    };
  },
  methods: {
    handleChange(event) {
      this.value = event.target.value;
      // 其他操作
    }
  }
};
</script>

如果 :change 导致白屏,可以尝试使用 v-model 替代:

<template>
  <input v-model="value" />
</template>

<script>
export default {
  data() {
    return {
      value: ''
    };
  }
};
</script>
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!