Миграция на 4.0 с 3.x
Почти весь API Vuex 4 остался неизменным по сравнению с Vuex 3. Тем не менее, есть ещё несколько кардинальных изменении, которые необходимо исправить.
Кардинальные изменения
Процесс установки
Чтобы соответствовать новому процессу инициализации Vue 3, процесс установки Vuex изменился. Для создания нового хранилища теперь предлагается использовать функцию createStore
.
import { createStore } from 'vuex'
export const store = createStore({
state () {
return {
count: 1
}
}
})
Чтобы установить Vuex в экземпляр Vue, передайте store
вместо Vuex.
import { createApp } from 'vue'
import { store } from './store'
import App from './App.vue'
const app = createApp(App)
app.use(store)
app.mount('#app')
ЗАМЕЧАНИЕ
Хотя технически это не является кардинальным изменением, потому что всё ещё можно использовать и старый синтаксис new Store(...)
, но рекомендуется этот подход для соответствия с Vue 3 и Vue Router.
Поддержка TypeScript
Vuex 4 удаляет глобальную типизацию для this.$store
в компоненте Vue для решения проблемы #994. При использовании с TypeScript, теперь нужно объявить собственный модуль расширения.
Поместите следующий код в проект, чтобы позволить this.$store
быть корректно типизированным:
// vuex-shim.d.ts
import { ComponentCustomProperties } from 'vue'
import { Store } from 'vuex'
declare module '@vue/runtime-core' {
// объявляем собственные состояния хранилища
interface State {
count: number
}
interface ComponentCustomProperties {
$store: Store<State>
}
}
Больше можно узнать в разделе поддержка TypeScript.
Сборки соответствуют сборкам Vue 3
Следующие сборки сгенерированы для соответствия со сборками Vue 3:
vuex.global(.prod).js
- Для непосредственного использования с
<script src="...">
в браузере. Выставляет глобальный Vuex. - Глобальная сборка построена как IIFE, а не как UMD, и предназначена только для использования напрямую через
<script src="...">
. - Содержит подготовленные варианты для production/разработки, кроме того сборка для production предварительно минифицирована. Используйте в production файлы
*.prod.js
.
- Для непосредственного использования с
vuex.esm-browser(.prod).js
- Для использования в нативных импортах ES-модулей (в браузере через
<script type="module">
).
- Для использования в нативных импортах ES-модулей (в браузере через
vuex.esm-bundler.js
- Для использования с системами сборки, такими как
webpack
,rollup
иparcel
. - Определение поведения для production/разработки условиями с
process.
(значение будет подменяться системой сборки).env.NODE_ENV - Нет готовых минифицированных сборок (минификация должна выполняться системой сборки, как и для всего остального кода).
- Для использования с системами сборки, такими как
vuex.cjs.js
- Для использования отрисовки на стороне сервера в Node.js через
require()
.
- Для использования отрисовки на стороне сервера в Node.js через
Функция createLogger
экспортируется из основного модуля
В Vuex 3, функция createLogger
экспортировалась из vuex/dist/logger
, но теперь доступ к ней можно получить из основного пакета vuex
.
import { createLogger } from 'vuex'
Новые возможности
Новая функция композиции «useStore»
Vuex 4 представляет новый API с хранилищем при использовании Composition API. Можно использовать функцию композиции useStore
для извлечения хранилища внутри компонента setup
хуком.
import { useStore } from 'vuex'
export default {
setup () {
const store = useStore()
}
}
Больше можно узнать в разделе Composition API.