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を渡して回る必要がなくなって非常に便利になります(使いどころは考える必要がありますが)。


「epel-release」インストール後にyum installで「Cannot retrieve metalink for repository」と表示される場合の対処法
Nuxt.jsの「layouts」を使用してレイアウトの共通化を行う方法|Nuxt.jsの基本
Vue CLIでVue.jsの開発環境をセットアップするまでの流れ
CSSでclassがついていないタグにだけスタイルを当てる方法
HTMLが書ければすぐ習得できるテンプレートエンジン「EJS」の基本的な書き方
iOS Safariで文章の最後の1文字だけ改行されてしまう現象の対処法
HTMLタグの入力をラクにするスニペット集
Google Maps APIをローカル開発環境で使用するときの制限設定方法
手軽にコーディングの勉強ができるCodePenをもっと便利に使うための設定
pointer-eventsプロパティでクリックイベントを無効化にする|気になるCSSプロパティ
iTerm2で「Use System Window Restoration Setting」を設定しているとアラートが表示されて機能しない
Google Chromeのサイト内検索(カスタム検索)機能を別のプロファイルに移行する方法
iPadで入力モードを切り替えずに数字や記号をすばやく入力する方法
iPhoneやiPadでYouTubeの再生速度を3倍速や4倍速にする方法
Keynoteで有効にしているはずのフォントが表示されない現象
MacのKeynoteにハイライトされた状態でコードを貼り付ける方法
AirPodsで片耳を外しても再生が止まらないようにする方法
iTerm2でマウスやトラックパッドの操作を設定できる環境設定の「Pointer」タブ
DeepLで「インターネット接続に問題があります」と表示されて翻訳できないときに確認すること
Ulyssesの「第2のエディタ」表示を使って2つのシートを横並びに表示する
ウェブサイトをmacOSアプリとしてラッピングする「Unite Pro」
Keyboard Maestroの「Macro Debugger」で複雑なマクロのデバッグを行う方法
無料版でも高機能なランチャーアプリ「Raycast」の基本機能と環境設定
OnyXでターミナルを使わずにmacOSの詳細設定を行う
軽量で高速なターミナルエミュレーター「Ghostty」の設定方法
Eagleで実現するクリエイティブ素材の簡単管理
かゆいところに手が届く「Supercharge」でMac環境を便利にカスタマイズする
超軽量なコードエディタ 「Zed」をサブエディタとして活用する
Bartender 6で追加されたWidgets機能で自作メニューバーアイテムを簡単に作成する
Googleカレンダーを便利に活用するための小技集(祝日だけを表示・月末の繰り返しイベントを追加)