Estou começando a jogar com o vuejs (2.0). Criei uma página simples com um componente. A página possui uma instância do Vue com dados. Nessa página, registrei e adicionei o componente ao html. O componente tem um input[type=text]
. Quero que esse valor reflita no pai (instância principal do Vue).
Como atualizo corretamente os dados pai do componente? Passar um suporte vinculado do pai não é bom e lança alguns avisos para o console. Eles têm algo no documento, mas não está funcionando.
javascript
vue.js
vue-component
Gal Ziv
fonte
fonte
Respostas:
A ligação bidirecional foi descontinuada no Vue 2.0 em favor do uso de uma arquitetura mais orientada a eventos. Em geral, uma criança não deve alterar seus adereços. Em vez disso, deve
$emit
ocorrer eventos e deixar os pais responderem a esses eventos.No seu caso específico, você pode usar um componente personalizado
v-model
. Essa é uma sintaxe especial que permite algo próximo à ligação bidirecional, mas na verdade é uma abreviação para a arquitetura orientada a eventos descrita acima. Você pode ler sobre isso aqui -> https://vuejs.org/v2/guide/components.html#Form-Input-Components-using-Custom-Events .Aqui está um exemplo simples:
Os documentos afirmam que
é equivalente a
É por isso que o suporte à criança precisa ser chamado de valor e por que a criança precisa emitir um evento chamado
input
.fonte
undefined
até a primeira alteração. Veja este violino onde comenteiprops: ['value']
. Observe como o valor inicial éundefined
, em vez dehello
: jsfiddle.net/asemahle/8Lrkfxj6 . Após a primeira alteração, o Vue adiciona dinamicamente um valor prop ao componente, para que funcione.A partir da documentação :
Como passar adereços
A seguir está o código para passar adereços para um elemento filho:
Como emitir evento
HTML:
JS:
fonte
No componente filho:
No componente pai:
fonte
Componente filho
Use
this.$emit('event_name')
para enviar um evento para o componente pai.Componente pai
Para escutar esse evento no componente pai, fazemos
v-on:event_name
e um método (ex. handleChange
) que queremos executar nesse evento ocorreFeito :)
fonte
Eu concordo com as respostas de emissão de eventos e modelo v para as pessoas acima. No entanto, pensei em publicar o que encontrei sobre componentes com vários elementos de formulário que desejam emitir de volta para seus pais, pois esse parece ser um dos primeiros artigos retornados pelo google.
Sei que a pergunta especifica uma única entrada, mas essa parece a correspondência mais próxima e pode economizar tempo para as pessoas com componentes similares do vue. Além disso, ninguém mencionou o
.sync
modificador ainda.Tanto quanto sei, a
v-model
solução é adequada apenas para uma entrada retornando ao pai. Demorei um pouco para procurá-lo, mas a documentação do Vue (2.3.0) mostra como sincronizar vários adereços enviados ao componente de volta ao pai (via emissão, é claro).É chamado apropriadamente de
.sync
modificador.Aqui está o que a documentação diz:
Você também pode sincronizar vários de cada vez enviando um objeto. Confira a documentação aqui
fonte
A maneira mais simples é usar
this.$emit
Father.vue
Child.vue
Meu exemplo completo: https://codesandbox.io/s/update-parent-property-ufj4b
fonte
Também é possível passar adereços como Objeto ou Matriz. Nesse caso, os dados serão vinculados nos dois sentidos:
(Isso é observado no final do tópico: https://vuejs.org/v2/guide/components.html#One-Way-Data-Flow )
fonte
A maneira correta é para
$emit()
um evento no componente filho que a instância principal do Vue escuta .fonte
1) Componente filho: você pode usar assim no componente filho, escrever assim: this.formValue é enviar alguns dados para o componente pai
2) Parrent Compnenet: e no tag do componente parrent, receba variável de envio como esta: e este é o código para recuperar os dados do componente filho no tag do componente pai
fonte
Outra maneira é passar uma referência do seu setter do pai como um suporte para o componente filho, semelhante à maneira como eles fazem isso no React. Diga, você tem um método
updateValue
no pai para atualizar o valor, você pode instanciar o componente filho assim:<child :updateValue="updateValue"></child>
. Em seguida, sobre a criança terá um suporte correspondente:props: {updateValue: Function}
e no modelo de chamar o método quando a entrada muda:<input @input="updateValue($event.target.value)">
.fonte
Não sei por que, mas atualizei com êxito os dados pai com o uso de dados como objeto,
:set
&computed
Parent.vue
Child.vue
fonte
O exemplo dele mostrará como passar o valor de entrada para o pai no botão enviar.
Primeiro defina eventBus como novo Vue.
fonte
Eu acho que isso vai fazer o truque:
@change="$emit(variable)"
fonte