Tech note

備忘録

Nuxt + TypeScriptで、Vuexを扱う

概要

公式に記載があるvuex-module-decoratorsを使用して、Nuxt + TypeScriptの環境でVuexを扱う方法。
ストア - Nuxt TypeScript

環境

名称 Version
Node 14.10.1
Nuxt 2.14.5
Vue 2.6.12
TypeScript 3.9.7
Vuetify 2.3.10
nuxt-property-decorator 2.8.8
vuex-module-decorators 1.0.1

手順

npmのインストール

npm i vuex-module-decorators

ファイルの作成

~/store/index.ts

import { Store } from "vuex";
import { initialiseStores } from "~/utils/store-accessor";

const initializer = (store: Store<any>) => initialiseStores(store);

export const plugins = [initializer];
export * from "~/utils/store-accessor";

~/utils/store-accessor.ts

import { Store } from "vuex";
import { getModule } from "vuex-module-decorators";
import client from "~/store/client";

let clientStore: client;

function initialiseStores(store: Store<any>): void {
  clientStore = getModule(client, store);
}

export { initialiseStores, clientStore };

~/store/client.ts

import { Module, VuexModule, Mutation } from "vuex-module-decorators";

@Module({
  name: "client",
  stateFactory: true,
  namespaced: true
})
export default class Client extends VuexModule {
  private test: string = "";

  @Mutation
  public setTest(test: string) {
    this.test = test;
  }

  public get getTest() {
    return this.test;
  }
}
使用方法
Storeを扱う場合は、import文が必須
import { clientStore } from "~/store";
データの保存

client.tsで定義したMutationを使用してStoreにデータを保存する。

clientStore.setTest(格納したい値);
データの取得
clientStore.getTest;
備考

以下の方法でデータの保存は、エラーが発生するため出来ない。

clientStore.test = 格納したい値;
テストとして作成した画面のスクリーンショットソースコード

ボタンを押下すると、入力フォームに入力した値をStoreに格納後、別画面に遷移する。遷移先の画面で、Storeの値を取得して出力する画面を作成。 f:id:sbu8:20201011010811p:plain

<template>
  <div>
    <v-simple-table>
      <tbody>
        <tr>
          <td>
            <v-text-field
              v-model="inputTest"
            >
            </v-text-field>
          </td>
        </tr>
      </tbody>
    </v-simple-table>
    <v-btn @click="storeTestMethod">test</v-btn>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "nuxt-property-decorator";
import { clientStore } from "~/store";

@Component({})
export default class extends Vue {
  private inputTest: string = "";

  private storeTestMethod(): void {
    clientStore.setTest(this.inputTest);
    this.$router.push("/test");
  }
}
</script>

f:id:sbu8:20201011010843p:plain

<template>
  <div>
    <div>{{ storeTestData }}</div>
  </div>
</template>

<script lang="ts">
import { Component, Vue } from "nuxt-property-decorator";
import { clientStore } from "~/store";

@Component({})
export default class extends Vue {
  private storeTestData: string = "";

  beforeMount() {
    this.storeTestData = clientStore.getTest;
  }
}
</script>