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最新就会有这个问题。
有没有遇到同样问题的朋友?
更多关于uni-app 新版HBuilder工具 在topWindow中使用match-media就会报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html
可以提供一下可以复现的项目吗?
更多关于uni-app 新版HBuilder工具 在topWindow中使用match-media就会报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html
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,同时处理在不同环境中可能遇到的兼容性问题。
        
      
                    
                  
                    
