🍇

Vueの状態管理ライブラリPiniaを使う

2023/01/25に公開

Piniaとは

ざっくり要約

  • Vueのストアライブラリで、コンポーネント/ページ間で状態を共有することができる
  • Vuexよりシンプルで使いやすいことを目的として作られた(Vuexとの違いはページ下部参照)
  • TypeScriptファースト

前提

  • node
  • npm
  • vue > 2.7 (vueの2.7以下を使用している場合、composition APIのインストールが別途必要です。)

Set Up

piniaのインストール

npm install pinia

piniaのinstance作成

import { createPinia } from "pinia";

// Init App
createApp(App)
  .use(createPinia())
  .mount("#app");

storeを定義

import { defineStore } from 'pinia'
import products from '@/data/products.json'

// unique across project
export const useProductStore = defineStore('productStore', {
    state: () => {
        return {
            products: [],
        }
    },
  
    // getters: {},

    // actions: {},
});

storeを使用

App.vue
<script setup>
import { useProductStore } from "./store/productStore";
const productStore = useProductStore()
</script>

<tmplate>
    <ul>
      <li
        v-for="product in productStore.products"
        :key="product.name"
        :product="product"
      />
    </ul>
</template>

actions,gettersを定義

import { defineStore } from 'pinia'
import products from '@/data/products.json'

// unique across project
export const useProductStore = defineStore('productStore', {
    state: () => {
        return {
           products: [],
        }
    },
  
   actions: {
        async fill() {
            this.products = (await import('@/data/products.json')).default
        }
    },

    getters: {
        count: (state) => state.products.length,
        isEmpty: (state) => state.count === 0
    },
});

actions, gettersを使用

<script setup>
import { useProductStore } from "./store/productStore";
const productStore = useProductStore()
productStore.fill()
</script>

<tmplate>
    Product数: {{ productStore.count }}
    <ul  v-if="!productStore.isEmpty">
      <li
        v-for="product in productStore.products"
        :key="product.name"
        :product="product"
      />
    </ul>
</template>

vuexとの違い

・変更(mutations)はもう存在しません。それらはしばしば非常に冗長だと見なされていました。彼らは最初に開発者ツールの統合をもたらしましたが、それはもう問題ではありません。
・TypeScriptをサポートするためのカスタム複雑なラッパーを作成する必要はありません、すべてがタイプされており、APIはできるだけTSタイプ推論を活用するように設計されています。
・インジェクトする魔法の文字列はもうありません、関数をインポートし、呼び出し、オートコンプリートを楽しんでください!
・ストアを動的に追加する必要はありません、デフォルトですべてが動的で、あなたはそれをすら気づきません。ただし、手動でストアを使用して、いつでも登録することもできますが、自動的になっているため、それについて心配する必要はありません。
・モジュールのネスト構造はもうありません。ストアを他のストアの中にインポートして使用することで、まだ暗黙的にネストすることはできますが、Piniaは設計上フラットな構造を提供しながら、ストア間のクロス組合の方法も提供します。ストア間の循環依存関係も持つことができます。
・名前空間モジュールはありません。ストアのフラットなアーキテクチャに対して、「名前空間」はそれらが定義される方法に固有であり、すべてのストアが名前空間化されていると言えるでしょう。

公式サイトより引用(原文和訳)

Discussion