Смена стилей с задержкой

Я хочу переключить стили div с некоторой задержкой после нажатия кнопки.

Код будет работать нормально, если я просто буду использовать что-то вроде this.customEffect = 'blueborder'; без тайм-аутов.

new Vue({
  el: '#app',
  data: {
    customEffect: ''
  },
  methods: {
    start: function() {
      setTimeout(function() {
        this.customEffect = 'blueborder';
      }, 1000);
      setTimeout(function() {
        this.customEffect = 'redtext';
      }, 2000);
    }
  }
});
.blueborder {
  border: 3px solid blue;
}

.redtext {
  color: red;
}
<script src = "https://npmcdn.com/vue/dist/vue.js"></script>
<div id = "app">
  <div>
    <button @click = "start">Start</button>
    <div :class = "customEffect">Some text</div>
  </div>
 </div>
Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
758
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я думаю, что проблема, с которой вы столкнулись, заключается в том, что контекст this в ваших тайм-аутах - это анонимная функция, а не родительский объект. Вы можете использовать либо стрелочные функции, либо явную привязку.

new Vue({
  el: '#app',
  data: {
    customEffect: ''
  },
  methods: {
    start: function() {
      setTimeout((function() { //BIND
        this.customEffect = 'blueborder';
      }).bind(this), 1000);
      setTimeout(() => { //OR =>
        this.customEffect = 'redtext';
      }, 2000);
    }
  }
});
.blueborder {
  border: 3px solid blue;
}

.redtext {
  color: red;
}
<script src = "https://npmcdn.com/vue/dist/vue.js"></script>
<div id = "app">
  <div>
    <button @click = "start">Start</button>
    <div :class = "customEffect">Some text</div>
  </div>
 </div>

РЕДАКТИРОВАТЬ Рекомендуемые учебные ресурсы

this может быть довольно сложным в JS. Если вы хотите узнать об этом больше, я настоятельно рекомендую соответствующую книгу Вы не знаете JS от Getify Это & прототипы объектов

Вы можете использовать boostrap, чтобы избежать создания кода, который уже имеет функции boostrap.

Или вы можете создать собственные классы css:

Например:

.animated {
-webkit-animation-duration: 1s;
animation-duration: 1s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}

.fast {
-webkit-animation-duration: 0.4s;
animation-duration: 0.4s;
-webkit-animation-fill-mode: both;
animation-fill-mode: both;
}

@keyframes fadeIn {
from {
  opacity: 0;
}

to {
  opacity: 1;
}
}

.fadeIn {
animation-name: fadeIn;

html пример:

<div class = "animated fadeIn fast">
  <h1 class = "display-4">My app</h1>
  <p class = "lead">This is a great app!</p>
<div>

Вы можете использовать метод debounce lodash. https://lodash.com/docs/#debounce

 methods: {
        start: _.debounce(function() {
            this.customEffect = (this.customEffect == 'redtext')?'blueborder':'redtext';
        },1000)
      }

прежде чем вам нужно будет импортировать lodash

Спасибо, Даниэль, но я пытаюсь изучить Vue, поэтому использование других библиотек - это не то, что я искал.

Boris Sokolov 10.10.2018 20:23

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