uni-app 多次切换页面后 subNVue.hide()事件无法关闭窗体内的内容
uni-app 多次切换页面后 subNVue.hide()事件无法关闭窗体内的内容
产品分类
uniapp/App
示例代码:
const subNVue = uni.getSubNVueById('indexPlay');
subNVue.hide('slide-in-right',200);
操作步骤:
const subNVue = uni.getSubNVueById('indexPlay');
subNVue.hide('slide-in-right',200);
预期结果:
const subNVue = uni.getSubNVueById('indexPlay');
subNVue.hide('slide-in-right',200);
实际结果:
const subNVue = uni.getSubNVueById('indexPlay');
subNVue.hide('slide-in-right',200);
bug描述:
subNue 跳转返回无法隐藏,uni.getSubNVueById(‘indexPlay’);能获取到,却无法隐藏
1、多次切换页面后,自定义subNVue.hide()事件无法关闭窗体内的内容;
2、将subNVue.hide()事件改为 subNVue.close()可将窗体关闭,但多次切换后窗体无法弹出显示,
返回值为:TypeError: null is not an object (evaluating ‘subNVue.show’)
多个页面跳转到带subNvue页面 存在的各种问题(包括遮罩),根本问题就是多次跳转带subNvue页面会不停创建实例,第2次跳转后当前页面无法访问自己的subnvue,上一个也没销毁不了.即使用redirectTo 也不会销毁上一个subnvue创建的实例.不停的创建,抓紧修复吧,这么严重的BUG 导致根本无法使用
开发环境信息
类别 | 信息 |
---|---|
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | 10 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 3.1.22 |
手机系统 | Android |
手机系统版本号 | Android 8.0 |
手机厂商 | 华为 |
手机机型 | ATU-AL10 |
页面类型 | vue |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
有没有人解决这个问题啊?返回时只有遮罩层关闭了,弹出框还在呢,着急啊
解决了吗你
解决了吗,我也遇到了
你好。怎么解决。现在也是页面多次跳转nuve被多次打开了。导致uni.$on监听到多个,执行了多次。。。
这问题还没解决吗
在社区看到了一种解决方案:subNvue所在父窗体的unLoad方法中,调一下subNvue的close方法,这个close是webview的方法,感觉每次打开页面subNvue都重复创建了,导致hide无法操作到每一个窗口
回复 ddpapa:调用close虽然可以关闭,但再次show的时候打不开了,因为找不到对应的id了。所以无解了
都2024年了,怎么这个问题还在呀。
relaunch 之后,subNVue就隐藏不掉了
哈哈
const subNVue = uni.getCurrentSubNVue();
subNVue.close();
试了下这个方法可以解决
在uni-app开发中,使用subNVue
窗口时,确实可能会遇到多次切换页面后subNVue.hide()
事件无法正确关闭窗体内内容的问题。这通常是由于页面栈管理不当或subNVue
窗口的生命周期管理不正确导致的。下面提供一个示例代码,展示如何正确管理subNVue
窗口,确保在多次切换页面后能够正确隐藏窗体内的内容。
首先,确保在全局或页面脚本中正确初始化和管理subNVue
实例。以下是一个简化的示例:
// main.js 或 app.js
const subNVue = uni.createSubNVue({
url: 'subNVuePage/subNVuePage.vue', // subNVue页面的路径
id: 'subNVue',
style: {
top: '0px',
bottom: '0px'
}
});
// 显示subNVue窗口
function showSubNVue() {
subNVue.show();
}
// 隐藏subNVue窗口
function hideSubNVue() {
subNVue.hide(() => {
console.log('subNVue已隐藏');
});
}
// 监听页面显示事件,确保在返回页面时能正确管理subNVue
uni.onPageShow((res) => {
if (res.type === 'back' && isSubNVueShouldBeHidden()) {
hideSubNVue();
}
});
// 自定义逻辑判断是否需要隐藏subNVue
function isSubNVueShouldBeHidden() {
// 根据实际情况添加逻辑,比如根据当前页面路径等
return true; // 示例:总是隐藏
}
// 在需要的地方调用显示或隐藏函数
// 例如,在某个页面的onLoad中调用showSubNVue()
在subNVuePage.vue
中,确保页面内容能够响应隐藏操作:
<template>
<view>
<!-- subNVue页面的内容 -->
<text>这是subNVue窗口的内容</text>
</view>
</template>
<script>
export default {
onHide() {
console.log('subNVue页面被隐藏');
// 可以在这里执行一些清理工作,比如停止定时器、取消网络请求等
}
}
</script>
上述代码示例中,我们创建了一个subNVue
实例,并提供了显示和隐藏该窗口的函数。通过监听uni.onPageShow
事件,我们可以在用户通过返回操作回到某个页面时,根据自定义逻辑决定是否隐藏subNVue
窗口。同时,在subNVuePage.vue
中,我们定义了onHide
生命周期函数,以便在窗口被隐藏时执行一些清理工作。
这种管理方式可以确保在多次切换页面后,subNVue.hide()
事件能够正确关闭窗体内的内容。