[Nuxt.js/Vuex] store/index.js”以外”のファイルへアクセスする方法

Nuxt.jsにて、Vuexを利用する際にstore/index.jsはデフォルトで設定されております。
基本的にはこちらのindex.jsにVuexの処理を記述していくことになります。が、index.js以外のファイルに分割して管理したいケースが発生すると思います。

今回は、Nuxt.js において store/index.js以外のファイルにアクセスする方法を解説します。

前提

今回はstoreの記述方法は解説しません。index.js以外に記述するとしても、index.jsへの記述方法と同様です。

todo.jsがstore配下に存在し、こちらにアクセスしていく方法を考えています。

store
 L index.js
 L todos.js

Q. stateの場合

this.$store.state.{ファイル名}.{state名}

例:

this.$store.state.todos.list

Q. mutationsの場合

this.$store.commit(“{ファイル名}/{mutations名}”)

例:

this.$store.commit('todos/add', e.target.value)

Q. actionsの場合

this.$store.dispatch(“{ファイル名}/{actions名}”)

例:

this.$store.dispatch('todos/addList')

Q. gettersの場合

下記、記事にまとめております。

【Vuex/Store】gettersとmapGettersの使い方 / index.js以外の呼び出し方.

gettersとmapGettersの利用方法を解説していきます。

Q. gettersの利用目的とは

gettersはなぜ利用するのでしょうか。

Storeで状態をもつ変数としてstateがあります。stateにアクセスすればgettersを必ずしも利用する必要はありません。ただし、gettersを利用するべきシチュエーションがあります。

それは、stateの値を基に他のデータへと処理したい場合です。

例えば、stateに配列データを含んで、gettersでは条件を基に配列をフィルター処理してデータ提供したい場合などです。

公式サイトの説明でも紹介されています。

Q. gettersの記述方法

gettersのStore内での記述方法

ここでは、簡単な処理にします。 stateのidを+1するgettersを記述します。

export const state = () => ({
  id: 0,
  })
  
  export const getters = {
    idplus(state) { // satateを引数に持つ
      return state.id + 1 // gettersの処理
    },
  }

Q. gettersの呼び出し方法

A. index.js に記述されているsotre -> gettersの場合
    <div>
      {{ $store.getters.idplus }}
    </div>
A. index.js 以外記述されているsotre -> gettersの場合 

ここでは、store/me.js に記述されているstoreとします。

    <div>
      {{ $store.getters['me/idplus'] }}
    </div>

Q. mapGettersの目的

gettersを呼び出す際に、記述が冗長になりがちです。
各Vueファイル上で、gettersを繰り返す呼び出す場合やコード記述量を減らしたい場合に利用します。

Q. mapGettersの記述方法

gettersを記述していれば、呼び出せます。 mapGettersのための記述は必要ありません。

Q. mapGettersの呼び出し方法

Vueファイル script内にて

import { mapGetters } from 'vuex'
A. index.js に記述されているsotre -> gettersの場合
  computed: {
    ...mapGetters({ idplus:  'idplus', // idplusで命名
    })
  },
A. index.js に記述されているsotre -> gettersの場合

ここでは、store/me.js に記述されているstoreとします。

  computed: {
    ...mapGetters({ idplus:  'me/idplus', // idplusで命名
    })
  },

idplusで命名しているので、下記で呼び出します。

    <div>
      {{ idplus }}
    </div>

[Vue.js/Nuxt] Storeを複数作成した場合のデータアクセス方法

分かりにくい標題で申し訳ありません。
Storeを利用する場合は、
Storeディレクトリにindex.jsファイルを作成して、state, getters, mutations, actionsを記述していくかと思います。

しかし、index.js以外の情報をStoreで保持したい場合はどうでしょうか。Storeで複数ファイルを利用する方法と、データアクセス方法について解説していきます。

Storeディレクトリの配下を下記とします。 
※me.jsは認証ユーザーの情報を保持するStoreとします。

/* 省略 */
Store
  L index.js
  L me.js

①:stateへのアクセス

まずは、stateへのアクセスについて見ていきたいと思います。

index.jsのstate
export const state = () => ({
    txt: 'texttext',
  })
// state以外省略
me.jsのstate
export const state = () => ({
  id: 0,
  name: 'taro',
  email: 'taro@gmail.com',
  })
// state以外省略

consoleで確認していきます。

任意のComponent内で、下記consoleを実施して下さい。

console.log(store.state);

結果は下記が出力されます。

me: (...)
txt: "texttext"

これは何が出力されたのでしょうか。
ドリルダウンしてme: (…)の中身をクリックしてみると。下記が表示されます。

me: Object
id: 1
name: "taro"
email: 'taro@gmail.com',

つまり、console.log(store.state);はStoreに保持している全てのstateを出力しました。しかし、index.jsファイルと、me.jsファイルではアクセス方法が少し異なります。

①-1;me.jsのstateをダイレクトにアクセス

次に、me.jsのstateをダイレクトにアクセスしてみます。下記のconsoleを呼び出して下さい。

console.log(store.state.me);

結果は下記です。 単純ですね。

id: 1
name: "taro"
email: 'taro@gmail.com',

②:actions, mutationsへのアクセス

それでは、他のメソッドについても見ていきます。

me.jsにてactions, mutationsを定義していきます。

  export const mutations = {
    setMe(state, payload) {
      state.id = payload.id
      state.name = payload.name
    },
  }
  
  export const actions = {
    async setMeActions({ commit, state }, payload ) {
        // console.log(state);
        commit('setMe', payload)
    },
  }

任意のComponent内から、me.js内のactions, mutationsへアクセスする方法は下記です。

store.dispatch('me/setMe' ,payload )
store.commit('me/setMeActions' ,payload )