Страница ошибки Vue не отображается при использовании привязок классов

#vue.js

#vue.js

Вопрос:

У меня есть страница с ошибкой, которая отображается, если город не найден. Он работал отлично, пока я не решил сделать фон динамическим на основе результатов поиска. Теперь весь app-bg div исчезнет, если возникнет ошибка. Вот соответствующий код:

Шаблон

 <div
  :class="{ nightBg: isNight(weather.weather[0].icon) }"
  class="app-bg"
>
  <div v-if="error">
    <router-link to="/">
      <i class="fa fa-times close-icon"></i>      
    </router-link>
    <div class="handleError">
      <h1>Uh-oh!</h1>
      <img src="../assets/errorIcon.png" alt="Error Icon">
      <h3>
        We couldn't find {{ this.$route.params.city }}
      </h3>
      <p>
        Check your spelling and try again!
      </p>      
    </div>
  </div>
  . . .
</div>
 

Скрипт

 export default {
  name: 'Result',
  data(){
    return {
      error: null,
      weather: null
    }
  },
  created() {
    axios.get(`${this.$route.params.city}`)
      .then(response => {
        this.weather = response.data;
      })
      .catch(error => {
        this.error = error;
      });
  },
  methods: {
    . . .,
    isNight(iconID) {
      if(iconID.slice(2) == 'd') {
        return false;
      } if(iconID.slice(2) == 'n') {
        return true;
      } else { return false; }
    }
  }
}
 

CSS

 .nightBg {
    background: #000000;
    background: -moz-linear-gradient(top,  #000000 0%, #7f466e 61%, #fc8a8a 100%);
    background: -webkit-linear-gradient(top,  #000000 0%,#7f466e 61%,#fc8a8a 100%);
    background: linear-gradient(to bottom,  #000000 0%,#7f466e 61%,#fc8a8a 100%);
    filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#000000', endColorstr='#fc8a8a',GradientType=0 );
}
 

Редактировать:

Я изменил привязку к div на <div :class="['app-bg', { nightBg: isNight }]"> и добавил isNight метод в вычисляемый раздел, как показано ниже. this.weatherIcon возвращает то, что я ожидаю, но когда я смотрю на расширение Vue в Firefox, оно появляется isNight: (error during evaluation) и app-bg исчезает.

 export default {
  name: 'Result',
  data(){
    return {
      error: null,
      weather: null,
      weatherIcon: null
    }
  },
  created() {
    axios.get(`${this.$route.params.city}`)
      .then(response => {
        this.weather = response.data;
        this.weatherIcon = this.weather.weather[0].icon;
      })
      .catch(error => {
        this.error = error;
      });
  },
  computed: {
    isNight: () => {
      if(this.weatherIcon.slice(2) == 'n') {
        return true;
      } if(this.weatherIcon.slice(2) == 'd') {
        return false;
      } else { return false; }
    }
  },
  . . .
 

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

1. Не уверен, что вы просто оставили это при вставке своего кода, но у вас <div class="app-bg"> отсутствует закрывающий тег. Кроме того, каково содержимое CSS вашего класса ‘nightBg’?

2. Я просто забыл добавить это в вопрос, но я обновил его, включив окончание div и CSS

3. weather.weather[0].icon не будет установлено, если оно не будет возвращено, оно будет отображать ошибки в консоли

4. также очистите :class="['app-bg', { nightBg: isNight }]" , не нужны 2 класса и следует использовать вычисляемый реквизит, а не метод

5. Методы @supernova выполняются при каждом их вызове. Вычисляемые свойства кэшируются и переоцениваются только в том случае, если изменяется одно из значений, от которого они зависят.