Nuxt.jsでVuexストア連携を行う方法|Nuxt.jsの基本

Vue.jsでは、現在の状態を管理するためにサイト全体で使えるVuexという仕組みがあります。
イメージとしてはグローバル変数のような存在で、全コンポーネントどこからでも参照・書き換えができます。
Nuxt.jsではこのVuexがデフォルトでインストールされているのですぐに利用できるのと、使い方がVue.js単体のときと少し違ってきます。
今回はそのVuexについてまとめておきます。
Nuxt.jsの概要やセットアップに関しては過去に記事にしているので、そちらをご覧ください。
Vuexの概要
Vuexは先ほども説明した通り、サイトの状態を管理するための仕組みです。
Vuex は Vue.js アプリケーションのための 状態管理パターン + ライブラリです。
これは予測可能な方法によってのみ状態の変異を行うというルールを保証し、アプリケーション内の全てのコンポーネントのための集中型のストアとして機能します。
Vue.jsではコンポーネント間のやり取りにpropsと$emitを使用します。
これだと、サイト全体で使うような情報はコンポーネントすべてに、このやり取りを記述して渡して回る必要があります。
Vuexを使えば、どのコンポーネントからでも参照・変更ができます。
「現在ログイン中かどうか」などのサイト全体で使いそうな情報は、Vuexで持っておくと便利です。
Vuexの利用は推奨されない?
なんでもかんでもVuexで管理しようとすると、今度は意図しない動作を生む可能性もあります。
特定のコンポーネントでVuexの変更をすると、全然関係ない別の場所の状態まで一緒に変わってしまうなんてことが起きてしまいます。
そうならないためにも、Vuexの利用は最低限が推奨されます。
Nuxt.jsのVuex使い方
Modules Modeで記述する
Vuexには「Modules Mode(モジュールモード)」と「Classic Mode(クラシックモード)」の2つの書き方があり、Classic ModeはNuxt.js 3以降は使えず、2.4以降で警告メッセージが表示されます。
そのため、「Modules Mode」を使うようにしましょう。
それぞれの違いですが、Modules Modeではstoreフォルダに複数の.jsファイルを作成します。
対するClassic Modeでは、storeフォルダにindex.jsを作成して、そこにすべて記述していきます。
下記いずれかの場合に、Modules Modeを使っていると判定されます。
index.jsがstoreオブジェクトをexportしていないindex.jsがそもそも存在していない場合
もともと、大規模なアプリケーションではClassic Modeだと管理がしにくいため、ファイル分割して管理できる方法としてModules Modeがありましたが、現在はちゃんと分割して管理することが推奨されるようになりました。
今回の記事では「Modules Mode」を前提に書いていきます。
基本の構成
storeフォルダ内に置いた.jsファイルが、ファイル名の名前を持つモジュールとして自動で登録されていきます。
index.jsの場合はグローバルに登録されます。
.jsファイルの中身は下記になります。
export const state = () => ({
変数名: 初期値,
変数名: 初期値
})
export const getters = {
// stateの状態を外部で取り出すときに使用する
変数名: state => state.変数名
}
export const mutations = {
ミューテーション関数名(state, 引数){
// ここでstate(ストアの状態)を変更する
state.変数名 = 値
}
}
export const actions = {
async アクション関数名({ commit }){
// ここでミューテーションを呼び出し、外部とのAPI通信や非同期処理も行う
commit('ミューテーション関数名', 引数)
}
}「state(ステート)」「getters(ゲッター)」「mutations(ミューテーション)」「actions(アクション)」という4つのデータがあります。
どこになにを書くのか覚えておきましょう。
| 記述する内容 | 備考 | |
|---|---|---|
| state | Vuexの状態(変数)を記述する | |
| getters | stateで記述した変数のうち、外部から呼び出したいものを記述する | 外部から呼び出す変数はここを見れば分かるようになる |
| mutations | stateの値を変更する処理を記述する | |
| actions | 外部とのやり取りや、mutationsの呼び出しを行う | 外部から呼び出す関数はここを見れば分かるようになる |
vueファイルでVuexの呼び出し
.vueファイル内で先ほど作成したVuexを呼び出したいときは、gettersの場合は「$store.getters['ファイル名/変数名']」で呼び出します。
index.jsに記述している場合は「$store.getters['変数名']」という風に直接変数名を書いて呼び出します。
actionsの場合は「$store.dispatch('ファイル名/変数名')」で呼び出します。
具体的な実装
実際に実装するとどのようになるのか、具体例を載せておきます。
今回はログイン状態を管理するため、「store」フォルダ内に「login.js」を作成してその中に記述します。
import axios from 'axios'
export const state = () => ({
isStatus: false,
})
export const getters = {
// stateの状態を外部で取り出すときに使用する
isStatus: state => state.isStatus
}
export const mutations = {
setStatus(state, isLogin){
// ここでstate(ストアの状態)を変更する
state.isStatus = isLogin
}
}
export const actions = {
async login({ commit }){
// ここでミューテーションを呼び出し、外部とのAPI通信や非同期処理も行う
const response = await axios.get('https://example.com/login')
if(response){
commit('setStatus', true)
}
}
}あとは.vueファイルから呼び出します。
<template>
<div>
<p>ログイン状態: {{$store.getters['login/isStatus']}}</p>
<button @click="$store.dispatch('login/login')">ログインする</button>
</div>
</template>どこで何をしているのかの把握が、最初は慣れないかもしれませんが、バケツリレーのようにpropsと$emitを渡して回る必要がなくなって非常に便利になります(使いどころは考える必要がありますが)。


効率的なマークアップが出来るようになるEmmetでHTMLを書く時の基本
gulpでPostCSSを使う方法
Visual Studio Codeで複数ファイルを編集するときにタブやペインの操作方法
Visual Studio CodeでMovable TypeのMTMLファイルを開く拡張機能「Movable Type Markup Language Syntax」
SVGを操作するためのCSSプロパティまとめ
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Vue CLI 3でfaviconの設定をする方法
Visual Studio CodeでToDoコメントを一覧で表示する拡張機能「Todo Tree」
Visual Studio Codeでパス補完機能を細かく設定して自分好みにできる拡張機能「Path Autocomplete」
効率的にHTMLを生成できるPugの特徴や記述方法
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
1つのノートアプリにすべて集約するのをやめた理由|2025年時点のノートアプリの使い分け
Notionログイン時の「マジックリンク」「ログインコード」をやめて普通のパスワードを使う
AlfredでNotion内の検索ができるようになるワークフロー「Notion Search」
Gitで1行しか変更していないはずのに全行変更した判定になってしまう
Macでアプリごとに音量を調節できるアプリ「Background Music」
Macのターミナルでパスワード付きのZIPファイルを作成する方法
MacBook Proでディスプレイのサイズ調整をして作業スペースを広げる
SteerMouseの「自動移動」機能で保存ダイアログが表示されたら自動でデフォルトボタンへカーソルを移動させる
iPhoneでタッチが一切効かなくなった場合に強制再起動する方法