どうもこじらです。
Nuxt.jsのドキュメントが思ったより充実してません。
公式はなぜか404 Not Foundばっかりです。なんなんでしょう、これは一次的なものなんでしょうか?
親切な方々がネットに色々情報を提供してくださっているので、それを頼りにVue.js→Nuxt.jsの移行を行っていますが、私のようなVue.js初心者ではなかなか答えにたどり着けず苦戦してしまいます。
ということで、今回はNuxt.js環境でのvuex-persistedstateがちょっとイケてなくて困った話。
vuex-persistedstateとは

vuex-persistedstateの話はこの間したので、過去記事の方を参照していただけると嬉しいです。
まぁざっくり言うと、storeとローカルストレージをいい感じに同期をとってくれるものです。
Nuxt.js環境でのvuex-persistedstate
Nuxt.js環境でのvuex-persistedstateはプラグインとして配置します。
Vue.jsでstore/index.jsとして記述していたものは、少し内容を改変してNuxtプロジェクトのstore/index.jsに転記します。
この辺は公式ドキュメントを参照してください。
別に難しくないです。
プラグインとして追加したソースは以下です。
plugins/localStorage.js
import createPersistedState from 'vuex-persistedstate'
export default ({ store }) => {
window.onNuxtReady(() => {
createPersistedState({
key: '任意のキー'
})(store)
})
}
あとはnuxt.config.jsのpluginsに追記したくらい?
「あーこれだけでいいのか!vuex-persistedstateは優秀だな!^ ^」
と思っていました。
実際にローカルストレージに保存されていることも確認していたので安心していました。
しかし、ことは突然起きました。
本題:vuex-persistedstateが思ったよりイケてない
this.$store.gettersで取得できない!?
画面のmounted()部分でthis.$store.getters.userIdでログインしているユーザのIDをstoreから取得する処理を記述していました。
Vue.js素使いの環境ではうまくいっていて、vuex-persistedstateにも謎の信頼を置いていたので安心しきっていました。
しかし、リロード時に
なぜかthis.$store.getters.userIdでユーザIDが取得できませんでした。。
状況を把握するためにconsole.log()を仕込んでコンソールを確認してみました。
・store/index.js
export const state = () => ({
userId: ''
})
export const getters = {
userId (state) {
return state.userId
}
}
export const mutations = {
setUserId (state, userId) {
state.userId = userId
}
}
export const actions = {
setUserId ({ commit }, value) {
commit('setUserId', value)
}
}
・mounted部分
mounted () {
// 追加 start
console.log(this.$store) // 105行目
console.log(this.$store.getters) // 106行目
console.log(this.$store.getters.userId) // 107行目
// 追加 end
this.userId = this.$store.getters.userId
if (this.userId) {
// 色んな処理
} else {
alert('不正な操作が行われました。')
this.$router.push('/home')
}
},
・コンソール
ん!?どういうことだ!??
this.$store.gettersの中にはuserIdが存在しているが、this.$store.getters.userIdでは取得できていないだと!!?
意味が分からないのでとりあえず、storeがローカルストレージから値を取得するタイミングを調べてみました。
ローカルストレージ→storeのコピーはナビゲーションバーのところで監視していたので、そこにconsole.log()を仕込んでみました。
……って、mounted()の後にコピーされてんじゃねぇか!!!
これは流石に草
解決方法
状況が分かったので色々ググってみたら、
- storeのmoduleを使ってプラグインのタイミングに読み込ませる方法
- mounted()内の処理のタイミングを遅らせる方法
- nuxt-client-init-moduleをインストールする方法
ざっくり、この3つが解決方法として見つかりました。
記事のリンクは張っておきます。

私は一番影響が少ない、3つ目の「nuxt-client-init-moduleをインストールする方法」を選択しました。
どすこいこいドットコム(dosukoikoi.com)さんの記事を参考に導入を進めます。
nuxt-client-init-moduleのインストール
npm install nuxt-client-init-module
はい、インストール完了。
ソースに追記
nuxt.config.js
modules: [
'nuxt-client-init-module'
],
modulesに定義。
store/index.js
export const actions = {
nuxtClientInit ({ commit }, context) {
const data = JSON.parse(localStorage.getItem('brain-juice')) || []
if (data.userId) {
commit('setUserId', data.userId)
}
}
}
storeのactions内にnuxtClientInit()という関数を追加。
完了。
直リンOK。リロードしてもうまく動いた。
何か問題があったらまた報告します。
こじらでした
じゃ




コメント