我在名为setMessage()
的父组件中初始化了一个方法,我希望能够在子组件中调用它。
main.js
const messageBoard = new Vue({
el: '#message-board',
render: h => h(App),
})
App(App.vue(parent))..
export default {
data() {
return { messages: state }
},
methods: {
setMessage(message) {
console.log(message);
}
},
template: `
<div>
<child-component></child-component>
</div>
`,
}
子
const child = Vue.extend({
mounted() {
// attempting to use this function from the parent
this.$dispatch('setMessage', 'HEY THIS IS MY MESSAGE!');
}
});
Vue.component('child-component', child);
现在我收到this.$dispatch is not a function
错误消息。我究竟做错了什么?如何在各种子组件中使用父函数?我还试过$emit
,它没有抛出错误&amp;它没有达到这个功能。
提前感谢您的帮助!
答案 0 :(得分:9)
你有几个选择。
选项1 - 引用来自孩子的$ parent
最简单的方法是使用子组件中的this.$parent
。像这样:
const Child = Vue.extend({
mounted() {
this.$parent.setMessage("child component mounted");
}
})
选项2 - 在父级
中发出事件和处理但这强烈地将孩子与其父母联系在一起。要解决此问题,您可以$emit
孩子中的事件并让父母处理它。像这样:
const ChildComponent = Vue.extend({
mounted() {
this.$emit("message", "child component mounted (emitted)");
}
})
// in the parent component template
<child-component @message="setMessage"></child-component>
选项3 - 中央事件总线
如果您的组件没有直接的父子关系,最后一个选项是使用单独的Vue实例作为中央事件总线as described in the Guide。它看起来像这样:
const bus = new Vue({});
const ChildComponent = Vue.extend({
mounted() {
bus.$emit("message-bus", "child component mounted (on the bus)");
}
})
const app = new Vue({
...
methods: {
setMessage(message) {
console.log(message);
}
},
created() {
bus.$on('message-bus', this.setMessage)
},
destroyed() {
bus.$off('message-bus', this.setMessage)
}
});
更新(选项2a) - 将setMessage作为道具传递
要跟进您的评论,以下是将setMessage
作为道具传递给子组件的方法:
const ChildComponent = Vue.extend({
props: ["messageHandler"],
mounted() {
this.messageHandler('from message handler');
}
})
// parent template (note the naming of the prop)
<child-component :message-handler="setMessage"></child-component>
答案 1 :(得分:0)
// parent component providing 'foo'
var Provider = {
methods: {
foo() {
console.log('foo')
},
},
provide: {
foo: this.foo,
},
}
// child component injecting 'foo'
var Child = {
inject: ['foo'],
created() {
this.foo() // => "foo"
},
}