使用 matchMedia 函数计算 属性 Vue.js

Computed property with matchMedia function Vue.js

我在 Vue 的计算 属性 中编写的 matchMedia 函数有一些问题。问题是当我load/refresh页面时,该功能不起作用。 只有在我在浏览器的响应式设计模式下调整屏幕大小后,它才恢复工作。

这里是我的代码 app.js

     computed: {
        widthChange() {
            if (matchMedia) {
                    var mqT = window.matchMedia(" (max-width: 850px) and (min-width: 600px) ")

                    function changeWidthT(mqT) {
                    const sectionRight = document.querySelector(".section-right")
                    if (mqT.matches) {
                        sectionRight.classList.remove("col-7")
                    }
                    else {
                        sectionRight.classList.add("col-7")
                    }
                }

                mqT.addListener(changeWidthT)
            }
        }
    },

我在页面的父级内部调用计算的 属性

<div class="frontpage-parent" :class="widthChange">...
</div>

您是否尝试过在挂载的钩子中调用 widthChange() 以便它在加载时运行?

编辑 尝试将 const tst = this.widthChange; 放在挂钩

您在此处滥用 computed 属性。他们应该是吸气剂,这意味着他们只是 return 准备起诉价值。您实际上是在此处附加事件侦听器。

相反,您需要使用数据属性并在 mounted 钩子中初始化您的侦听器:

export default {
  name: 'Blah',
  data () {
    const tabletViewQuery = matchMedia('...')
    return {
      tabletViewQuery: tabletViewQuery.
      tabletView: tableViewQuery.matches,
    }  
  },
  mounted () {
     this.tabletViewQuery.addListener(() => {
       this.tabletView = tableViewQuery.matches
     }
  }
}

并在 table:

中使用它
<div class="section-right" :class="{ 'col-7': tabletView }">

但是,可能更简洁的解决方案是使用 vue-match-media 插件。

一年后,我做了一个小调整,使其在 Vuejs 中工作,用于 mobile/desktop 目的:

computed: {
...
...
      widthChange() {
        if (matchMedia) {
          const matchMediaQuery = window.matchMedia(" (max-width: 1024px) ")
          const changeWidthT = (matchMediaQuery) => {
            this.isMobileExperience = matchMediaQuery.matches ? true : false;
          }
          mqT.addListener(changeWidthT)
        }
      }
    },
    mounted() { 
      const awakeResizeListener = this.widthChange;
    },
...
...

通过 v-ifv-else 评估 isMobileExperience 数据选项,您可以很好地调整大小。

希望对大家有所帮助

matchMedia 在具有反应性的 Vue 中

上述答案对我不起作用。通过将已弃用的 addListener 替换为 change 事件改进了 BroiSatse 的回答,如 https://developer.mozilla.org/en-US/docs/Web/API/MediaQueryList

中所述

Vue 选项 API 使用 Typescript 示例:

data(): { mediaQuery: MediaQueryList; isTablet: boolean; } {
    const mediaQuery = window.matchMedia('(max-width: 1024px)');

    return {
        mediaQuery,
        isTablet: mediaQuery.matches
    };
},
mounted(): void {
    this.mediaQuery.addEventListener('change', () => {
        this.isTablet = this.mediaQuery.matches;
    });
}