vuexを使ってlocalstorageへ保存する
要件は
コンポーネントA,Bがあり、コンポーネントBが設定画面とします。
コンポーネントBの保存ボタンを押すと、storeに格納されて
コンポーネントAでも保存した値が参照できるようにしたい。
保存ボタンではローカルストレージに格納する
こうするといいかも
main.jsの中のbeforeCreateの中で、storeのmutationを呼び出して、localStorageから読み出す。
コンポーネントBのmountedメソッドの中で、storeのstateを参照して自身のプロパティとして保存する
コンポーネントAのcomputedメソッドの中でstoreのstateを参照する
https://www.mikestreety.co.uk/blog/vue-js-using-localstorage-with-the-vuex-store
さて、やってみましょう。
vuexのインストール
npm install vuex --save
Storeの作成
storeディレクトリを掘りstore.jsを作成する
store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export const store = new Vuex.Store({
state: {
repeatInterval: 15
},
mutations: {
setRepeatInterval (state, repeatInterval) {
state.repeatInterval = repeatInterval
localStorage.setItem('store', JSON.stringify(state))
},
initializeStore (state) {
if (localStorage.getItem('store')) {
this.replaceState(Object.assign(state, JSON.parse(localStorage.getItem('store'))))
}
}
}
})
main.jsの編集
起動時に読み込むエントリーポイントはAppコンポーネントから行うと
見通しも良さそう?!
main.js
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import Vuetify from 'vuetify'
import 'vuetify/dist/vuetify.css'
import { store } from './store/store.js'
Vue.use(Vuetify)
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
store: store,
el: '#app',
router,
template: '<App/>',
components: { App },
beforeCreate () {
this.$store.commit('initializeStore')
}
})
設定用コンポーネントの定義(抜粋)
<template> <v-text-field ref="input" v-model="repeatInterval"><{{repeatInterval}}</v-text-field> </template> <script> export default { name: 'ogura', created () { }, data () { return { repeatInterval: null } }, methods: { update () { this.$store.commit('setRepeatInterval', this.$refs.input.value) } }, mounted () { this.repeatInterval = this.$store.state.repeatInterval } } </script>