O que criar-composavel-adaptavel faz?
Crie um composable Vue de nível de biblioteca que aceita entradas talvez reativas (MaybeRef / MaybeRefOrGetter), permitindo que os chamadores passem um valor simples, ref ou getter. Normalize as entradas com toValue()/toRef() dentro de efeitos reativos (watch/watchEffect) para manter o comportamento previsível e reativo. Use esta habilidade quando o usuário pedir para criar composáveis adaptáveis ou reutilizáveis.
Visão Geral
Esta habilidade ajuda a criar composables Vue que seguem as melhores práticas para aceitar entradas flexíveis. É especialmente útil ao construir bibliotecas de composables que precisam ser amigáveis ao usuário e reativas.
Quando Usar
- Quando o usuário pedir para criar um composable que aceite valores estáticos ou reativos.
- Quando o usuário mencionar
MaybeRefouMaybeRefOrGetter. - Ao projetar APIs de composables reutilizáveis.
Passos
- Entender o comportamento desejado do composable.
- Identificar parâmetros que devem aceitar entradas talvez reativas.
- Usar
MaybeRef<T>ouMaybeRefOrGetter<T>nos tipos dos parâmetros de entrada. - Dentro do composable, detectar se a entrada é reativa usando
toRef()outoValue().- Use
toRef()para rastreamento de reatividade contínuo dentro dewatchEffect. - Use
toValue()para obter o valor atual sem rastreamento (seguindo Vue 3.3+).
- Use
- Criar um efeito com
watchouwatchEffectpara realizar a lógica reativa principal. - Retornar um objeto com
refoucomputedpara expor o resultado de forma reativa.
Exemplo
import { ref, watchEffect, toValue, type MaybeRefOrGetter } from 'vue'
export function useContador(valorInicial: MaybeRefOrGetter<number>) {
const contagem = ref(0)
watchEffect(() => {
contagem.value = toValue(valorInicial)
})
function incrementar() {
contagem.value++
}
return { contagem, incrementar }
}
Dicas de TypeScript
- Use
MaybeRef<T>para aceitarT | Ref<T>. - Use
MaybeRefOrGetter<T>para aceitarT | Ref<T> | (() => T). - Considere usar genéricos para retornar o tipo correto.
Próximos Passos
Depois de escrever o composable, teste-o com diferentes formas de entrada:
- Valor estático:
useContador(5) - Ref:
const ref = ref(10); useContador(ref) - Getter:
useContador(() => someCondition.value ? 10 : 20)