Nos documentos do VueJs 2.0, não consigo encontrar nenhum gancho que ouça as props
alterações.
Os VueJs têm ganchos semelhantes onPropsUpdated()
ou semelhantes?
Atualizar
Como o @wostex sugeriu, tentei watch
minha propriedade, mas nada mudou. Então percebi que tenho um caso especial:
<template>
<child :my-prop="myProp"></child>
</template>
<script>
export default {
props: ['myProp']
}
</script>
Estou passando myProp
que o componente pai recebe para o child
componente. Então o watch: {myProp: ...}
não está funcionando.
javascript
vue.js
vuejs2
vue-component
Amio.io
fonte
fonte
Respostas:
Você pode
watch
adereços para executar algum código após as alterações de adereços:fonte
watch
. Devido ao seu exemplo, percebi que meu caso é um pouco diferente. Eu atualizei minha pergunta.Você já tentou isso?
https://vuejs.org/v2/api/#watch
fonte
Ele,
no meu caso, precisava de uma solução em que, a qualquer momento, qualquer objeto fosse alterado, precisava analisar meus dados novamente. Eu estava cansado de criar um observador separado para todos os meus adereços, então usei o seguinte:
O ponto principal a ser retirado deste exemplo é usar
deep: true
lo, para que ele observe não apenas $ props, mas também valores aninhados, como por exemploprops.myProp
Você pode saber mais sobre essas opções de exibição estendida aqui: https://vuejs.org/v2/api/#vm-watch
fonte
Você precisa entender, a hierarquia de componentes que você está tendo e como está passando os adereços. Definitivamente, seu caso é especial e geralmente não é encontrado pelos desenvolvedores.
Se myProp for alterado no componente pai, ele será refletido no componente filho.
E se myProp for alterado no componente filho, será refletido no componente neto.
Portanto, se myProp for alterado no componente pai, ele será refletido no componente neto. (Por enquanto, tudo bem).
Portanto, na hierarquia em que você não precisa fazer nada, os objetos serão inerentemente reativos.
Agora falando sobre subir na hierarquia
Se myProp for alterado no componente grandChild, não será refletido no componente filho. Você precisa usar o modificador .sync no filho e emitir um evento do componente grandChild.
Se myProp for alterado no componente filho, ele não será refletido no componente pai. Você precisa usar o modificador .sync no pai e emitir evento do componente filho.
Se myProp for alterado no componente grandChild, ele não será refletido no componente pai (obviamente). Você deve usar o modificador .sync filho e emitir um evento do componente neto; depois, assistir o componente prop no filho e emitir um evento de alteração que está sendo escutado pelo componente pai usando o modificador .sync.
Vamos ver algum código para evitar confusão
Parent.vue
Child.vue
Grandchild.vue
Mas depois disso você não deixará de notar os gritos avisos do vue dizendo
Novamente, como mencionei anteriormente, a maioria dos desenvolvedores não encontra esse problema, porque é um anti-padrão. É por isso que você recebe esse aviso.
Mas, para resolver seu problema (de acordo com o seu design). Eu acredito que você precisa fazer o trabalho acima (hackear para ser honesto). Eu ainda recomendo que você repense o seu design e faça com que seja menos propenso a erros.
Espero que ajude.
fonte
Não tenho certeza se você o resolveu (e se eu entendi corretamente), mas aqui está a minha ideia:
Se o pai receber o myProp e você desejar que ele passe para o filho e o assista no filho, o pai deverá ter uma cópia do myProp (não referência).
Tente o seguinte:
e em html:
na verdade, você precisa ter muito cuidado ao trabalhar em coleções complexas nessas situações (passando algumas vezes)
fonte
para ligação bidirecional, é necessário usar o modificador .sync
mais detalhes...
e você deve usar a propriedade watch no componente filho para ouvir e atualizar as alterações
fonte
Eu trabalho com uma propriedade computada como:
Recursos é, neste caso, uma propriedade:
fonte
Para mim, essa é uma solução educada para obter alterações específicas de um suporte e criar lógica com ele
Eu usaria
props
ecomputed
properties de variáveis para criar lógica depois de receber as alteraçõesEntão, poderíamos usar _objectDetail na renderização html
ou em algum método:
fonte
Você pode usar o modo de exibição para detectar alterações:
Faça tudo no nível atômico. Portanto, verifique primeiro se o próprio método watch está sendo chamado ou não, consolando algo dentro. Depois de estabelecer que o relógio está sendo chamado, esmague-o com sua lógica de negócios.
fonte
Uso propriedades
props
e variáveiscomputed
se precisar criar lógica depois para receber as alteraçõesfonte
se myProp for um objeto, ele não poderá ser alterado normalmente. portanto, o relógio nunca será acionado. a razão pela qual o myProp não foi alterado é que você acabou de definir algumas chaves do myProp na maioria dos casos. o myProp em si ainda é o único. tente assistir a adereços do myProp, como "myProp.a", ele deve funcionar.
fonte
A função de relógio deve colocar no componente Filho. Não é pai.
fonte
@JoeSchr tem uma boa resposta. aqui está outra maneira de fazer isso se você não quiser 'deep: true'.
fonte