Contexto
No Vue 2.0, a documentação e outros indicam claramente que a comunicação de pai para filho ocorre por meio de adereços.
Questão
Como um pai ou mãe diz a seu filho que um evento aconteceu por meio de acessórios?
Devo apenas assistir a um objeto chamado evento? Isso não parece certo, nem alternativas ( $emit
/ $on
é da criança para a mãe, e um modelo de hub é para elementos distantes).
Exemplo
Eu tenho um contêiner pai e ele precisa informar ao contêiner filho que não há problema em envolver determinadas ações em uma API. Eu preciso ser capaz de disparar funções.
javascript
vue.js
event-handling
vuejs2
jbodily
fonte
fonte
ref
vez de criar um suporte, que observe seu valor e depois o emita para outra função no pai? Quero dizer, ele tem muitas coisas para fazer, mas está usandoref
até seguro? Obrigadoref
é seguro. Geralmente, é desencorajado porque a comunidade Vue prefere passar o estado para os filhos e os eventos de volta aos pais. De um modo geral, isso leva a componentes mais isolados e consistentes internamente (uma coisa boa ™). Mas, se as informações que você está passando para a criança realmente são um evento (ou um comando), modificar o estado não é o padrão certo. Nesse caso, chamar um método usando aref
é totalmente bom e não vai falhar nem nada.O que você está descrevendo é uma mudança de estado no pai. Você passa isso para a criança através de um suporte. Como você sugeriu, você faria
watch
isso. Quando a criança toma uma ação, ela notifica o pai por meio de umemit
e o pai pode alterar o estado novamente.Mostrar snippet de código
Se você realmente deseja transmitir eventos para uma criança, pode fazer isso criando um barramento (que é apenas uma instância do Vue) e passando-o para a criança como suporte .
fonte
v-model
do componente, também poderá redefinir facilmente o valor emitindo o evento correspondente com menos código.prop
em uma criança, uma propriedade extradata
e adicionarwatch
... Seria confortável se houvesse suporte interno para, de alguma forma, transferir eventos de pai para filho. Esta situação ocorre com bastante frequência.Você pode usar
$emit
e$on
. Usando o código @RoyJ:html:
javascript:
Exemplo de execução: https://jsfiddle.net/rjurado/m2spy60r/1/
fonte
Se você tiver tempo, use o armazenamento Vuex para assistir variáveis (também conhecido como estado) ou acionar (conhecido como despachar) uma ação diretamente.
fonte
Não gostou da abordagem de barramento de eventos usando
$on
ligações no filho durantecreate
. Por quê? Ascreate
chamadas subseqüentes (estou usandovue-router
) vinculam o manipulador de mensagens mais de uma vez - levando a várias respostas por mensagem.A solução ortodoxa de passar adereços de pai para filho e colocar um observador de propriedades na criança funcionou um pouco melhor. O único problema é que a criança só pode agir em uma transição de valor. Passar a mesma mensagem várias vezes precisa de algum tipo de contabilidade para forçar uma transição, para que a criança possa pegar a mudança.
Descobri que, se envolver a mensagem em uma matriz, ela sempre acionará o observador de crianças - mesmo que o valor permaneça o mesmo.
Pai:
Criança:
HTML:
fonte
Uma maneira simples e dissociada de chamar métodos em componentes filhos é emitindo um manipulador do filho e depois invocando-o do pai.
O pai controla as funções e chamadas do manipulador filho sempre que necessário.
fonte
O exemplo abaixo é auto-explicativo. onde referências e eventos podem ser usados para chamar a função de e para pai e filho.
fonte
Penso que devemos ter uma consideração sobre a necessidade dos pais de usar os métodos da criança. De fato, os pais não precisam se preocupar com o método da criança, mas podem tratar o componente filho como uma FSA (máquina de estados finitos). para controlar o estado do componente filho. Portanto, a solução para observar a mudança de status ou apenas usar a função de computação é suficiente
fonte
você pode usar a tecla para recarregar o componente filho usando a tecla
Se você deseja recarregar o componente com o novo filtro, se clicar no botão filtrar o componente filho
e use o filtro para ativar a função
fonte