Set reactive screen width with vuejs Set reactive screen width with vuejs vue.js vue.js

Set reactive screen width with vuejs


I don't think there's a way to do that unless you attach a listener on the window. You can add a property windowWidth on the component's data and attach the resize listener that modifies the value when the component is mounted.

Try something like this:

<template>    <p>Resize me! Current width is: {{ windowWidth }}</p></template<script>    export default {        data() {            return {                windowWidth: window.innerWidth            }        },        mounted() {            window.onresize = () => {                this.windowWidth = window.innerWidth            }        }    }</script>

Hope that helps!


If you are using multiple components with this solution, the accepted answer's resize handler function will update only the last component.

Then you should use this instead:

import { Component, Vue } from 'vue-property-decorator';@Componentexport class WidthWatcher extends Vue {   public windowWidth: number = window.innerWidth;   public mounted() {       window.addEventListener('resize', this.handleResize);   }   public handleResize() {       this.windowWidth = window.innerWidth;   }   public beforeDestroy() {       window.removeEventListener('resize', this.handleResize);   }}

source: https://github.com/vuejs/vue/issues/1915#issuecomment-159334432


You can also attach a class depending on the window width

<template>    <p :class="[`${windowWidth > 769 && windowWidth <= 1024 ? 'special__class':'normal__class'}`]">Resize me! Current width is: {{ windowWidth }}</p></template><script>export default {    data() {        return {            windowWidth: window.innerWidth        }    },    mounted() {        window.onresize = () => {            this.windowWidth = window.innerWidth        }    }}</script><style scoped>.normal__class{}.special__class{}</style>