Vue.jsはJavaScriptのフレームワークでページを部品単位で切り分けて定義することが得意です。一方、何かしらのモデル定義を作ったり、Vue.js用状態管理ツールVuexの定義する状態ストアの様にVue.jsの定義するコンポーネントの外に集約が存在するコードを書くこともあります。後者のパターンに入りながらもコンポーネントに囚われていると共通化すべき部分を個々のコンポーネントに重複して記述してしまう場合が出てきます。この記事ではそういった外部で共通化されたコードを注入する方法を紹介します。
コードは次です。
// AppConfigStore.ts /** 状態定義を記述したコードを省略 **/ export const lineColor = { // 簡素なsetter, getterを持つObjectを定義。このstoreに密に関わる部分のためstoreの役割にも合っている。 /** * @return {number} */ get() { return store.state.AppConfigStore.lineColor; }, /** * @param {string} newColor */ async set(newColor: string) { await store.dispatch('AppConfigStore/setLineColor', newColor); }, }; // Hoge.vue import {lineColor} from '@/store/MapStore'; import Vue from 'vue'; Vue.extend({ computed: { lineColor: lineColor, // importから読み込んだsetter,getterをあてはめ } });
コンポーネント外に定義を書いてコンポーネント内でimportするのみです。例ではcomputedですがpropsなど他にも色々使えます。注意点はコンポーネントを指すthisを外に持ち出そうとしないことです。これは難解になってミスが起きやすい上、外部コードに責務外のことまで任せることになりがちだからです。