1
0

More than 3 years have passed since last update.

【Nuxt.js】データ・状態の一元管理(Vuex)を試してみた【勉強3】

Last updated at Posted at 2020-08-24

はじめに

自分が勉強した内容のまとめなので、正確性は保証しません。

こちらのサイトにcodesandboxを埋め込んでいます。

実際の振る舞いを見ながらコードの確認ができるので非常に便利です。

シンプルにcodesandboxめちゃくちゃおすすめなので、気になる方使ってみてください。

データ・状態の一元管理(Vuex)とは

今回はデータ・状態の管理に用いられる Vuex について紹介します。

プロジェクト内で複数のページ、コンポーネントを作成していると、

共通のデータを用いたい時が出てくると思います。

そんな時にデータの保管場所となってくれるのが、「Vuex」というプラグインです。

Vuex の公式サイト

※対象読者

Vue.js - HTML/CSS/Javascript を簡単に書けるフレームワーク

Nuxt.js - Vue.js をさらに便利にしたもの

WEB 系プログラムは触れたことがないが、上記くらいの知識を持っている。

プログラミングはやってみたいが、できる自信はない。緩く学びたい人。

利用するフォルダの確認と実装イメージ

Vuex では pages フォルダだけでなく、store フォルダも利用していきます。

  • store フォルダ:Vuex に格納する変数や必要な処理を用意します。

  • pages フォルダ:Vuex に格納した変数を取り出したり、格納したりします。

実際に Vuex を用いたカウントページを作成しました。

Home Page と About Page で count データを共有出来ていることがわかると思います。

こちらのサイトにcodesandboxを埋め込んでいますので、実際の振る舞いをご確認ください。

codesandbox のページをリロードすると、保管していたデータが消えていることがわかると思います。

これは、ブラウザ上にデータを保管していることで起きる現象です。

リロードしてもデータを消さないようにするには、ストレージを用意する必要があります。

Firestore など外部にストレージを用意するか、

vuex のプラグインである「vuex-persistedstate」を使い、

ローカルストレージ(cookie と似たようなイメージ)を用意することで、

リロードしてもデータを消さない WEB ページを実装することができます。

Vuex のコードの解説

store フォルダの実装

store フォルダに格納された index.js を見ていきましょう。

export const state = () => ({
  count: 0
});

export const mutations = {
  increment(state) {
    state.count++;
  },
  decrement(state) {
    state.count--;
  }
};

上記のコードは大きく 2 つの役割に分かれています。

「データの定義」と「データの操作」の定義です。

次のコードがデータを定義しているコードになっています。

export const state = () => ({
  count: 0
});

コード自体は非常にシンプルであり、ここで定義したデータが store に保持されます。

次のコードはデータを操作しているコードです。

export const mutations = {
  increment(state) {
    state.count++;
  },
  decrement(state) {
    state.count--;
  }
};

store 内のデータを操作できるのは、mutations に記載された操作からのみです。

今回のサンプルのように、pages フォルダや components フォルダに格納された vue ファイルからこれらの操作を呼び出し、データの変更を行います。

実際に呼び出している pages の index.vue ファイルがこちらです(script のみ抜粋)

<script>
export default {
  computed: {
    count() {
      return this.$store.state.count;
    }
  },
  methods: {
    increment() {
      this.$store.commit("increment");
    },
    decrement() {
      this.$store.commit("decrement");
    }
  }
};
</script>

上から少しずつ解説していきます(正しく解説出来ているかは怪しい)

次のコードで store に定義したデータを呼び出しています。

this.$store.state.count

store から呼び出した state.count を return で count に格納しています。

次が store に定義した操作を呼び出しているコードです。

this.$store.commit("increment")

先ほど store で定義した increment の操作を呼び出し、count の値を変更しています。

おわり

以上が vuex を用いたデータの共有と同期的な操作のやり方です。

データの管理まで出来れば、簡単なアプリケーションを作ることもできると思います。

お疲れ様でした。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0