One solution is to use the sync
modifier along with computed getters and setters:
Parent Component
<template>
...
<PaymentMethod :method.sync="method" :term.sync="term"/>
...
<b-btn class="float-right" variant="primary" @click="add">
OK
</b-btn>
...
</template>
<script>
export default {
data () {
return {
method: null,
term: null
}
},
...
}
</script>
Child Component
<template>
...
<b-form-select v-model="_method" :options="methodOptions" />
...
<b-form-select v-model="_term" :options="termOptions" />
...
</template>
<script>
export default {
props: ['method', 'term'],
computed: {
_method: {
get () {
return this.method
},
set (value) {
this.$emit('update:method', value)
}
},
_term: {
get () {
return this.term
},
set (value) {
this.$emit('update:term', value)
}
},
},
...
}
</script>
Now with the parent component’s add
method you have access to the child’s selected method
and term
options:
methods: {
add() {
// this.method is the value of _method
// this.term is the value of _term
}
}
Update
Since you’ve stated you want both the value and text of the selected term / method, I would suggest the following changes:
Parent
<template>
...
<PaymentMethod :methods="methods"
:terms="terms"
:method.sync="method"
:term.sync="term"/>
...
<b-btn class="float-right" variant="primary" @click="add">
OK
</b-btn>
...
</template>
<script>
export default {
data () {
return {
// define your method and term arrays in the parent component.
// pass them as props to the child component.
methods: [{...}, {...}, {...}],
terms: [{...}, {...}, {...}],
method: null,
term: null
}
},
// use computed properties to retrieve the selected method / term option.
computed: {
selectedMethod () {
return this.methods.find(method => method.value === this.method)
},
selectedTerm () {
return this.terms.find(term => term.value === this.term)
},
}
...
}
</script>
Child
<template>
...
<b-form-select v-model="_method" :options="methods" />
...
<b-form-select v-model="_term" :options="terms" />
...
</template>
<script>
export default {
props: ['method', 'term', 'methods', 'terms'],
computed: {
_method: {
get () {
return this.method
},
set (value) {
this.$emit('update:method', value)
}
},
_term: {
get () {
return this.term
},
set (value) {
this.$emit('update:term', value)
}
},
},
...
}
</script>
5
solved How can I use data in the child component that are updated in parent component using Vue.js?