Класс привязки, похоже, не работает должным образом на основе значения присоединенной переменной

#vue.js #computed-properties

#vue.js #вычисляемые свойства

Вопрос:

Мой banner-visible класс привязки обусловлен моим showMainBanner вычисляемым свойством:

 <div :class="['view view-index', { 'banner-visible' : showMainBanner }]">
  

Вот как я определяю свое вычисляемое свойство:

 computed: {
  showMainBanner () {
    return (Cookies.get('banner_dismiss')) ? false : this.$store.state.config.showMainBanner
  }
}
  

Когда я перезагружаю страницу, я могу видеть значение моего вычисляемого свойства, регистрируя его консолью в mounted() перехватчике:

 mounted () {
  console.log('showMainBanner = '   this.showMainBanner)
}
  

В консоли при загрузке страницы я вижу: showMainBanner = false

Тем не менее, banner-visible класс все еще существует, несмотря на то, что значение showMainBanner равно false .

Как это возможно?

Самое загадочное заключается в следующем: когда я перехожу на страницу по ссылке и возвращаюсь к ней по ссылке, эта проблема не возникает. Но если я обновлю страницу, это произойдет.

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

Я изменил свой код на что-то еще более явное:

 showMainBanner () {
  if (Cookies.get('banner_dismiss')) {
    console.log('RETURN FALSE')
    return false
  } else {
    console.log('RETURN TRUE')
    return this.$store.state.config.showMainBanner
  }
}
  

После обновления страницы я вижу в консоли ВОЗВРАЩАЕМОЕ значение FALSE, и я все еще вижу showMainBanner = false из console.log() вызова в mounted() перехватчике. Итак, очевидно, что showMainBanner это определенно равно false .

Здесь происходит черная магия?

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

1. можете ли вы показать, от какого значения данных зависит ваше вычисленное значение? Я думаю, что во время обновления страницы значение данных, от которого зависит ваше вычисленное значение, никогда не обновляется, отсюда и странное поведение, но вычисляемое свойство showMainBanner в консоли принимает значение false. регистрируется при обновлении страницы, так что это также может быть проблемой в синтаксисе массива вашей привязки класса. Вы пробовали вносить изменения в синтаксис массива? нравится делать <div v-bind:class="[view, view-index, { banner-visible : showMainBanner }]"> или что-то в этом роде?

2. Спасибо, я пытался, но получаю ошибки компиляции: 'v-bind' directives require an attribute value и Parsing error: Line 1: Unexpected token, expected ","

3. да, данные должны быть объявлены для таких классов, как data { view: 'view', view-index: 'view-index' } . В любом случае, кажется, что условие истинности истинно, даже если возвращаемое значение равно false. Я не уверен, что он принимает значение true, пока есть возвращаемое значение, можете ли вы попробовать вернуть null вместо false ? также попробуйте разделить классы и установить значение consition как false, например, :class="['view','view-index', { 'banner-visible' : false }]" затем попробуйте обновить.

4. Таким образом, это работает независимо от того, возвращаю ли я «вручную» null или false . Для меня это не имеет никакого смысла: если я возвращаю false вручную, это работает, но если я возвращаю false «программно», это не так… Почему?? Это false в обоих случаях!

5. это означает, что оценка showMainBanner никогда не изменяется при обновлении страницы, теперь вопрос в том, следует ли вам продолжать использовать вычисленное значение, потому что кажется, что showMainBanner не зависит ни от каких данных в текущей области видимости функции, так почему бы не использовать для этого обычный метод?

Ответ №1:

Cookies не реагирует. После первого вычисления showMainBanner он не оценивается Vue повторно.

Когда вы уйдете и вернетесь, Vue снова оценит вычисляемое свойство, и на этот раз файл cookie уже установлен.

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

1. Эта проблема реактивности должна быть решена путем перехода с then обратно на страницу, но также путем обновления страницы, не так ли? Тем не менее, это не

Ответ №2:

Ваша проблема в том, что ваш файл cookie возвращает строку:

 console.log(typeof Cookies.get('banner_dismiss'))
//=> string
  

Попробуйте изменить свое условие, например:

 computed: {
  showMainBanner () {
    let dismiss = Cookies.get('banner_dismiss') === 'undefined' ? false : JSON.parse(Cookies.get('banner_dismiss'))
    return dismiss ? false : this.$store.state.config.showMainBanner
  }
}
  

Или, если вы хотите избежать ошибок JSON в случае пустого файла cookie, вы можете добавить простое условие:

 computed: {
  showMainBanner () {
    let dismiss = Cookies.get('banner_dismiss') === 'true'
    return dismiss ? false : this.$store.state.config.showMainBanner
  }
}
  

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

1. Спасибо, я получаю ` ERROR [Vue warn]: ошибка при рендеринге: «SyntaxError: неожиданный токен u в JSON в позиции 0″` при выполнении этого, хотя и я не уверен, почему

2. @drake035, это потому, что ваш cookie пустой и возвращает undefined (это нарушает JSON.parse). Попробуйте добавить другое условие, например, if (Cookie.get('banner_dismiss') !== 'undefined') на основе того, что вам нужно вернуть в этом случае/

3. Все еще получаю ту же ошибку в строке: const dismiss = (Cookies.get('banner_dismiss') !== 'undefined') amp;amp; JSON.parse(Cookies.get('banner_dismiss'))

4. @drake035 вы правы, я увидел свою ошибку, когда редактировал свой ответ. undefined Условие должно быть первым, ЗАТЕМ вы анализируете cookie (а не И т.е. amp;amp; ). Я обновил свой ответ… снова 🙂

5. Готово, я получаю ERROR [Vue warn]: Error in render: "SyntaxError: Unexpected token u in JSON at position 0"