Можно ли удалить прослушиватель событий с предпочтительной цветовой схемой в Vue?

#vue.js #removeeventlistener

#vue.js #removeeventlistener

Вопрос:

Я пытаюсь сделать что-то очень простое, но почему-то это не работает. Когда компонент удаляется, я хочу удалить evenListener, но почему-то это не работает. Может ли кто-нибудь указать мне правильное направление?

Вот упрощенная версия моего компонента:

 <template>
  <child-component :dark="darkModeEnabled" />
</template>

<script>
export default {
  data () {
    return {
      darkModeEnabled: window.matchMedia('(prefers-color-scheme: dark)').matches
    }
  },
  mounted () {
    this.$nextTick(() => {
      window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', this.setDarkMode)
    })
  },
  beforeDestroy () {
    window.matchMedia('(prefers-color-scheme: dark)').removeEventListener('change', this.setDarkMode)
  },
  methods: {
    setDarkMode ({ matches }) {
      this.darkModeEnabled = matches
    }
  }
}
</script>```
  

Ответ №1:

Ваш код не работает, потому что вы добавляете и удаляете разные MediaQueryList объекты.

 ...
  mounted () {
    this.mediaQueryList = window.matchMedia('(prefers-color-scheme: dark)')
    this.$nextTick(() => {
      this.mediaQueryList.addEventListener('change', this.setDarkMode)
    })
  },

  beforeDestroy () {
    this.mediaQueryList.removeEventListener('change', this.setDarkMode)
  }
...
  

JSFiddle

Комментарии:

1. Это была глупая ошибка с моей стороны! Спасибо, что указали на это! Теперь он работает отлично. 🙂