Migrating to 4.0 from 3.x
Almost all Vuex 4 APIs have remained unchanged from Vuex 3. However, there are still a few breaking changes that you must fix.
Breaking Changes
Installation process
To align with the new Vue 3 initialization process, the installation process of Vuex has changed. To create a new store, users are now encouraged to use the newly introduced createStore function.
import { createStore } from 'vuex'
export const store = createStore({
state () {
return {
count: 1
}
}
})
To install Vuex to a Vue instance, pass the store
instead of Vuex.
import { createApp } from 'vue'
import { store } from './store'
import App from './App.vue'
const app = createApp(App)
app.use(store)
app.mount('#app')
NOTE
Whilst this is not technically a breaking change, you may still use the new Store(...)
syntax, we recommend this approach to align with Vue 3 and Vue Router Next.
TypeScript support
Vuex 4 removes its global typings for this.$store
within a Vue component to solve issue #994. When used with TypeScript, you must declare your own module augmentation.
Place the following code in your project to allow this.$store
to be typed correctly:
// vuex-shim.d.ts
import { ComponentCustomProperties } from 'vue'
import { Store } from 'vuex'
declare module '@vue/runtime-core' {
// Declare your own store states.
interface State {
count: number
}
interface ComponentCustomProperties {
$store: Store<State>
}
}
You can learn more in the TypeScript Support section.
Bundles are now aligned with Vue 3
The following bundles are generated to align with Vue 3 bundles:
-
vuex.global(.prod).js
- For direct use with
<script src="...">
in the browser. Exposes the Vuex global. - Global build is built as IIFE, and not UMD, and is only meant for direct use with
<script src="...">
. - Contains hard-coded prod/dev branches and the prod build is pre-minified. Use the
.prod.js
files for production.
- For direct use with
-
vuex.esm-browser(.prod).js
- For use with native ES module imports (including module supporting browsers via
<script type="module">
.
- For use with native ES module imports (including module supporting browsers via
-
vuex.esm-bundler.js
- For use with bundlers such as
webpack
,rollup
andparcel
. - Leaves prod/dev branches with
process.
guards (must be replaced by bundler).env.NODE_ENV - Does not ship minified builds (to be done together with the rest of the code after bundling).
- For use with bundlers such as
-
vuex.cjs.js
- For use in Node.js server-side rendering with
require()
.
- For use in Node.js server-side rendering with
createLogger
function is exported from the core module
In Vuex 3, createLogger
function was exported from vuex/dist/logger
but it's now included in the core package. The function should be imported directly from the vuex
package.
import { createLogger } from 'vuex'
New Features
New useStore
composition function
Vuex 4 introduces a new API to interact with the store in Composition API. You can use the useStore
composition function to retrieve the store within the component setup
hook.
import { useStore } from 'vuex'
export default {
setup () {
const store = useStore()
}
}
You can learn more in the Composition API section.