質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

1回答

2088閲覧

【Nuxt.js】vuex-persistedstateを用いたデータの永続化について

tenchim

総合スコア8

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Vuex

Vuexは、Vue.js アプリケーションのための状態管理ライブラリです。アプリケーション内で使用するコンポーネントのための集中データストアを提供。コンポーネント同士でデータをやり取りし、処理のフローを一貫させたり、データの見通しを良くすることができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2021/07/13 09:24

編集2021/07/13 10:54

お世話になっております。
表題の通り、vuex-persistedstateを用いたデータの永続化についてご質問させていただきたいです。

質問内容

Vuexの値を永続化させるために、以下の3つの流れで実装を考えております。
①まずはstore.userにオブジェクトデータを保存

store/index.js

1//mutationsにて 2setUser(state, payload) { 3 state.user = {...payload}; 4} 5 6//actions内のログイン処理にて 7const userInfo = { 8 name: 'name' 9}; 10commit("setUser", userInfo);

②vuex-persistedstateでローカルストレージにデータを格納
こちらの公式サイトの「Example with Nuxt.js」セクションに従って以下の様に設定いたしました。

// plugins/persistedState.client.jsにて import createPersistedState from 'vuex-persistedstate' export default ({store}) => { createPersistedState({ key: 'movie-sharing-app', })(store) }
// nuxt.config.jsにて plugins: [ { src: '~/plugins/persistedState.client.js', ssr: false } ]

③リロード時にnuxtClientInitでローカルストレージの値をstore.userに復元
クライアント側でリロードしたときの処理を書くために「nuxt-client-init-module」というモジュールを使い、store/index.jsのactionsに以下の処理を追加しました。

// store/index.jsにて nuxtClientInit({ commit }) { const data = JSON.parse(localStorage.getItem('movie-sharing-app')) || [] console.log(localStorage.getItem('movie-sharing-app')); //この値をコンソールで確認しました。 if(data) { commit('setUser', data); } }

しかしいざローカルストレージの値を取り出してみると、以下の様にuserオブジェクトの中に更にuserオブジェクトが連続しているような形式になっておりました。

// localStorage.getItem('movie-sharing-app')の値 {"user":{"user":{"user":{"user":{"user":{"user":{"user":{"user":{"user":{"user":{"user":{"user":{"user":{"user":{name: 'name'}}}}}}}}}}}}}}}

ローカルストレージを何度も上書きしているかもしれないと予想し原因を追究しているのですが、一向に分からず、皆様のご意見もお伺いしたいです。
是非宜しくお願い致します。

2021/07/13 19:13 追記:原因が分かりましたので報告いたします。
お世話になっております。
原因が分かりましたので、追記いたします。

まず事実としてページを1回リロードするたびにuserオブジェクトが1つずつ増えていきました。

//1回目 {user: { name: 'name' }} //2回目 {user: {user: { name: 'name' }}} //3回目 {user: {user: {user: { name: 'name' }}}} ・・・

これはvuex-persistedstateがstate以下をローカルストレージに保存している一方、commit('setuser', userInfo)ではstate.userに値を保存しているからでした。

つまりリロード時にnuxtClientInit関数を実行するたびにstate.userにローカルストレージの値が挿入され、どんどんuserオブジェクトが溜まっていくということです。

解決策については引き続き検討いたします。
とりあえず原因のご報告まで。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

以上の問題を解決いたしましたので報告いたします。

Nuxt.jsのstateはオブジェクトではなく関数なので、任意のオブジェクトpayloadとの結合Object.assign(state, payload)が使えず、またstate.push(payload)も表示がおかしくなります。

ですのでvuex-persistedstateをpathsを指定せずにデフォルトで使う場合は、どうしてもstate以下を保存してしまうので、state, mutations, nuxtClientInitを以下のように変更しました。

// 修正前 // state export const state = () => ({ user: {} }) // mutations export const mutations = { setUser(state, payload) { state.user = {...payload}; }, } // actions/nuxtClientInit nuxtClientInit({ commit }) { const data = JSON.parse(localStorage.getItem('movie-sharing-app')) || [] if(data) { commit('setUser', data); } } ↓ ↓ ↓ // 修正後 // state export const state = () => ({ }) // mutations export const mutations = { setState(state, payload) { state = payload; }, setUser(state, payload) { state.user = {...payload}; }, } // actions/nuxtClientInit nuxtClientInit({ commit }) { const data = JSON.parse(localStorage.getItem('movie-sharing-app')) || [] if(data) { commit('setState', data); } }

以上のコードにすれば、Vuexのデータの永続化が可能となりました。
ほかに良い案などがあればコメントにて受け付けます。

投稿2021/07/13 10:40

編集2021/07/14 04:58
tenchim

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問