Nuxt.JS не отображает блоки, как мне нужно

Я создаю веб-приложение Nuxt.js SSR, и у меня возникает странная проблема.

<div class = "container" @mouseenter = "hovered = true" @mouseleave = "hovered = false">
  <transition name = "fade">
    <div class = "class1" v-show = "!hovered && isDesktop">blank_1</div>
  </transition>
  <transition name='scale'>
    <div class = "class2" v-show = "hovered || !isDesktop">blank_2</div>
   </transition>
</div>

<script>
export default {
  data() {
    return {
      hovered: false
    }
  },
  computed: {
    isDesktop() {
      if (process.client) {             
        window.screen.width > 1024 ? return true : return false
      }
    }
  }
}
</script>

<style>
.class1 {
  height: 100px;
  width: 100px;
  background-color: red;
}
.class2 {
  height: 100px;
  width: 100px;
  background-color: blue;
}
</style>

Я объясню это несколькими шагами.

  1. Позвольте мне объяснить, как это должно работать:
    • Div с class = "class1" по умолчанию должен отображаться на рабочем столе и исчезать при наведении курсора на контейнер. На мобильном устройстве его нужно скрывать каждый раз.
    • Div с class = "class2" должен быть скрыт на рабочем столе и появляться при наведении курсора на контейнер. На мобильном устройстве он должен отображаться каждый раз.
  2. Позвольте мне объяснить, как это работает сейчас:
    1. Рабочий стол:
      • Div с class = "class1" не отображается, пока я не наведу контейнер один раз, а затем работает должным образом
      • Div с class = "class2" работает как надо.
    2. Мобильный:
      • Div с class = "class1" работает как надо.
      • Div с class = "class2" работает как надо.
  3. Как я это исправил:
    • После нескольких часов попыток я просто понял, что могу переписать v-show на первом div на v-show = "!hovered" и установить медиа-запрос на экране мобильного display:none;. Итак, я исправил единственную проблему с рабочим столом, которая у меня была.

Но почему это так работает, когда у меня v-show = "!hovered && isDesktop"? Я предположил, что первая загрузка Nuxt.JS идет на сервер, поэтому isDesktop возвращается как неопределенный, поэтому v-show = "!hovered && isDesktop" превращается в v-show = "!false && undefined". Но тогда почему вторая директива div v-show: v-show = "hovered || !isDesktop" работает нормально, если она должна превратиться в v-show = "false || !undefined", но у меня все еще есть этот div скрыто на рабочем столе и отображается на мобильном телефоне.

P.S. Это мой первый вопрос по StackOverflow, извините, если я плохо стилизовал код, я не понимаю, как это работает. Спасибо за ответы.

Хотя это не имеет прямого отношения к проблеме, isDesktop() в настоящее время неявно возвращает undefined, когда process.client не соответствует действительности, было бы проще явно вернуть false.

Etheryte 21.03.2018 10:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
98
1

Ответы 1

Странное поведение, вероятно, исходит из этой строки

window.screen.width > 1024 ? return true : return false

когда это должно быть

return window.screen.width > 1024 ? true : false

Синтаксис неверный. Nuxt даже не скомпилирует его, когда я попробовал. Интересно, почему ваш сервер Nuxt может с этим работать.

Спасибо за ответ, но на самом деле я использую vuex вместо computed returns, а затем я получаю значение переменной isDesktop через vuex getter. Так что ваш ответ не решит проблему. В описании проблемы я просто упрощаю код, чтобы было понятнее, что происходит.

Puwka 28.03.2018 11:26

Другие вопросы по теме