// ファイル名: ParentComponent.vue
<script lang="ts">
import { Vue, Component, Watch } from 'vue-property-decorator';
import { namespace } from 'vuex-class';
import ChildComponent from './ChildComponent.vue';
const SampleModule = namespace('sampleModule');
@Component({
components: {
ChildComponent,
},
})
export default class ParentComponent extends Vue {
// v-modelで使うデータ
private childValue: string = '初期値';
// Vuexのgetter
@SampleModule.Getter('textLength') private textLength!: number;
@SampleModule.Getter('currentRouteName') private currentRouteName!: string;
// v-modelで受け取った値の変化をwatch
@Watch('childValue')
onChildValueChanged(newVal: string, oldVal: string) {
console.log('Child value changed:', newVal, oldVal);
}
}
</script>
<script setup lang="ts">
)// ファイル名: ParentComponent.vue
<script setup lang="ts">
// 必要な関数をインポート
import { ref, watch } from 'vue';
import ChildComponent from './ChildComponent.vue';
// v-modelに使うreactiveな値
const childValue = ref<string>('初期値');
// Getter相当のダミー(本来はinjectや別モジュールで取得想定)
const textLength = ref<number>(0);
const currentRouteName = ref<string>('');
// childValueをwatchで監視して、変更時にログ出力
watch(
childValue,
(newVal: string, oldVal: string) => {
console.log('Child value changed:', newVal, oldVal);
}
);
</script>
<template>
<div>
<p>現在のテキスト長: {{ textLength }}</p>
<p>現在のルート名: {{ currentRouteName }}</p>
<ChildComponent v-model="childValue" />
<button>テキスト更新</button>
</div>
</template>
比較項目 | Before (クラスコンポーネント) | After (Composition API) |
---|---|---|
v-modelデータ | private childValue: string |
const childValue = ref<string>() |
watch記述方法 | @Watch('childValue') デコレータ |
watch(childValue, (new, old) => {}) 関数 |
Vuex getter | デコレータで直接使用 | 別途読み込み・注入が必要 |
型付け | デコレータ内で自動推論 | ref<string> とコールバックで明示的に型指定 |
ref<string>
型で宣言すると、watch
の型推論が素直に効く!newVal
, oldVal
にも明示的な型付けをして安全性を高める!@Watch
デコレータに頼る書き方は完全に廃止、すべてwatch
関数ベースに統一!クラスコンポーネントは「家の設計図」。
Composition APIは「自由にブロックを組み立てるレゴブロック」。