Eu tenho um componente pai Search
que passa a propriedade query
para um componente filho Results
.
Pesquisa.vue
<template>
<div>
<input v-model="query" type="text" />
<Results :query="query" />
</div>
</template>
<script>
import { defineComponent } from "vue";
import Results from "./Results.vue";
export default defineComponent({
name: "Search",
components: { Results },
data() {
return {
query: "",
};
},
});
</script>
Resultados.vue
<template>
<div>{{ query }} ( {{ query.length }})</div>
</template>
<script setup>
import { defineProps, watch, computed } from "vue";
const { query } = defineProps({
query: {
type: String,
default: "",
},
});
const queryLength = computed(() => query.length);
watch(
() => query,
() => {
console.debug("Watcher was fired.");
}, {immediate: true}
);
watch(queryLength, () => {
console.debug("Watcher was fired.");
});
</script>
O observador do query
suporte nunca é acionado, exceto quando eu adiciono {immediate: true}
ao observador, mas ele não é acionado nas atualizações. Também não faz nada quando adiciono uma propriedade computada com base na query
propriedade.
O estranho é que ao exibir a query
prop, o valor é renderizado.
Aqui está a versão mais simples do meu código . O que estou fazendo de errado?
Você não pode desestruturar props diretamente como faz em
ou, para ser mais preciso, você pode fazer isso, mas os valores resultantes não serão reativos -
query
serão uma string simples. Portanto, o valor será renderizado, mas os observadores (entre outras coisas) não funcionarão.Para evitar o erro, não desestruture ou use a função utilitária toRefs() :