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()里面用本地缓存判断登录状态并赋值,不会报错。
实在是无语了,折腾了不知道几天几夜,总是遇到这种奇葩问题,也不知道该说你们的技术好还是坏了…
这是一个典型的异步时序问题。错误提示表明在视图渲染完成前就尝试获取节点信息,导致无法找到对应元素。
主要问题分析:
setTimeout100ms 可能不足以确保组件完全渲染- 在组件挂载初期,DOM 节点可能尚未创建或渲染完成
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);
});
};

