uni-app 路由跳转之前开启loading,跳转后没有将this.isLoading置为false但loading框自动关闭了
uni-app 路由跳转之前开启loading,跳转后没有将this.isLoading置为false但loading框自动关闭了
| 开发环境 | 版本号 | 项目创建方式 | 
|---|---|---|
| Windows | win11 | HBuilderX | 
操作步骤:
- 从任务列表页面点击任一任务,跳转至设备列表页
预期结果:
- 从任务列表页点击任务,到跳转设备列表数据加载完毕,这一整个过程都需要展示loading框
实际结果:
- loading框仅出现1-2秒后自动关闭,此时设备列表页面数据尚未加载完,页面显示【数据为空】
bug描述:
路由之前代码:
toDetail (checkTask) {  
  console.log("toDetail", checkTask);  
  this.isLoading = true;  
  uni.navigateTo({ url: '/pages/work/inspection/equipList?taskId=' + checkTask.taskId + '&taskType=' + checkTask.taskType + '&taskStatus=' + checkTask.taskStatus + '&taskName=' + checkTask.taskName })      
},
目标页面代码:
onLoad (params) {  
  this.taskId = params.taskId  
  this.taskType = params.taskType  
  this.taskStatus = params.taskStatus  
  this.title = params.taskName  
  // this.loadData();  
  var barcodeModel = uni.requireNativePlugin("iData-BarcodePlugin-BarcodeModule");  
  //接口initScan(UniJSCallback callback)  
  barcodeModel.initScan((ret) => {  
      uni.showToast({  
          message: ret,  
          duration: 1.5  
      });  
  });  
  /* //获取扫码结果  
  var globalEvent = uni.requireNativePlugin('globalEvent');  
  globalEvent.addEventListener('iDataBarcodeEvent', (e) => {  
      let equipNo = e.barcode.substring(0, e.barcode.indexOf("|"));  
      this.checkScanCode(equipNo);  
  }); */  
},  
onShow() {  
  this.loadData();  
  // 页面显示时添加扫码事件监听  
  this.addBarcodeEventListener();  
},  
// 加载设备列表  
loadData () {  
  const app = this;  
  let params = {  
            'scTaskId': app.taskId,  
            'pageSize': 1000,  
          }  
  InspectionApi.listTaskMemu(params).then(response => {  
  app.equipList = response.rows.sort((item1, item2) => item1.checked > item2.checked ? 1 : -1);  
  app.list = app.equipList;  
  var finishList = app.equipList.filter(item => {return item.checked !== '0'});  
  app.enableCommit = finishList.length === app.equipList.length;  
  });  
},
更多关于uni-app 路由跳转之前开启loading,跳转后没有将this.isLoading置为false但loading框自动关闭了的实战教程也可以访问 https://www.itying.com/category-93-b0.html
值得一提的是,用内置浏览器运行时是OK的。只有在真机运行会出现这个问题,而且100%必现。
更多关于uni-app 路由跳转之前开启loading,跳转后没有将this.isLoading置为false但loading框自动关闭了的实战教程也可以访问 https://www.itying.com/category-93-b0.html
意思是在 app 上,跳转页面自动关闭了 loading,但是 web 上没有。你可以先尝试在目标页面打开 loading
回复 DCloud_UNI_LXH: 试过了,效果是一样的
回复 DCloud_UNI_LXH: 是的,在this.loadData(); 之前再次打开loading没有反应,和没加的效果一样,也是跳转页面立马就关闭loading
回复 DCloud_UNI_LXH: 大佬要是有空的话加我qq,帮忙远程调试一下看看吧
回复 海公牛: 603308791
回复 海公牛: 简化你的逻辑,麻烦新建一个模板复现一下你的问题,然后把模板上传上来
回复 DCloud_UNI_LXH: 新建模板,是需要我把关键代码上传上来的意思吗?
回复 海公牛: 把新建的那个 demo 项目上传上来,用最简单的代码来复现你的 Bug
在 uni-app 中进行路由跳转时,如果你在跳转之前开启了 loading 框,但在跳转之后没有手动将 this.isLoading 置为 false,但 loading 框仍然自动关闭了,可能是由于以下原因:
1. 页面跳转导致的页面生命周期变化
- 在 uni-app 中,页面跳转会触发页面的生命周期函数。例如,onHide或onUnload会在页面跳转时触发。
- 如果 loading 框是基于页面生命周期的某些条件(如 this.isLoading)来显示的,页面跳转后,页面的生命周期变化可能导致 loading 框自动关闭。
2. 异步操作的完成
- 如果你在跳转前开启了 loading 框,并且跳转后的操作是异步的(如网络请求),但你没有在异步操作完成后将 this.isLoading置为false,可能会导致 loading 框在某些情况下自动关闭。例如,某些 UI 库可能会在异步操作完成后自动关闭 loading 框。
3. uni-app 的路由机制
- uni-app 的路由跳转是同步的,跳转后当前页面的生命周期会立即触发,这可能导致 loading 框自动关闭。
解决方法:
确保在跳转后手动关闭 loading 框,或者在页面生命周期函数中处理 this.isLoading 的状态。
示例代码:
methods: {
  navigateToPage() {
    // 开启 loading
    this.isLoading = true;
    uni.showLoading({
      title: '加载中...',
      mask: true
    });
    // 模拟异步操作
    setTimeout(() => {
      // 跳转页面
      uni.navigateTo({
        url: '/pages/targetPage/targetPage',
        success: () => {
          // 跳转成功后关闭 loading
          this.isLoading = false;
          uni.hideLoading();
        },
        fail: () => {
          // 跳转失败时关闭 loading
          this.isLoading = false;
          uni.hideLoading();
        }
      });
    }, 1000);
  }
}
在页面生命周期中处理:
onHide() {
  // 页面隐藏时关闭 loading
  this.isLoading = false;
  uni.hideLoading();
},
onUnload() {
  // 页面卸载时关闭 loading
  this.isLoading = false;
  uni.hideLoading();
} 
        
       
                     
                   
                    


