📦
composition-apiにreactiveな引数を渡したいときは関数で渡す
タイトルで終わり。以下補足。
こんな感じのcompositionがあったとする。
function useFoo(name: string) {
return {
message: computed(() => `Hello ${name}!`)
}
}
この場合name
はただのstring
なのでreactiveではない。
もしreactiveにしたい場合はref
やcomputedRed
を渡したくなる。
function useFoo(name: Ref<string> | ComputedRef<string>) {
return {
message: computed(() => `Hello ${name.value}!`)
}
}
もちろんこれで期待通り動くが、引数の型定義が冗長気味。もしname
がreactive
化されたobject
だったりしたらさらに型定義と処理の考慮を追加しないといけない。
詰まるところこのcomposition内では引数がRef
やComputedRef
なのかといったことに関心を持ちたくない。
そんなときはgeneratorを渡してしまえばすっきりする。
function useFoo(getName: () => string) {
return {
message: computed(() => `Hello ${getName()}!`)
}
}
呼び出し側は渡したいデータがRef
だろうと何だろうとgeneratorとして渡せばよい。
const name = ref('okada')
useFoo(() => name.value)
関数で渡しておくとwatch
などにそのまま突っ込むこともできて便利。
function useFoo(getName: () => string) {
watch(getName, () => { ... })
}
値の更新もしたい場合は作法よくsetterを渡す。Ref
を渡して好き勝手に変更されると何かと面倒が多い。
function useFoo(getName: () => string, setName: (name: string) => void) { ... }
Discussion
ComputedRefはRefを継承しているので、Refだけでcomputedも渡せますよ