uni-app 疑似uni.navigateBack当delta大于1引起的bug

uni-app 疑似uni.navigateBack当delta大于1引起的bug

开发环境 版本号 项目创建方式
Windows win10 HBuilderX

操作步骤:

A跳转B再跳转C,在C页通过uni.navigateBack并指定delta为2跳转到A,重复二次以上

预期结果:

C跳转A时应销毁B页,且避免当多次跳转A->B->C时页面栈存在重复的B

实际结果:

let pages = getCurrentPages()  
pages.map(p=>p.route)//['portal/page', 'pagesB/view/index/index', 'pagesB/view/index/index', 'pagesB/view/index/index','pagesB/view/index/index', 'pagesB/view/lists']

更多关于uni-app 疑似uni.navigateBack当delta大于1引起的bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

运行到 web 上,没有复现你所说的问题,从 C back 到 A 时,页面栈中的数量一直到是 1 ,只有 A 页面。请提供一个可复现的最小 demo

更多关于uni-app 疑似uni.navigateBack当delta大于1引起的bug的实战教程也可以访问 https://www.itying.com/category-93-b0.html


我也需要了同样的问题 a=>b=>c 然后 navigateBack delta:2 到a ,再次 a=>b=>c ,此时在页面栈中有两个b

我们也遇到了,反复来回跳转,导致navigateBack无效,没反应 uni.navigateBack({ //返回首页 delta: 1000, success: () => {
},
fail(err) {

                },  
                complete() {  

                }  
            });<br>

使用最新版 alpha 测试 vue2、vue3 平台多次,均未复现问题

遇到了同样的问题 最新版本

web环境

回复 5***@qq.com: vue2

在使用 uni-app 开发时,uni.navigateBack 是一个常用的 API,用于返回到之前的页面。delta 参数用于指定返回的层级数。例如,delta: 2 表示返回上两级页面。

然而,在某些情况下,当 delta 大于 1 时,可能会遇到一些潜在的问题或 Bug。以下是可能导致问题的一些原因以及解决方法:

1. 页面栈管理问题

  • 问题描述:当 delta 大于 1 时,uni.navigateBack 会尝试一次性返回多个页面。如果页面栈中的页面数量不足,或者页面栈的状态不一致,可能会导致页面跳转异常或页面无法正确返回。

  • 解决方法:在使用 uni.navigateBack 时,确保 delta 的值不超过当前页面栈中的页面数量。可以通过 getCurrentPages() 方法获取当前页面栈的长度,并根据实际情况动态设置 delta

    const pages = getCurrentPages();
    const delta = Math.min(delta, pages.length - 1);
    uni.navigateBack({ delta });
    

2. 页面生命周期问题

  • 问题描述:当 delta 大于 1 时,返回的多个页面可能会触发多个页面的生命周期事件(如 onUnload, onShow 等)。如果这些生命周期事件中有复杂的逻辑处理,可能会导致页面状态不一致或出现意外行为。

  • 解决方法:在页面的生命周期事件中,确保逻辑处理是幂等的,或者在使用 uni.navigateBack 时,避免一次性返回过多的页面。可以考虑分多次返回,或者使用 uni.reLaunchuni.switchTab 等方法来替代。

    // 分多次返回
    for (let i = 0; i < delta; i++) {
      uni.navigateBack();
    }
    

3. 页面数据传递问题

  • 问题描述:当 delta 大于 1 时,返回的页面可能会涉及到多个页面之间的数据传递。如果数据传递逻辑不严谨,可能会导致数据丢失或页面状态不一致。

  • 解决方法:确保在页面跳转时,数据传递是可靠的。可以使用全局变量、Vuex 状态管理、或者通过 URL 参数等方式来传递数据。

    // 使用 Vuex 管理数据
    store.commit('setData', data);
    uni.navigateBack({ delta });
    

4. 跨平台兼容性问题

  • 问题描述uni.navigateBack 在不同平台(如微信小程序、H5、App 等)上的行为可能略有差异。当 delta 大于 1 时,某些平台可能会表现出不同的行为,导致 Bug。

  • 解决方法:在开发时,建议在不同平台上进行充分测试,并根据平台差异调整代码逻辑。可以使用条件编译来处理不同平台的特殊情况。

    // #ifdef H5
    uni.navigateBack({ delta: 1 });
    // #endif
    // #ifdef MP-WEIXIN
    uni.navigateBack({ delta });
    // #endif
    

5. 页面缓存问题

  • 问题描述:在某些情况下,页面可能会被缓存,导致返回时页面状态不正确。当 delta 大于 1 时,多个页面的缓存状态可能会相互影响。

  • 解决方法:可以在页面跳转时手动清除页面缓存,或者通过 onUnload 事件来清理页面状态。

    onUnload() {
      // 清理页面状态
    }
回到顶部