uni-app 新版HBuilder工具 在topWindow中使用match-media就会报错
uni-app 新版HBuilder工具 在topWindow中使用match-media就会报错
产品分类
uniapp/H5
开发环境信息
项目 | 信息 |
---|---|
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | win11 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.44 |
浏览器平台 | Chrome |
浏览器版本 | 131.0.6778.205 |
项目创建方式 | HBuilderX |
示例代码
top.vue:
<template>
<view class="page-responsive-top">
<view>
<!--宽屏菜单-->
<match-media :min-width="1025">
<view>
宽屏菜单
</view>
</match-media>
<!--窄屏菜单-->
<match-media :min-width="0" :max-width="1024">
<view>窄屏菜单</view>
</match-media>
</view>
</view>
</template>
操作步骤
报 uni-match-media 53行有问题
预期结果
报 uni-match-media 53行有问题
实际结果
报 uni-match-media 53行有问题
bug描述
HBuilder 4.29版本及以前都没有问题,升级到最新4.36或4.44最新就会有这个问题。
有没有遇到同样问题的朋友?
可以提供一下可以复现的项目吗?
main.js:22 TypeError: Cannot read properties of undefined (reading ‘$page’) at new ServiceMediaQueryObserver (uni-h5.es.js:4701:30) at uni-h5.es.js:4737:10 at Module.createMediaQueryObserver (uni-h5.es.js:3075:15) at Proxy.mounted (uni-match-media.vue:53:30)
上传了一个测试项目,只要在h5框架top、left、right这个中,用到uni-match-media,就会提示报错,并且,这个uni-match-media组件 也不生效了。
11:55:12.559 [Vue warn]: Unhandled error during execution of app errorHandler 11:55:12.573 [TypeError] {message: “Cannot read properties of undefined (reading ‘$page’)”} 控制台报这个
上传了测试项目,能否帮忙看一下问题。
上传测试项目
报错截图
在uni-app的新版HBuilder工具中,如果在topWindow
中使用match-media
(通常是window.matchMedia
)功能时遇到报错,这可能是由于topWindow
环境的限制或者uni-app框架对window
对象的封装导致的。topWindow
在uni-app中通常指向原生窗口对象,但它在不同平台(如小程序、App等)上可能有不同的行为表现。
为了解决这个问题,我们可以尝试几种方法,但考虑到你要求尽量不给出建议,而是提供代码案例,我将给出一个如何在uni-app中安全使用matchMedia
的示例,并展示如何在遇到特定环境限制时处理。
示例代码
首先,我们需要一个检测函数来确认matchMedia
是否可用:
function isMatchMediaSupported() {
return typeof window !== 'undefined' && 'matchMedia' in window;
}
export default {
methods: {
checkMediaQuery() {
if (isMatchMediaSupported()) {
const mediaQueryList = window.matchMedia('(max-width: 600px)');
mediaQueryList.addListener((mql) => {
if (mql.matches) {
console.log('Viewport is 600px wide or less.');
} else {
console.log('Viewport is wider than 600px.');
}
});
// Initial check
this.handleMediaChange(mediaQueryList);
} else {
console.warn('matchMedia is not supported in this environment.');
// Fallback logic here, e.g., using uni-app's built-in responsive support
}
},
handleMediaChange(mql) {
if (mql.matches) {
console.log('Viewport matches query on load.');
} else {
console.log('Viewport does not match query on load.');
}
}
},
mounted() {
this.checkMediaQuery();
}
}
解释
- 检测支持:
isMatchMediaSupported
函数检查window
对象是否存在且matchMedia
方法是否可用。 - 媒体查询:在
checkMediaQuery
方法中,如果matchMedia
可用,则创建一个媒体查询列表并监听变化。 - 初始检查:在添加监听器后,立即进行一次初始的媒体查询匹配检查。
- 不支持时的处理:如果
matchMedia
不可用,则输出警告并可以添加备用逻辑(如使用uni-app的响应式支持)。
通过这种方式,你可以在uni-app中安全地使用matchMedia
,同时处理在不同环境中可能遇到的兼容性问题。