了解です!
ではそのまま続けて 第3章 3.4 コード比較(Before / After) に入ります。
ここでは、これまでの変換を 一気に見比べられる形で整理 します。
クラス → Composition API(useStore
)→ コンポーザル関数(useCounterStore.ts
)
この3段階でどう変わったのかを確認します。
<template>
<!-- 子にstateのcountを渡し、emitでmutationを呼び出す -->
<ChildComponent :count="count" @increment="incrementCount" />
</template>
<script lang="ts">
// 必要なものをインポート
import Vue from 'vue';
import Component from 'vue-class-component';
import { mapState, mapMutations } from 'vuex';
import ChildComponent from './ChildComponent.vue';
@Component({
components: { ChildComponent },
computed: {
...mapState(['count']),
},
methods: {
...mapMutations(['increment']),
},
})
export default class ParentComponent extends Vue {
// mutation呼び出し
incrementCount() {
this.increment();
}
increment!: () => void;
get count(): number {
return 0; // mapStateで上書きされる
}
}
</script>
<template>
<ChildComponent :count="count" @increment="incrementCount" />
</template>
<script lang="ts" setup>
// 必要なものをインポート
import { useStore } from 'vuex';
import { State } from '@/store';
import { computed } from 'vue';
import ChildComponent from './ChildComponent.vue';
// ストアインスタンス取得
const store = useStore<State>();
// computedでstate.countを取得
const count = computed(() => store.state.count);
// commitでmutation呼び出し
function incrementCount() {
store.commit('increment');
}
</script>
<template>
<ChildComponent :count="count" @increment="increment" />
</template>
<script lang="ts" setup>
// useCounterStoreから必要なものを取得
import { useCounterStore } from '@/composables/useCounterStore';
import ChildComponent from './ChildComponent.vue';
// composable関数でstateとmutationを取得
const { count, increment } = useCounterStore();
</script>
クラス | Composition API (useStore) | コンポーザル関数 (useCounterStore ) |
|
---|---|---|---|
state取得 | this.count |
computed(() => store.state.count) |
count (computed) |
mutation呼び出し | this.increment() |
store.commit('increment') |
increment() |
state/mutation の型安全 | 弱い (手動で型付け) | 強い (useStore<State>() ) |
もっと強い(補完付き関数で呼べる) |
コード量 | 長い | 少しスッキリ | かなりスッキリ |
typo防止 | なし | なし(文字列) | あり(関数名で呼べる) |