Uso o Vue há algum tempo, e minha experiência sempre foi um método que será recalculado se os dados reativos subjacentes forem atualizados. Encontrei informações conflitantes no SO:
- Eu estava tentando responder a essa pergunta e disseram várias vezes que esse não era o caso.
- A resposta aceita aqui indica que "[um método] só será avaliado quando você o chamar explicitamente".
Eu procurei nos documentos e não vi nada incrivelmente claro.
Se eles não são reativos, por que esse exemplo funciona?
<ul>
<li v-for="animal in animals" :key="animal.id">
<span v-if="isAwesome(animal)">{{ animal.name }}</span>
</li>
</ul>
export default {
data() {
return {
awesomeAnimalIds: [],
animals: [
{ id: 1, name: 'dog' },
{ id: 5, name: 'cat' },
{ id: 9, name: 'fish' },
],
};
},
created() {
setTimeout(() => {
this.awesomeAnimalIds.push(5);
}, 1000);
setTimeout(() => {
this.awesomeAnimalIds.push(9);
}, 2000);
},
methods: {
isAwesome(animal) {
return this.awesomeAnimalIds.includes(animal.id);
},
},
};
Eu realmente gostaria de ter uma resposta definitiva e satisfatória a que esta comunidade possa se referir.
Respostas:
Com base em Como as alterações são rastreadas nos documentos, veja o que está acontecendo:
Um inspetor especial é criado para a instância do componente para determinar quando uma nova renderização é necessária.
O Vue converte todas as propriedades de
data
para getters e setters.isAwesome
é feita uma chamada para o modelo.isAwesome
, o getter paraawesomeAnimalIds
é invocado.awesomeAnimalIds
campo dedata
.awesomeAnimalIds
é atualizado, o que chama oawesomeAnimalIds
setter.data
campo que recebeu uma notificação, uma nova renderização é acionada.A partir deste e deste exemplo acima, podemos concluir o seguinte:
Existe um equívoco comum de que os métodos são "invocados apenas uma vez" ou "acionam e esquecem" quando chamados a partir de um modelo. Claramente nem sempre é esse o caso, porque métodos podem estabelecer uma dependência reativa .
Então, quando devemos usar uma propriedade computada versus um método?
Consulte a seção do guia sobre Armazenamento em cache versus métodos . Aqui está a minha opinião:
fetch
deles.fonte
Não, os métodos não são reativos. Somente dados podem ser reativos no Vue.
MAS é importante entender como o Vue funciona ...
data()
membros (faz isso o tempo todo, não apenas durante a 1ª renderização). Se algum dos dados for acessado durante a renderização, o Vue saberá que o conteúdo desse membro de dados influencia o resultado da renderização.Não importa se você referenciar o membro de dados diretamente, usá-lo em
computed
ou em ummethod
. Se os dados forem "tocados" durante a renderização, a alteração dos dados acionará a nova renderização no futuro ...fonte
Este é um caso muito interessante.
Pelo que li e pela minha experiência, posso dizer que: Não, os métodos não são inerentemente reativos. Um método deve ser explicitamente chamado para sua execução.
Mas, como posso explicar seu caso? Coloquei seu código em uma caixa de areia e, com certeza, conforme você introduz os IDs na matriz, o modelo é atualizado para exibir o nome do animal. Isso indicaria alguma reatividade. O que da?
Bem, eu fiz um experimento. Eu adicionei um simples
div
a cada loop que gera um número aleatório quando gerado.E o que eu vi foi que toda vez que um novo ID era inserido na matriz, todos os números aleatórios mudavam. Essa é a chave para entender por que "parece" como se o método
isAwesome
fosse reativo.De alguma forma, quando um novo ID é enviado para a matriz, o Vue renderiza novamente o loop completamente, executando os métodos novamente. Não posso explicar o funcionamento interno do porquê o vue renderiza todo o ciclo, o que exigiria mais pesquisas.
Então, para responder sua pergunta.
isAwesome
não é reativo, é apenas uma ilusão criada pela re-renderização do loop.fonte
update
que causare-render