Как изменить значение данных vue.js при изменении размера экрана?

<div id="app">
    <ul>
        <!-- On mobile devices use short heading -->
        <template v-if="mobile == 1">
            <li><a href="#">Heading</a></li>
        </template>
        <!-- Else use long heading -->
        <template v-else-if="mobile == 0">
            <li><a href="#">Heading Long</a></li>
        </template>
    </ul>
</div>

<script src="https://unpkg.com/vue@2.1.10/dist/vue.js"></script>
<script>
    var app = new Vue({
            el: '#app',
            data: {
                mobile: 0
            }
});

Я ищу способ изменить значение "mobile", когда становится активной точка останова экрана (max-width: 547px). И вернуть его обратно, когда эта мобильная точка останова станет неактивной (экран превышает 547 пикселей). Обычно я использую skel ( https://github.com/ajlkn/skel) для работы с точками останова экрана, но не могу получить доступ к skel из Vue или наоборот. Я бы отказался от использования Vue для этой конкретной задачи, но display: none и display: block отбрасывает мою презентацию - превращая мой элемент в блок.

2 ответа

Решение

Проверьте эту библиотеку: https://github.com/apertureless/vue-breakpoints

<div id="app">
    <ul>
        <!-- On mobile devices use short heading -->
        <hide-at breakpoint="medium">
        <template v-if="mobile == 1">
            <li><a href="#">Heading</a></li>
        </template>
        </hide-at>
        <!-- Else use long heading -->
        <show-at breakpoint="mediumAndAbove">
        <template v-else-if="mobile == 0">
            <li><a href="#">Heading Long</a></li>
        </template>
        </show-at>
    </ul>
</div>

или просто пойти с media queries ( https://www.w3schools.com/css/css3_mediaqueries_ex.asp)

CSS:

@media screen and (max-width: 600px) {
    #app ul il:first-of-type {
        visibility: visible;
    }
    #app ul il:last-of-type {
        visibility: hidden;
    }
}


@media screen and (max-width: 992px) {
    #app ul il:first-of-type {
        visibility: hidden;
    }
    #app ul il:last-of-type {
        visibility: visible;
    }
}

Конечно, вам решать, что показывать и что скрывать на какой точке останова. Надеюсь, это поможет.

Если вы используете Vuetify, вы можете программно настроить значение данных на основе встроенного breakpointsof xs, sm, md, lg, xl (как указано в Material Design) следующим образом:

computed: {
  mobile() {
    return this.$vuetify.breakpoint.sm
  },
}

mobile изменится на true как только ширина экрана меньше 600 пикселей.

Тогда ваш код будет примерно таким (я также переместил if заявление быть прямо на <li> элемент):

<div id="app">
    <ul>
        <!-- On mobile devices use short heading -->
        <li v-if="mobile"><a href="#">Heading</a></li>
        <!-- Else use long heading -->
        <li v-else><a href="#">Heading Long</a></li>
    </ul>
</div>

Вы можете использовать событие onorientationchange следующим образом:

methods: {
  detectOrientationChange() {
   switch(window.orientation) {  
      case -90 || 90:
        // landscape
      this.mobile = false;
      break; 
      default:
        // portrait
        this.mobile = true;
        break; 
    }
  }
},
mounted() {
  this.$nextTick(()=>{
    window.addEventListener('onorientationchange', this.detectOrientationChange)
  }
},
created() {
  this.detectOrientationChange(); // when instance is created
}
Другие вопросы по тегам