在子组件之间传递数据
Passing data between child components
我正在努力让它发挥作用。我需要从 FormComponent 访问 ChooseLangComponent 中的 selected
值。有什么直接的方法可以做到这一点,或者我们必须从父组件传递它(充当中间人)?我已经尝试在 ChooseLangComponent 上使用 $emit
并在 FormComponent 上使用 v-on:..
但没有成功。
选择语言组件:
<template lang="html">
<div class="choose-lang">
<select v-model="selected">
<option v-for="lang in langs" v-bind:value="lang.value">{{lang.text}}</option>
</select>
</div>
</template>
<script>
export default {
data() {
return {
selected: 'en',
langs: [
{ text: 'English', value: 'en' },
{ text: 'German', value: 'ge' },
]
}
}
}
</script>
表单组件:
<template lang="html">
<div class="form-name">
<div class="inputs">
<input type="text" v-model="nameText" v-on:keyup.enter="send_name">
</div>
</div>
</template>
export default {
data() {
return {
nameText: '',
}
},
methods: {
send_name() {
// I need the selected language here
}
}
}
父组件:
<div id="app">
<choose-lang></choose-lang>
...
<form-comp></form-comp>
</div>
...
Vue.component('choose-lang', require('./components/ChooseLangComponent.vue'));
Vue.component('form-comp', require('./components/FormComponent.vue'));
const app = new Vue({
el: '#app',
data: {
...
});
好的,有 2 种简单的方法,如果您的应用程序规模很大,还有一种涉及 Vuex。
第一种方法是创建事件总线 - 想法是在一个集线器中发出事件,然后在需要的地方捕获它们。
const Bus = new Vue({})
Vue.component('lang', {
template: '#lang-tmp',
data() {
return {
selected: 'en',
langs: [
{ text: 'English', value: 'en' },
{ text: 'German', value: 'ge' },
]
}
},
created() {
this.changeLang()
},
methods: {
changeLang() {
Bus.$emit('langChanged', this.selected)
}
}
})
Vue.component('frm', {
template: '#frm-tmp',
data() {
return {
selectedItem: 'en'
}
},
created() {
Bus.$on('langChanged', (selected) => {
this.selectedItem = selected
})
}
})
const app = new Vue({
el: '#app'
})
http://jsbin.com/siyipuboki/edit?html,js,output
第二种方法是创建某种存储 - 保存所选项目状态的普通对象
const store = {
data: {
selected: null
}
}
Vue.component('lang', {
template: '#lang-tmp',
data() {
return {
selected: 'en',
langs: [
{ text: 'English', value: 'en' },
{ text: 'German', value: 'ge' },
]
}
},
created() {
this.changeLang()
},
methods: {
changeLang() {
store.data.selected = this.selected
}
}
})
Vue.component('frm', {
template: '#frm-tmp',
data() {
return {
storeSelected: store.data
}
}
})
const app = new Vue({
el: '#app'
})
http://jsbin.com/qagahabile/edit?html,js,output
另外请检查这个
我正在努力让它发挥作用。我需要从 FormComponent 访问 ChooseLangComponent 中的 selected
值。有什么直接的方法可以做到这一点,或者我们必须从父组件传递它(充当中间人)?我已经尝试在 ChooseLangComponent 上使用 $emit
并在 FormComponent 上使用 v-on:..
但没有成功。
选择语言组件:
<template lang="html">
<div class="choose-lang">
<select v-model="selected">
<option v-for="lang in langs" v-bind:value="lang.value">{{lang.text}}</option>
</select>
</div>
</template>
<script>
export default {
data() {
return {
selected: 'en',
langs: [
{ text: 'English', value: 'en' },
{ text: 'German', value: 'ge' },
]
}
}
}
</script>
表单组件:
<template lang="html">
<div class="form-name">
<div class="inputs">
<input type="text" v-model="nameText" v-on:keyup.enter="send_name">
</div>
</div>
</template>
export default {
data() {
return {
nameText: '',
}
},
methods: {
send_name() {
// I need the selected language here
}
}
}
父组件:
<div id="app">
<choose-lang></choose-lang>
...
<form-comp></form-comp>
</div>
...
Vue.component('choose-lang', require('./components/ChooseLangComponent.vue'));
Vue.component('form-comp', require('./components/FormComponent.vue'));
const app = new Vue({
el: '#app',
data: {
...
});
好的,有 2 种简单的方法,如果您的应用程序规模很大,还有一种涉及 Vuex。
第一种方法是创建事件总线 - 想法是在一个集线器中发出事件,然后在需要的地方捕获它们。
const Bus = new Vue({})
Vue.component('lang', {
template: '#lang-tmp',
data() {
return {
selected: 'en',
langs: [
{ text: 'English', value: 'en' },
{ text: 'German', value: 'ge' },
]
}
},
created() {
this.changeLang()
},
methods: {
changeLang() {
Bus.$emit('langChanged', this.selected)
}
}
})
Vue.component('frm', {
template: '#frm-tmp',
data() {
return {
selectedItem: 'en'
}
},
created() {
Bus.$on('langChanged', (selected) => {
this.selectedItem = selected
})
}
})
const app = new Vue({
el: '#app'
})
http://jsbin.com/siyipuboki/edit?html,js,output
第二种方法是创建某种存储 - 保存所选项目状态的普通对象
const store = {
data: {
selected: null
}
}
Vue.component('lang', {
template: '#lang-tmp',
data() {
return {
selected: 'en',
langs: [
{ text: 'English', value: 'en' },
{ text: 'German', value: 'ge' },
]
}
},
created() {
this.changeLang()
},
methods: {
changeLang() {
store.data.selected = this.selected
}
}
})
Vue.component('frm', {
template: '#frm-tmp',
data() {
return {
storeSelected: store.data
}
}
})
const app = new Vue({
el: '#app'
})
http://jsbin.com/qagahabile/edit?html,js,output
另外请检查这个