Estoy empezando a jugar con vuejs (2.0). Construí una página simple con un componente en ella. La página tiene una instancia de Vue con datos. En esa página me registré y agregué el componente a html. El componente tiene uno input[type=text]
. Quiero que ese valor se refleje en el padre (instancia principal de Vue).
¿Cómo actualizo correctamente los datos principales del componente? Pasar un accesorio encuadernado del padre no es bueno y arroja algunas advertencias a la consola. Tienen algo en su documento pero no funciona.
javascript
vue.js
vue-component
Gal Ziv
fuente
fuente
Respuestas:
El enlace bidireccional ha quedado en desuso en Vue 2.0 a favor del uso de una arquitectura más controlada por eventos. En general, un niño no debe mutar sus accesorios. Por el contrario, debe
$emit
eventos y dejar que el padre responda a esos eventos.En su caso específico, puede usar un componente personalizado con
v-model
. Esta es una sintaxis especial que permite algo cercano al enlace bidireccional, pero en realidad es una abreviatura de la arquitectura controlada por eventos descrita anteriormente. Puede leer sobre esto aquí -> https://vuejs.org/v2/guide/components.html#Form-Input-Components-using-Custom-Events .Aquí hay un ejemplo simple:
Los documentos afirman que
es equivalente a
Es por eso que el accesorio en el niño necesita ser nombrado valor, y por qué el niño necesita $ emitir un evento llamado
input
.fuente
undefined
hasta el primer cambio. Mira este violín donde he comentadoprops: ['value']
. Observe cómo es el valor inicialundefined
, en lugar dehello
: jsfiddle.net/asemahle/8Lrkfxj6 . Después del primer cambio, Vue agrega dinámicamente un valor de apoyo al componente, por lo que funciona.De la documentación :
Cómo pasar accesorios
El siguiente es el código para pasar accesorios a un elemento hijo:
Cómo emitir evento
HTML:
JS:
fuente
En componente hijo:
En el componente principal:
fuente
Componente hijo
Se usa
this.$emit('event_name')
para enviar un evento al componente principal.Componente principal
Para escuchar ese evento en el componente padre, hacemos
v-on:event_name
y seex. handleChange
produce un método ( ) que queremos ejecutar en ese eventoHecho :)
fuente
Estoy de acuerdo con la emisión de eventos y las respuestas del modelo v para los anteriores. Sin embargo, pensé en publicar lo que encontré sobre los componentes con múltiples elementos de formulario que desean emitir a sus padres, ya que este parece ser uno de los primeros artículos devueltos por Google.
Sé que la pregunta especifica una sola entrada, pero esta parecía la coincidencia más cercana y podría ahorrarle tiempo a las personas con componentes vue similares. Además, nadie ha mencionado el
.sync
modificador todavía.Hasta donde yo sé, la
v-model
solución solo es adecuada para una entrada que regresa a su padre. Me tomó un poco de tiempo buscarlo, pero la documentación de Vue (2.3.0) muestra cómo sincronizar múltiples accesorios enviados en el componente de regreso al padre (por medio de la emisión, por supuesto).Se llama apropiadamente el
.sync
modificador.Esto es lo que dice la documentación :
También puede sincronizar múltiples a la vez enviando a través de un objeto. Mira la documentación aquí
fuente
La forma más simple es usar
this.$emit
Padre vue
Child.vue
Mi ejemplo completo: https://codesandbox.io/s/update-parent-property-ufj4b
fuente
También es posible pasar accesorios como Object o Array. En este caso, los datos se vincularán en dos sentidos:
(Esto se observa al final del tema: https://vuejs.org/v2/guide/components.html#One-Way-Data-Flow )
fuente
La forma correcta es
$emit()
un evento en el componente secundario que la instancia principal de Vue escucha .fuente
1) Componente secundario: puede usar así en el componente secundario escribir así: this.formValue es enviar algunos datos al componente primario
2) Compnenet parental: y en la etiqueta del componente parental, se recibe una variable de envío como esta: y este es el código para recibir los datos de los componentes secundarios en la etiqueta del componente primario
fuente
Otra forma es pasar una referencia de tu setter del padre como un accesorio para el componente hijo, de forma similar a como lo hacen en React. Por ejemplo, que tiene un método
updateValue
en el padre para actualizar el valor, se puede crear una instancia del componente secundario de este modo:<child :updateValue="updateValue"></child>
. Luego, el niño tendrá un apoyo correspondiente:props: {updateValue: Function}
y en la plantilla de llamar al método cuando cambia la entrada:<input @input="updateValue($event.target.value)">
.fuente
No sé por qué, pero acabo de actualizar con éxito los datos primarios con el uso de datos como objeto,
:set
&computed
Parent.vue
Child.vue
fuente
Este ejemplo le dirá cómo pasar el valor de entrada al padre en el botón Enviar.
Primero defina eventBus como nuevo Vue.
fuente
Creo que esto hará el truco:
@change="$emit(variable)"
fuente