問題の詳細
Nuxtで以下のような挙動をするサービスを書いています
/examples/{id}
にアクセスすると、fetch関数内でidを元にapiにリクエストを送り、データをstoreに格納する- ..mapGettersでstoreのstateに格納されたデータをcomputedで取得、画面上に表示する
具体的なコードは以下の通りです(都合上一部省略しております)
js
1//examples/_id.vue 2 3<template> 4 <div> 5 {{example}} 6 </div> 7</template> 8 9<script> 10import {mapGetters} from 'vuex' 11export default { 12 async fetch({store, params}){ 13 await store.dispatch('example/fetch', route.params.id) 14 }, 15 16 computed: { 17 ...mapGetters('example', ['example']) 18 } 19} 20</script>
js
1//store/example.js 2export const state = () => { 3 example: {} 4} 5 6export const getters = { 7 example: (state) => state.example 8} 9 10export const mutations = { 11 setExample(state, payload) { 12 state.example = payload 13 }, 14} 15 16export const actions = { 17 /* 18 idから該当のexampleを取得 19 */ 20 async fetch({ commit }, id) { 21 //http request的なコード 取得したexampleがデータ変数に入っている想定 22 commit("setExample", data) 23 }, 24}
ここで、以下のような操作をしたとき、example2のページにexample1のデータが表示されてしまいます
- 各exampleへのリンクがあるtopページから
example/1
にアクセス(このとき、example1のデータが正常に表示されている) - ブラウザバックして、topページに戻る
example2
にアクセス(このときexample2のデータが表示されてほしいがなぜがexample1のデータが表示される)
また、特徴として、そのページでリロードを行うと、次から上記の挙動をした際に正常な表示がされます(すなわち、example/2
のページにexample2
のデータが表示されている)
試してみたこと
上記storeのgetterとmutationの関数内に、console.logを配置し、しっかりデータがとれているか(また関数が呼びダサえているか)を確認しました
結果、上記工程の3番において、getter関数が呼び出されていない(getter内のconsole.logが発火していない)ことがわかりました(mutaiton内のconsole.logは表示されており、取得されているデータもexample2のままでした)
質問したいこと
- 上記のような動作で、getterが呼び出されていないのはなぜか
- この状況を解決するためにはどうしたらよいか
以上、おわかりの方がいらっしゃればご教示お願いいたします
あなたの回答
tips
プレビュー