Error Not Found Page[3][-1,22] at view.umd.min.js:1

Error Not Found Page[3][-1,22] at view.umd.min.js:1

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

示例代码:

return new Promise((resolve, reject) => {  
    setTimeout(() => {  
        console.log('11111111');  

        try {  
            const query = uni.createSelectorQuery().in(this).select(`#${this.grid_id}`);  
            console.log('22222222222222');  
            query.boundingClientRect(data => {  
                console.log('获取元素尺寸');  
                console.log(data);  
                if (data.width) {  
                    resolve(data);  
                } else {  
                    reject();  
                }  
            }).exec();  

            console.log('33333333333333333');  
        } catch (error) {  
            console.error(error);  
        }  

        console.log('44444444444444');  
    }, 100);  
})

操作步骤:

如上所述

预期结果:

获取节点尺寸

实际结果:

无法获取并报错


2 回复

经过无数次测试发现,打开登录页面登录成功后,如果用uni.$emit()传递参数,数据页面使用uni.$on()接收参数并赋值登录状态,这种情况就会引起报错。
如果在onShow()里面用本地缓存判断登录状态并赋值,不会报错。
实在是无语了,折腾了不知道几天几夜,总是遇到这种奇葩问题,也不知道该说你们的技术好还是坏了…


这是一个典型的异步时序问题。错误提示表明在视图渲染完成前就尝试获取节点信息,导致无法找到对应元素。

主要问题分析:

  1. setTimeout 100ms 可能不足以确保组件完全渲染
  2. 在组件挂载初期,DOM 节点可能尚未创建或渲染完成
  3. createSelectorQuery 在节点不存在时会报错

解决方案:

// 方法1:使用 nextTick 确保 DOM 更新完成
return new Promise((resolve, reject) => {
  this.$nextTick(() => {
    try {
      const query = uni.createSelectorQuery().in(this).select(`#${this.grid_id}`);
      query.boundingClientRect(data => {
        if (data && data.width) {
          resolve(data);
        } else {
          reject(new Error('元素未找到或宽度为0'));
        }
      }).exec();
    } catch (error) {
      console.error('获取节点尺寸失败:', error);
      reject(error);
    }
  });
});
// 方法2:增加重试机制
const getElementSize = (retryCount = 3) => {
  return new Promise((resolve, reject) => {
    const tryGetRect = (attempt) => {
      const query = uni.createSelectorQuery().in(this).select(`#${this.grid_id}`);
      query.boundingClientRect(data => {
        if (data && data.width) {
          resolve(data);
        } else if (attempt < retryCount) {
          setTimeout(() => tryGetRect(attempt + 1), 50);
        } else {
          reject(new Error('无法获取元素尺寸'));
        }
      }).exec();
    };
    tryGetRect(0);
  });
};
回到顶部