uni-app 多次切换页面后 subNVue.hide()事件无法关闭窗体内的内容

发布于 1周前 作者 eggper 来自 uni-app

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

11 回复

有没有人解决这个问题啊?返回时只有遮罩层关闭了,弹出框还在呢,着急啊


解决了吗你

解决了吗,我也遇到了

你好。怎么解决。现在也是页面多次跳转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()事件能够正确关闭窗体内的内容。

回到顶部