uni-app 新版HBuilder工具 在topWindow中使用match-media就会报错

发布于 1周前 作者 eggper 来自 Uni-App

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最新就会有这个问题。
有没有遇到同样问题的朋友?


8 回复

可以提供一下可以复现的项目吗?


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();
    }
}

解释

  1. 检测支持isMatchMediaSupported函数检查window对象是否存在且matchMedia方法是否可用。
  2. 媒体查询:在checkMediaQuery方法中,如果matchMedia可用,则创建一个媒体查询列表并监听变化。
  3. 初始检查:在添加监听器后,立即进行一次初始的媒体查询匹配检查。
  4. 不支持时的处理:如果matchMedia不可用,则输出警告并可以添加备用逻辑(如使用uni-app的响应式支持)。

通过这种方式,你可以在uni-app中安全地使用matchMedia,同时处理在不同环境中可能遇到的兼容性问题。

回到顶部