<!-- ファイル名: Counter.vue (クラス版) -->
<template>
<div>
<p>{{ doubleCount }}</p>
<button @click="increment">+1</button>
</div>
</template>
<script lang="ts">
import { Component, Vue, Prop } from 'vue-property-decorator';
@Component
export default class Counter extends Vue {
// props の定義
@Prop({ default: 1 }) readonly step!: number;
// data 相当
count = 0;
// computed 相当
get doubleCount() {
return this.count * 2;
}
// methods 相当
increment() {
this.count += this.step;
}
// ライフサイクル
mounted() {
console.log('mounted!');
}
}
</script>
<!-- ファイル名: Counter.vue -->
<template>
<div>
<p>{{ doubleCount }}</p>
<button @click="increment">+1</button>
</div>
</template>
<script setup lang="ts">
// 1. props を defineProps で受け取る
const props = defineProps<{ step?: number }>();
const step = props.step ?? 1; // デフォルト値を設定
// 2. data を ref で定義
const count = ref(0);
// 3. computed で doubleCount を作成
const doubleCount = computed(() => count.value * 2);
// 4. methods 相当 → 関数定義
const increment = () => {
count.value += step;
};
// 5. ライフサイクルフック
onMounted(() => {
console.log('mounted!');
});
</script>
クラスコンポーネント | Composition API (<script setup> ) |
---|---|
@Prop({ default: 1 }) step! |
defineProps<{ step?: number }>() |
count = 0 |
const count = ref(0) |
get doubleCount() |
const doubleCount = computed(() => ...) |
increment() { this.count += ... } |
const increment = () => { count.value += ... } |
mounted() |
onMounted(() => {}) |
クラスコンポーネントは「工場長(this)に全部任せてる工場」。
Composition API は「各作業員(関数や変数)が自分の仕事をしっかり分担する職場」。
→ 混乱が少なく、見通しがいい。
次は「7-2. 見落としがちな落とし穴チェックリスト」に進めますか?