😇
Vue2/Vuex3からVue3/Vuex4にする際にハマった話
Vue2/Vuex3からVue3/Vuex4に移行するなかで @vue/compat
を利用して徐々に移行しようと思っていた
Vuex4自体は new Store(...)
構文がまだ利用できるとのことなので app.use(store)
は利用しなくても動くかなと思っていたらダメだった
Vue2/Vuex3 でのサンプルコード
main.js
import Vue from 'vue'
import Counter from './Counter.vue'
import store from './store'
new Vue({
el: '#app',
store,
render: h => h(Counter)
})
store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state = {
// 省略
}
const mutations = {
// 省略
}
const actions = {
// 省略
}
const getters = {
// 省略
}
export default new Vuex.Store({
state,
getters,
actions,
mutations
})
@vue/compat
でうまくいった例
Vue3/Vuex4 with store.jsは変えなくても動作する
main.js
import { createApp } from 'vue'
import Counter from './Counter.vue'
import store from './store'
createApp({
render: h => h(Counter)
}).use(store).mount('#app')
@vue/compat
でダメな例
Vue3/Vuex4 with new Vue
の記法自体は @vue/compat
で互換モードなのでそれ単体では動作するがstoreがからむと下記のようなエラーとなった
Uncaught TypeError: _ctx.$store is undefined
Vue2/Vuex3 でのサンプルコードのmain.jsのままであったり、下記のコードだとダメで createApp
記法にする必要があった
main.js
new Vue({
el: '#app',
render: h => h(Counter)
}).use(store)
Discussion