Last updated
Last updated
Действия — похожи на мутации с несколькими отличиями:
Вместо того, чтобы напрямую менять состояние, действия инициируют мутации;
Действия могут использоваться для асинхронных операций.
Пример регистрации простого действия:
Обработчики действий получают объект контекста, содержащий те же методы и свойства, что и сам экземпляр хранилища, так что вы можете вызвать context.commit
для инициирования мутации или обратиться к состоянию и геттерам через context.state
и context.getters
. Однако, этот контекст — не то же самое, что экземпляр хранилища.
На практике для упрощения кода часто используется деструктуризация аргументов
Действия запускаются методом store.dispatch
:
На первый взгляд может выглядеть глупо: если нужно увеличить значение count, почему бы просто не вызвать store.commit('increment')
напрямую? Помните что мутации должны быть синхронными? Для действий такого ограничения нет. Внутри действий можно выполнять асинхронные операции:
Действия(actions) поддерживают тот же формат для передачи нагрузки, а также объектный синтаксис:
Более приближённым к реальности примером действий будет формирование заказа на основе состояния корзины покупок. Логика такого действия включает в себя вызов асинхронного API и инициализацию нескольких мутаций:
Таким образом удаётся организовать поток асинхронных операций, записывая побочные эффекты действий в виде мутаций состояния.
Диспетчеризировать действия в компонентах можно при помощи this.$store.dispatch('xxx')
или используя вспомогательную функцию mapActions
, создающую локальные псевдонимы для действий в виде методов компонента (требуется наличие корневого $store
):
Раз действия зачастую асинхронны, то как узнать, что действие уже завершилось? И, что важнее, как быть со связанными между собой действиями при организации более сложных асинхронных потоков?
Первое, что нужно знать — store.dispatch
может обрабатывать Promise, возвращаемый обработчиком действия, и также возвращает Promise:
Теперь можно сделать так:
Наконец, если мы используем async / await, то можем компоновать наши действия следующим образом:
store.dispatch может вызывать несколько обработчиков действий в различных модулях одновременно. В этом случае возвращаемым значением будет Promise, разрешающийся после разрешения всех вызванных обработчиков