Vue Composition API で props の変更を監視する:パフォーマンスの最適化
Vue Composition API/Vue 3 で props の変更を監視する方法
watch 関数の使用方法
import { watch } from 'vue'
export default {
setup() {
const count = ref(0)
watch(() => props.myProp, (newValue, oldValue) => {
console.log(`props.myProp が ${oldValue} から ${newValue} に変更されました。`)
// props.myProp の変更に応じてロジックを実行
})
return {
count,
// その他のロジック
}
}
}
この例では、props.myProp
プロパティの変更を監視し、変更があった場合はコンソールにログを出力しています。また、newValue
と oldValue
を使用して、新しい値と古い値を比較することもできます。
watchEffect
関数は、watch
関数と似ていますが、より汎用的なものです。watchEffect
関数は、反応性の変化に応じて関数をトリガーします。これは、props 以外にも、コンポーネント内の他の状態の変化を監視する場合に役立ちます。
import { watchEffect } from 'vue'
export default {
setup() {
const count = ref(0)
watchEffect(() => {
console.log(`props.myProp または count が変更されました。`)
// props.myProp または count の変更に応じてロジックを実行
}, () => {
return props.myProp + count.value
})
return {
count,
// その他のロジック
}
}
}
この例では、props.myProp
と count
のいずれかが変更されたときにコンソールにログを出力しています。また、watchEffect
関数の第二引数を使用して、監視する値を指定しています。
その他の注意点
watch
関数とwatchEffect
関数は、パフォーマンスに影響を与える可能性があります。そのため、本当に必要な場合にのみ使用するようにしてください。- props の変更を監視する必要がある場合は、できるだけ簡潔な方法で行うようにしてください。複雑なロジックは、別の関数に切り出すことができます。
Vue Composition API で props の変更を監視するサンプルコード
watch 関数を使用する例
import { ref, watch } from 'vue'
export default {
setup() {
const count = ref(0)
const message = ref('')
watch(() => props.myProp, (newValue, oldValue) => {
message.value = `props.myProp が ${oldValue} から ${newValue} に変更されました。`
console.log(message.value)
})
return {
count,
message
}
}
}
この例では、watch
関数を使用して props.myProp
プロパティの変更を監視しています。props.myProp
が変更されると、message
ref の値が更新され、コンソールにログが出力されます。
watchEffect 関数を使用する例
import { ref, watchEffect } from 'vue'
export default {
setup() {
const count = ref(0)
const message = ref('')
watchEffect(() => {
message.value = `props.myProp または count が ${props.myProp} と ${count.value} に変更されました。`
console.log(message.value)
},
// props.myProp と count を監視
() => props.myProp + count.value
)
return {
count,
message
}
}
}
補足
- 上記の例では、
props.myProp
という props を使用していますが、実際には任意の props を監視できます。 watch
関数とwatchEffect
関数は、どちらも非同期的に実行されます。そのため、message.value
などの ref の値を更新する場合は、watch
関数またはwatchEffect
関数の内部で実行するようにしてください。- コードの可読性を向上させるために、
watch
関数またはwatchEffect
関数の内部で実行されるロジックを別の関数に切り出すことができます。
Vue Composition API で props の変更を監視するその他の方法
computed
プロパティを使用して、props に基づいて計算される値を定義できます。computed
プロパティは、依存する props の値が変更されるたびに自動的に再計算されます。
export default {
setup() {
const doubledCount = computed(() => props.count * 2)
return {
doubledCount
}
}
}
この例では、doubledCount
という computed
プロパティを定義しています。このプロパティは、props.count
の値の 2 倍を返します。props.count
が変更されると、doubledCount
プロパティは自動的に再計算されます。
ref
関数を使用して props をラッピングすることで、その props の変更を監視できます。ref
で返されるオブジェクトには、value
プロパティと update
メソッドがあります。value
プロパティには props の現在の値が格納され、update
メソッドを使用して props の値を更新できます。
import { ref } from 'vue'
export default {
setup() {
const myPropRef = ref(props.myProp)
watch(myPropRef, (newValue, oldValue) => {
console.log(`props.myProp が ${oldValue} から ${newValue} に変更されました。`)
})
return {
// その他のロジック
}
}
}
この例では、myPropRef
という ref を使用して props.myProp
をラッピングしています。watch
関数を使用して myPropRef
の変更を監視し、props.myProp
が変更されるとコンソールにログを出力しています。
フォーム入力を監視する
v-model ディレクティブを使用して、フォーム入力を監視できます。v-model ディレクティブは、入力フィールドの値を props と自動的にバインドします。入力フィールドの値が変更されると、対応する props の値も更新されます。
<template>
<input type="text" v-model="myProp" />
<p>現在の値: {{ myProp }}</p>
</template>
この例では、<input>
フィールドの値を myProp
props にバインドしています。入力フィールドの値が変更されると、myProp
props の値も更新され、p
要素に表示されます。
適切な方法を選択する
props の変更を監視する方法はいくつかありますが、それぞれに長所と短所があります。状況に応じて適切な方法を選択する必要があります。
- watch 関数と watchEffect 関数: props の変更を監視する最も一般的な方法です。複雑なロジックを実行する場合に適しています。
- computed プロパティ: props に基づいて計算される値を定義する場合に適しています。
- ref を使用して props をラッピングする: 個々の props の変更を監視する場合に適しています。
- v-model ディレクティブ: フォーム入力を監視する場合に適しています。
どの方法を選択するにしても、コードが簡潔で読みやすいことを確認してください。
javascript typescript vue.js