uni-app APP版使用uni.reLaunch()时,出现页面不能立即跳转的问题。

uni-app APP版使用uni.reLaunch()时,出现页面不能立即跳转的问题。

类别 信息
产品分类 uniapp/App
PC开发环境 Windows
PC版本号 win10
HBuilderX类型 正式
HBuilderX版本 3.99
手机系统 Android
手机系统版本 Android 8.0
手机厂商 华为
手机机型 P10
页面类型 vue
vue版本 vue3
打包方式 离线
项目创建方式 HBuilderX

操作步骤:

<template>
//...
</template>
<script>
export default {
data() {
return {
tableData: [],
};
},
mounted() {  
    this.checkUserRole(); // 在页面加载时检查用户角色  
},  

methods: {  
    checkUserRole() {  
        const ruler = uni.getStorageSync('ruler');  
        console.log("当前用户的ruler", ruler);   
        if (ruler === '一般用户') {    // 如果是一般用户,跳转到首页  
            uni.reLaunch({  
                url: '/pages/index/index' // 跳转到首页  
            })  

        } else if (ruler === '管理员') {    // 如果是管理员,获取用户数据  
            this.getUser();  
        } else {    // 其他情况(ruler为空或未定义),也跳转到首页  
            uni.reLaunch({  
                url: '/pages/index/index' // 跳转到首页  
            })  
        }  
    },              
    async getUser() {  
//...

预期结果:

<template>
//...
</template>
<script>
export default {
data() {
return {
tableData: [],
};
},
mounted() {  
    this.checkUserRole(); // 在页面加载时检查用户角色  
},  

methods: {  
    checkUserRole() {  
        const ruler = uni.getStorageSync('ruler');  
        console.log("当前用户的ruler", ruler);   
        if (ruler === '一般用户') {    // 如果是一般用户,跳转到首页  
            uni.reLaunch({  
                url: '/pages/index/index' // 跳转到首页  
            })  

        } else if (ruler === '管理员') {    // 如果是管理员,获取用户数据  
            this.getUser();  
        } else {    // 其他情况(ruler为空或未定义),也跳转到首页  
            uni.reLaunch({  
                url: '/pages/index/index' // 跳转到首页  
            })  
        }  
    },              
    async getUser() {  
//...

实际结果:

<template>
//...
</template>
<script>
export default {
data() {
return {
tableData: [],
};
},
mounted() {  
    this.checkUserRole(); // 在页面加载时检查用户角色  
},  

methods: {  
    checkUserRole() {  
        const ruler = uni.getStorageSync('ruler');  
        console.log("当前用户的ruler", ruler);   
        if (ruler === '一般用户') {    // 如果是一般用户,跳转到首页  
            uni.reLaunch({  
                url: '/pages/index/index' // 跳转到首页  
            })  

        } else if (ruler === '管理员') {    // 如果是管理员,获取用户数据  
            this.getUser();  
        } else {    // 其他情况(ruler为空或未定义),也跳转到首页  
            uni.reLaunch({  
                url: '/pages/index/index' // 跳转到首页  
            })  
        }  
    },              
    async getUser() {  
//...

bug描述:

uni-app项目.vue页面代码片段:

<template>
//...
</template>
<script>
export default {
data() {
return {
tableData: [],
};
},
mounted() {  
    this.checkUserRole(); // 在页面加载时检查用户角色  
},  

methods: {  
    checkUserRole() {  
        const ruler = uni.getStorageSync('ruler');  
        console.log("当前用户的ruler", ruler);   
        if (ruler === '一般用户') {    // 如果是一般用户,跳转到首页  
            uni.reLaunch({  
                url: '/pages/index/index' // 跳转到首页  
            })  

        } else if (ruler === '管理员') {    // 如果是管理员,获取用户数据  
            this.getUser();  
        } else {    // 其他情况(ruler为空或未定义),也跳转到首页  
            uni.reLaunch({  
                url: '/pages/index/index' // 跳转到首页  
            })  
        }  
    },              
    async getUser() {  
//...

以上代码实现在页面加载时先检查用户角色,如果是 ‘一般用户’,执行:url: ‘/pages/index/index’ // 跳转到首页。

在网页H5版的实际测试跳转正常,但在APP版测试后,发现当程序检查到用户是 '一般用户’时,界面并没有马上切换到首页,而是短暂的显示了本页面的<template>界面,然后界面才切换到首页,

然后使用beforeMount生命周期钩子来检查用户角色:

beforeMount() {
this.checkUserRole();
},

问题仍然存在,后又修改为:

setTimeout(() => {
uni.reLaunch({
url: '/pages/index/index' // 跳转到首页
});
}, 0); // 延迟0毫秒,即在下一个事件循环中执行跳转

问题仍然没有解决,请问以上现象是啥原因造成的,在结构上应该如何修改。


更多关于uni-app APP版使用uni.reLaunch()时,出现页面不能立即跳转的问题。的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app APP版使用uni.reLaunch()时,出现页面不能立即跳转的问题。的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在 uni-app 中使用 uni.reLaunch() 进行页面跳转时,如果出现页面不能立即跳转的问题,可能是由于以下几个原因导致的。以下是一些可能的解决方案:

1. 异步操作未完成

  • 如果你在调用 uni.reLaunch() 之前有异步操作(如网络请求、定时器等),可能会导致页面跳转延迟。确保在异步操作完成后再调用 uni.reLaunch()
  • 例如:
    someAsyncFunction().then(() => {
        uni.reLaunch({
            url: '/pages/newPage/newPage'
        });
    });
    

2. 页面生命周期钩子

  • 如果你在页面的生命周期钩子(如 onLoadonShow)中执行了耗时操作,可能会导致页面跳转延迟。确保这些钩子中的操作尽快完成。
  • 例如:
    onLoad() {
        // 避免在生命周期钩子中执行耗时操作
        this.loadData();
    }
    

3. 页面渲染阻塞

  • 如果页面中有复杂的渲染逻辑或大量的 DOM 操作,可能会导致页面跳转延迟。优化页面渲染逻辑,减少不必要的 DOM 操作。
  • 例如:
    // 避免在页面中频繁操作 DOM
    this.dataList = newDataList;
    

4. 页面跳转冲突

  • 如果你在短时间内多次调用 uni.reLaunch() 或其他页面跳转方法,可能会导致跳转冲突。确保在跳转完成前不要重复调用跳转方法。
  • 例如:
    let isJumping = false;
    if (!isJumping) {
        isJumping = true;
        uni.reLaunch({
            url: '/pages/newPage/newPage',
            complete() {
                isJumping = false;
            }
        });
    }
    

5. 页面缓存

  • 如果目标页面已经被缓存,可能会导致跳转延迟。可以尝试在跳转前清除页面缓存。
  • 例如:
    uni.reLaunch({
        url: '/pages/newPage/newPage',
        success() {
            uni.removeStorageSync('pageCache');
        }
    });
    

6. 调试工具

  • 使用调试工具(如 Chrome DevTools)检查是否有其他 JavaScript 错误或性能瓶颈导致页面跳转延迟。

7. uni-app 版本问题

  • 确保你使用的 uni-app 版本是最新的,旧版本可能存在一些已知的 bug。可以尝试升级 uni-app 到最新版本。

8. 页面跳转动画

  • 如果你在跳转时使用了页面跳转动画,可能会导致跳转延迟。可以尝试禁用跳转动画。
  • 例如:
    uni.reLaunch({
        url: '/pages/newPage/newPage',
        animationType: 'none',
        animationDuration: 0
    });
回到顶部