Contexto
En Vue 2.0, la documentación y otros indican claramente que la comunicación de padres a hijos se realiza a través de accesorios.
Pregunta
¿Cómo le dice un padre a su hijo que un evento ha sucedido a través de accesorios?
¿Debo ver un accesorio llamado evento? Eso no se siente bien, ni las alternativas ( $emit
/ $on
es para hijo a padre, y un modelo central es para elementos distantes).
Ejemplo
Tengo un contenedor principal y necesita decirle a su contenedor secundario que está bien comprometer ciertas acciones en una API. Necesito poder activar funciones.
javascript
vue.js
event-handling
vuejs2
jbodily
fuente
fuente
ref
lugar de crear un accesorio, que mira su valor y luego lo emite a otra función en padre? Quiero decir que tiene muchas cosas que hacer, pero ¿esref
seguro usarlo ? Graciasref
es seguro. En general, se desaconseja porque la comunidad Vue prefiere pasar el estado a los niños y los eventos a los padres. En términos generales, esto conduce a componentes más aislados y consistentes internamente (algo bueno ™). Pero, si la información que le pasa al niño realmente es un evento (o un comando), modificar el estado no es el patrón correcto. En ese caso, llamar a un método usando aref
está totalmente bien, y no se bloqueará ni nada.Lo que está describiendo es un cambio de estado en el padre. Se lo pasas al niño a través de un accesorio. Como sugirió, sería
watch
ese accesorio. Cuando el niño toma medidas, notifica al padre a través de unemit
, y el padre puede cambiar el estado nuevamente.Mostrar fragmento de código
Si realmente desea pasar eventos a un niño, puede hacerlo creando un autobús (que es solo una instancia de Vue) y pasándolo al niño como accesorio .
fuente
v-model
en el componente, también puede restablecer fácilmente el valor emitiendo el evento correspondiente con menos código.prop
en un niño, una propiedad adicional endata
, luego agregarwatch
... Sería cómodo si hubiera un soporte incorporado para transferir de alguna manera los eventos de padre a hijo. Esta situación ocurre con bastante frecuencia.Puedes usar
$emit
y$on
. Usando el código @RoyJ:html:
javascript:
Ejemplo de ejecución: https://jsfiddle.net/rjurado/m2spy60r/1/
fuente
Si tiene tiempo, use la tienda Vuex para ver variables (también conocido como estado) o desencadenar (también conocido como despachar) una acción directamente.
fuente
No me gustó el enfoque del bus de eventos usando
$on
enlaces en el niño durantecreate
. ¿Por qué?create
Llamadas posteriores (estoy usandovue-router
) vinculan el controlador de mensajes más de una vez, lo que genera múltiples respuestas por mensaje.La solución ortodoxa de pasar los accesorios de padres a hijos y poner un vigilante en el niño funcionó un poco mejor. El único problema es que el niño solo puede actuar en una transición de valor. Pasar el mismo mensaje varias veces necesita algún tipo de contabilidad para forzar una transición para que el niño pueda recoger el cambio.
Descubrí que si envuelvo el mensaje en una matriz, siempre activará el observador secundario, incluso si el valor sigue siendo el mismo.
Padre:
Niño:
HTML:
fuente
Una forma simple de desacoplar los métodos de llamada en componentes secundarios es emitir un controlador desde el elemento secundario y luego invocarlo desde el elemento primario.
El padre realiza un seguimiento de las funciones y llamadas del controlador secundario siempre que sea necesario.
fuente
El siguiente ejemplo es auto explicativo. donde las referencias y los eventos se pueden utilizar para llamar a la función desde y hacia padre e hijo.
fuente
Creo que deberíamos tener en cuenta la necesidad de que los padres usen los métodos del niño. De hecho, los padres no deben preocuparse por el método del niño, sino que pueden tratar el componente infantil como una FSA (máquina de estados finitos). para controlar el estado del componente secundario. Por lo tanto, la solución para observar el cambio de estado o simplemente usar la función de cálculo es suficiente
fuente
puede usar la clave para recargar el componente secundario usando la clave
Si desea volver a cargar el componente con un nuevo filtro, si hace clic en el botón, filtre el componente secundario
y usa el filtro para activar la función
fuente