Digamos que eu tenho uma instância principal do Vue que possui componentes filhos. Existe uma maneira de chamar um método pertencente a um desses componentes completamente fora da instância do Vue?
Aqui está um exemplo:
var vm = new Vue({
el: '#app',
components: {
'my-component': {
template: '#my-template',
data: function() {
return {
count: 1,
};
},
methods: {
increaseCount: function() {
this.count++;
}
}
},
}
});
$('#external-button').click(function()
{
vm['my-component'].increaseCount(); // This doesn't work
});
<script src="http://vuejs.org/js/vue.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="app">
<my-component></my-component>
<br>
<button id="external-button">External Button</button>
</div>
<template id="my-template">
<div style="border: 1px solid; padding: 5px;">
<p>A counter: {{ count }}</p>
<button @click="increaseCount">Internal Button</button>
</div>
</template>
Então, quando clico no botão interno, o increaseCount()
método é vinculado ao seu evento de clique e é chamado. Não há como vincular o evento ao botão externo, cujo evento de clique eu estou ouvindo com o jQuery, portanto, precisarei de outra maneira de chamar increaseCount
.
EDITAR
Parece que isso funciona:
vm.$children[0].increaseCount();
No entanto, essa não é uma boa solução, pois estou referenciando o componente por seu índice na matriz filho e, com muitos componentes, é improvável que ele permaneça constante e o código seja menos legível.
javascript
vue.js
harryg
fonte
fonte
Respostas:
No final, optei por usar a
ref
diretiva de Vue . Isso permite que um componente seja referenciado pelo pai para acesso direto.Por exemplo
Tenha um componente registrado na minha instância pai:
Renderize o componente no template / html com uma referência:
Agora, em outro lugar, posso acessar o componente externamente
Veja este violino para um exemplo: https://jsfiddle.net/xmqgnbu3/1/
(exemplo antigo usando o Vue 1: https://jsfiddle.net/6v7y6msr/ )
fonte
vm
devido à forma como ele escopo os módulos. Você pode fazer algo comowindow.app = vm
no seumain.js
. Fonte: forum.vuejs.org/t/how-to-access-vue-from-chrome-console/3606Desde o Vue2, isso se aplica:
// no método do componente A
// no gancho criado do componente B
Veja aqui os documentos do Vue. E aqui estão mais detalhes sobre como configurar exatamente esse barramento de eventos.
Se você quiser obter mais informações sobre quando usar propriedades, eventos e / ou gerenciamento centralizado de estados, consulte este artigo .
fonte
bus
variável global , pode dar um passo adiante e injetar o barramento no seu componente usando adereços . Sou relativamente novo no assunto, portanto não posso garantir que isso seja idiomático.Você pode usar o sistema de eventos Vue
e
Aqui está o violino: http://jsfiddle.net/hfalucas/wc1gg5v4/59/
fonte
Uma versão ligeiramente mais simples (mais simples) da resposta aceita:
Tenha um componente registrado na instância pai:
Renderize o componente no template / html com uma referência:
Acesse o método do componente:
fonte
Você pode definir ref para componentes filho e, em pai, pode chamar via $ refs:
Adicione ref ao componente filho:
Adicione evento de clique ao pai:
fonte
Digamos que você tenha um
child_method()
componente filho:Agora você deseja executar o
child_method
componente pai from:Se você deseja executar um método do componente pai a partir do componente filho:
this.$parent.name_of_method()
NOTA: Não é recomendável acessar o componente filho e pai como este.
Em vez disso, como prática recomendada, use Adereços e Eventos para a comunicação entre pais e filhos.
Se você deseja comunicação entre componentes, use vuex ou barramento de eventos
Por favor, leia este artigo muito útil
fonte
Esta é uma maneira simples de acessar os métodos de um componente de outro componente
fonte
Aqui está um simples
fonte
Não tenho certeza se é o caminho certo, mas este funciona para mim.
Primeiro importe o componente que contém o método que você deseja chamar no seu componente
e chame qualquer método de MyCompenent
fonte
doSomething
estiver usando alguma coisa dos dados, esse método será inútil.Eu usei uma solução muito simples. Incluí um elemento HTML, que chama o método, no meu componente Vue que seleciono, usando o Vanilla JS, e aciono o clique!
No componente Vue, incluí algo como o seguinte:
Que eu uso usando o Vanilla JS:
fonte