Digamos que tengo una instancia principal de Vue que tiene componentes secundarios. ¿Hay alguna manera de llamar a un método que pertenece a uno de estos componentes desde fuera de la instancia de Vue por completo?
Aquí hay un ejemplo:
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>
Entonces, cuando hago clic en el botón interno, el increaseCount()
método está vinculado a su evento de clic, por lo que se llama. No hay forma de vincular el evento al botón externo, cuyo evento de clic estoy escuchando con jQuery, por lo que necesitaré alguna otra forma de llamar increaseCount
.
EDITAR
Parece que esto funciona:
vm.$children[0].increaseCount();
Sin embargo, esta no es una buena solución porque estoy haciendo referencia al componente por su índice en la matriz secundaria, y con muchos componentes es poco probable que se mantenga constante y el código es menos legible.
fuente
Respuestas:
Al final, opté por usar la
ref
directiva de Vue . Esto permite que un componente sea referenciado desde el padre para acceso directo.P.ej
Tener un competidor registrado en mi instancia principal:
Renderice el componente en template / html con una referencia:
Ahora, en otro lugar puedo acceder al componente externamente
Vea este violín para ver un ejemplo: https://jsfiddle.net/xmqgnbu3/1/
(antiguo ejemplo con Vue 1: https://jsfiddle.net/6v7y6msr/ )
fuente
vm
debido a la forma en que abarca los módulos. Puedes hacer algo comowindow.app = vm
en tumain.js
. Fuente: forum.vuejs.org/t/how-to-access-vue-from-chrome-console/3606Desde Vue2 esto aplica:
// en el método del componente A
// en el gancho creado del componente B
Vea aquí los documentos de Vue. Y aquí hay más detalles sobre cómo configurar este bus de eventos exactamente.
Si desea obtener más información sobre cuándo usar propiedades, eventos y / o administración de estado centralizada, consulte este artículo .
fuente
bus
variable global , puede ir un paso más allá e inyectar el bus en su componente utilizando accesorios . Soy relativamente nuevo en vue, así que no puedo asegurarte que esto sea idiomático.Puedes usar el sistema de eventos Vue
y
Aquí está el violín: http://jsfiddle.net/hfalucas/wc1gg5v4/59/
fuente
Una versión ligeramente diferente (más simple) de la respuesta aceptada:
Tener un componente registrado en la instancia principal:
Renderice el componente en template / html con una referencia:
Acceda al método componente:
fuente
Puede establecer la referencia para los componentes secundarios y luego, en la función principal, puede llamar a través de $ refs:
Añadir referencia al componente hijo:
Añadir evento de clic al padre:
fuente
Digamos que tiene un
child_method()
componente secundario:Ahora desea ejecutar
child_method
desde el componente primario:Si desea ejecutar un método de componente primario desde el componente secundario:
this.$parent.name_of_method()
NOTA: No se recomienda acceder al componente secundario y primario de esta manera.
En cambio, como práctica recomendada, use Props & Events para la comunicación entre padres e hijos.
Si desea comunicación entre componentes, seguramente use vuex o bus de eventos
Por favor lea este artículo muy útil
fuente
Esta es una manera simple de acceder a los métodos de un componente desde otro componente
fuente
Aquí hay uno simple
fuente
No estoy seguro de si es la forma correcta, pero esta me funciona.
Primero importe el componente que contiene el método al que desea llamar en su componente
y luego llame a cualquier método de MyCompenent
fuente
doSomething
está utilizando algo de los datos, este método es inútil.He usado una solución muy simple. ¡He incluido un elemento HTML, que llama al método, en mi Componente Vue que selecciono, usando Vanilla JS, y disparo el clic!
En el componente Vue, he incluido algo como lo siguiente:
Que uso usando Vanilla JS:
fuente