@tryvols
Front-End разработчик

Почему не работает реактивность?

Все вроде лаконично, но после первого рендеринга v-if при изменении isActive ничего не происходит.

<script src="https://unpkg.com/vue"></script>

<div
  id="search"
  class="search"
  @mouseenter="toggle"
  @mouseleave="toggle"
>
  <span v-if="!isActive">a</span>
  <span v-else>b</span>
  <input
    type="text"
    class="search__input"
    placeholder="Это инпут">
</div>

new Vue({
  el: '#search',
  data: {
    isActive: false
  },
  methods: {
  	toggle: () => {
    	this.isActive = !this.isActive;
    }
  }
})

:active, :hover, :focus {
  outline: none;
  outline-offset: none;
}
.search {
  flex-direction: row;
  justify-content: flex-end;
  align-items: center;
  display: inline-block;
}
.search:hover, .search-active {
  border-bottom: 1px solid blue;
}
.search__input {
  background: transparent;
  border: none;
}
  • Вопрос задан
  • 202 просмотра
Решения вопроса 2
nikichv
@nikichv
Frontend dev. Current stack: Next.js/RTK/Saga
methods: {
  toggle() {
    this.isActive = !this.isActive;
  }
}

Поменяйте стрелочную функцию toggle: () => { на метод toggle() { и тогда все заработает.

P.S. Откуда вы все вообще решили, что в методах компонента нужно писать стрелочные функции? :)
Просто вы не первый с такой проблемой. Ощущение, будто все насмотрелись уроков по ES6 и стали бездумно писать стрелочные функции там, где они вовсе не нужны.
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега Vue.js
Потому что this внутри метода toggle - это не экземпляр vue. Не надо всюду пихать стрелочные функции.

Замените toggle: () => { на toggle() {.
Ну или (осторожно, говнокод)...

...перед new Vue добавьте const vm =; в toggle, соответственно, замените this на vm.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы