J'ai un composant parent qui est un composant de formulaire qui a plusieurs composants enfants qui contiennent des champs d'entrée
<template> <div class="generalData"> <input name="name" type="text" v-bind:value="input.name" v-on:input="updateInput($event.target.value)"> <input name="age" type="text" v-bind:value="input.age" v-on:input="updateInput($event.target.value)"> <div/> </template> <script> export default { props: ['input'], data(){ return { } }, methods: { updateInput(value){ this.$emit('input', value); } } } </script>
et les composants enfants contiennent les champs de texte
<template> <div class="form"> <generalData v-model="input" /> <textAreas v-model="input"/> <button class="btn" @click="Submit()">Submit</button> <div/> </template> <script> export default { data(){ return { input: { name: '', age: '', address: '' bio: '' } } }, methods: { Submit(){ console.log('Submitting...'); console.log(this.input); } } } </script>
3 Réponses :
Vous devez utiliser le prop que vous avez défini à l'intérieur de votre composant. Vous avez nommé cette entrée prop, puis:
<template> <div class="form"> <generalData :input="input" /> <textAreas :input="input" /> <button class="btn" @click="submit">Submit</button> <div/> </template> <script> export default { data(){ return { input: { name: '', age: '', address: '' bio: '' } } }, methods: { submit(){ console.log('Submitting...'); console.log(this.input); } } } </script>
Essayez ce code:
<template> <div class="generalData"> <input type="text" v-model="person.name" @change="handleChange" @input="handleInput"> <input type="text" v-model="person.age" @change="handleChange" @input="handleInput"> <input type="text" v-model="person.address" @change="handleChange" @input="handleInput"> <input type="text" v-model="person.bio" @change="handleChange" @input="handleInput"> <div/> </template> <script> export default { props: ['value'], data () { return { person: { name: '', age: '', address: '' bio: '' } } }, methods: { handleChange () { return this.$emit('change', this.person) }, handleInput () { return this.$emit('input', this.person) }, setCurrentValue (person) { this.person = person } }, watch: { value (val) { if (!val) return this.setCurrentValue(val) } } } </script>
Une autre façon d'aborder cela serait de créer un composant d'entrée, puis d'itérer sur l'objet utilisateur en passant un attribut et en ayant v-model
directement sur l'entrée liée à la valeur. Si votre objet utilisateur se trouve dans votre instance de vue racine, vous pouvez accéder aux données en utilisant this. $ Root.whatEver
Découvrez ce violon https://jsfiddle.net/caseyjoneal/urgantzo/113/ a>