(Vue 2.7 クラスコンポーネント → Composition API 書き換え実例)
クラスコンポーネントでは @Prop
や get
, methods
を使っていた
Composition API では
→ defineProps()
→ computed()
→ setup()
内の関数定義
に書き換える。
→ 型安全も強化できて、テストもしやすくなる。
<!-- Greeting.vue -->
<template>
<div>
<p>Hello, {{ upperName }}</p>
<button @click="greet">Greet</button>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop } from 'vue-property-decorator';
@Component
export default class Greeting extends Vue {
@Prop({ default: 'Guest' }) readonly name!: string;
get upperName(): string {
return this.name.toUpperCase();
}
greet(): void {
console.log(`Hello, ${this.name}!`);
}
}
</script>
<!-- Greeting.vue -->
<template>
<div>
<p>Hello, {{ upperName }}</p>
<button @click="greet">Greet</button>
</div>
</template>
<script lang="ts" setup>
import { defineProps } from 'vue';
import { computed } from 'vue';
const props = defineProps<{ name?: string }>();
const name = props.name || 'Guest';
const upperName = computed(() => name.toUpperCase());
const greet = (): void => {
console.log(`Hello, ${name}!`);
};
</script>
機能 | クラスコンポーネント | Composition API |
---|---|---|
props | @Prop() |
defineProps() |
computed | get upperName() |
computed(() => ...) |
methods | greet(): void { ... } |
const greet = () => { ... } |
props の型 | Decorator で指定 | { name?: string } で型付け |
import { shallowMount } from '@vue/test-utils';
import Greeting from '@/components/Greeting.vue';
describe('Greeting.vue (クラス)', () => {
it('upperName computed の確認', () => {
const wrapper = shallowMount(Greeting, {
propsData: { name: 'Vue' },
});
expect(wrapper.vm.upperName).toBe('VUE');
});
});