Действия - actions
Что такое действия(actions)
Действия — похожи на мутации с несколькими отличиями:
Вместо того, чтобы напрямую менять состояние, действия инициируют мутации;
Действия могут использоваться для асинхронных операций.
Пример регистрации простого действия:
Обработчики действий получают объект контекста, содержащий те же методы и свойства, что и сам экземпляр хранилища, так что вы можете вызвать 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, то можем компоновать наши действия следующим образом:
Last updated
Was this helpful?