Vue.jsでの状態(データ)管理に使用されるVuexですが、ブラウザのリロードなどを行うとデータは消えてしまいます。
リロードを行ってもデータは保持しておきたい案件でvuex-persistedstateを使うことがあったので、使い方をメモしておきます。
サンプルコード
今回の作業環境ですが、以前投稿したVuexの記事と同じ環境を使用しています。
vuex-persistedstateは4.1.0になります。
まず下記コマンドでvuex-persistedstateをインストールします。
npm install --save vuex-persistedstate
あとはプラグインをインポートして、設定を行えばOKです。
import { createStore } from 'vuex' import createPersistedState from "vuex-persistedstate"; export default createStore({ plugins: [createPersistedState()], state: { count: 0 }, getters: { getCount(state) { return state.count; } }, mutations: { countUpdate(state, payload) { state.count += payload; } } })
これでリロードを行ってもVuexのデータが保持されるようになりました。
プラグインの設定時にオプションを設定できるので、いくつか試してみます。
詳しくは公式のドキュメントをご確認ください。
まず、テスト用にmessageという別のデータを追加しておきます。
import { createStore } from 'vuex' import createPersistedState from "vuex-persistedstate"; export default createStore({ plugins: [createPersistedState()], state: { count: 0, message: '' }, getters: { getCount(state) { return state.count; }, getMessage(state) { return state.message; } }, mutations: { countUpdate(state, payload) { state.count += payload; }, messageUpdate(state, payload) { state.message = payload; } } })
vueファイルにmessageの値取得や変更の処理を追加します。
<template> <div class="home"> <p>{{ count }}</p> <button @click="buttonEvent">button</button> <hr> <input type="text" v-model="message"> <p>{{ getMessage }}</p> <button @click="msgEvent">msg</button> </div> </template>
<script> export default { name: 'HomeView', data() { return { message: '' } }, computed: { count() { return this.$store.getters.getCount; }, getMessage() { return this.$store.getters.getMessage; } }, methods: { buttonEvent() { this.$store.commit('countUpdate', 1); }, msgEvent() { this.$store.commit('messageUpdate', this.message); } } } </script>
これで準備ができたので、オプションを試してみます。
import { createStore } from 'vuex' import createPersistedState from "vuex-persistedstate"; export default createStore({ plugins: [createPersistedState({ key: 'cly7796', paths: [ 'count' ], storage: window.sessionStorage })], state: { count: 0, message: '' }, getters: { getCount(state) { return state.count; }, getMessage(state) { return state.message; } }, mutations: { countUpdate(state, payload) { state.count += payload; }, messageUpdate(state, payload) { state.message = payload; } } })
試した結果は、countはsessionStorageとしてデータが保持され、messageはリロードしてもデータが保持されないようになりました。
今回試したオプションは以下の3つになります。
key | localStorageやsessionStorageとして保存する際のkey値。 デフォルトはvuex。 |
---|---|
paths | 保存するstateのデータを指定。 デフォルトはundefined。 |
storage | 保存方法の指定。 デフォルトはlocalStorage。 |
コメントが承認されるまで時間がかかります。