Vue: Как повторно визуализировать представление в середине цикла обработки событий?

1

https://codepen.io/anon/pen/mqbaXE?editors=1010

Я бы хотел, чтобы value отображалось как "B" сразу после нажатия кнопки, а затем отображалось как "C" после завершения огромного цикла. Как я могу это сделать? В настоящее время он никогда не отображается как "B".

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

Я пробовал Vue.nextTick, vm. $ ForceUpdate и setTimeout(fn, 0), но никто не работает.

HTML

<div id="example">
  <p>Value: {{ message }}</p>
  <button v-on:click="change()">Change</button>
</div>

JS

var vm = new Vue({
  el: '#example',
  data: {
    message: 'A'
  },
  methods: {
    change: change
  }
})

function change () {
  vm.message = 'B';

  setTimeout(function () {
    for (var i = 0; i < 2000000000; i++) {}
    vm.message = 'C';
  }, 0);  
}
Теги:
vue.js
vuejs2

1 ответ

1
Лучший ответ

setTimeout работает для меня: https://codepen.io/anon/pen/VrZqRa?editors=1010

Кроме того, никогда не делайте огромных циклов, подобных JavaScript: они полностью замораживают ваш цикл событий (который должен обрабатывать как javascript, так и пользовательские взаимодействия).

  • 0
    Извините за то, что не был более ясным. Мой вопрос заключается в том , чтобы справиться с ситуацией , когда у вас есть огромный цикл. В моем конкретном приложении я запускаю кучу симуляций. Когда пользователь нажимает кнопку «Имитация», я хотел бы: 1) дать отзыв о том, что он моделирует, 2) запустить моделирование, 3) показать результаты моделирования.
  • 3
    DOM может быть обновлен только после того, как ваш вызов setTimeout вернется, так что сделайте модификацию vm.message в одном setTimeout , а ваши симуляции - в другом. Более того, запустите симуляции с помощью веб-работника, чтобы ваш пользовательский интерфейс оставался отзывчивым.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню