了解です!
では 第2章 2.1「子コンポーネントのprops定義をdefineProps
に書き換える」 に入ります。
ここでは、まず 変換前(クラス形式)と変換後(Composition API / <script setup>
)のコードを比較 します。
defineProps
に書き換える<template>
<!-- ボタンをクリックするとincrementメソッドが発火 -->
<button @click="increment">Increment</button>
<!-- 親から受け取ったcountを表示 -->
<p>Count from parent: {{ count }}</p>
</template>
<script lang="ts">
// Vue, Component, Prop, Emitをインポート
import Vue from 'vue';
import Component from 'vue-class-component';
import { Prop, Emit } from 'vue-property-decorator';
@Component
// 子コンポーネントのクラス定義
export default class ChildComponent extends Vue {
// 親から渡されるカウント値をpropsで受け取る
@Prop({ type: Number, required: true })
count!: number;
// ボタンがクリックされたらincrementイベントをemitする
@Emit('increment')
increment() {
// emitするだけなので中身は空
}
}
</script>
<script setup>
) でのprops定義<template>
<!-- ボタンをクリックするとincrement関数が発火 -->
<button @click="increment">Increment</button>
<!-- 親から受け取ったcountを表示 -->
<p>Count from parent: {{ count }}</p>
</template>
<script lang="ts" setup>
// propsの型を定義
interface Props {
count: number;
}
// propsをdefinePropsで受け取る
const props = defineProps<Props>();
// emitsの型を定義
const emit = defineEmits<{
(event: 'increment'): void;
}>();
// incrementイベントをemitする関数
function increment() {
emit('increment');
}
</script>
機能 | 変換前 (クラス形式) | 変換後 (Composition API) |
---|---|---|
propsの受け取り | @Prop デコレーター |
defineProps<Props>() |
emitの定義 | @Emit('increment') |
defineEmits<{ (event: 'increment'): void }>() |
関数の形 | メソッド (クラス内) | 関数 (function increment() {} ) |
型安全 | TypeScriptの型明記 | interface Props + defineProps |
テンプレートの記述 | 変わらず (@click="increment" ) |
同じ (@click="increment" ) |
@Prop
/ @Emit
が使えないdefineProps
/ defineEmits
にすることで型推論が効く