当前位置: 首页 > 知识库问答 >
问题:

在vue js中使用父函数的子组件

吴镜
2023-03-14

我在父组件中初始化了一个名为setMessage()的方法,我希望能够在子组件中调用它。

main.js

const messageBoard = new Vue({
    el: '#message-board',
    render: h => h(App),
})

App(App.vue(父))...

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);

现在我得到了这个$调度不是一个功能错误消息。我做错了什么?如何在各种子组件中使用父函数?我还尝试了$emit,它没有抛出错误

提前感谢您的帮助!

共有2个答案

杨无尘
2023-03-14
// 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";
  },
}
锺英卫
2023-03-14

你有几个选择。

选项1-引用$父从子

最简单的方法是使用this$父级来自子组件。大概是这样的:

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实例作为中心事件总线,如指南中所述。它看起来像这样:

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>
 类似资料:
  • 问题内容: 我开始玩vuejs(2.0)。我构建了一个包含一个组件的简单页面。该页面具有一个带有数据的Vue实例。在该页面上,我注册了该组件并将其添加到html中。该组件有一个。我希望该值反映在父对象(主Vue实例)上。 如何正确更新组件的父数据?从父级传递绑定的道具不好,并且会向控制台发出一些警告。他们的文档中有内容,但是没有用。 问题答案: Vue 2.0中不赞成使用双向绑定,而是使用事件驱动

  • 我在用vue-cli支架做网页包 我的Vue组件结构/传家宝目前看起来如下: 应用程序 在应用程序级别,我需要一个vuejs组件方法,该方法可以将子组件的所有数据聚合到一个JSON对象中,然后发送到服务器。 有没有办法访问子组件的数据?具体来说,多层深? 如果没有,传递oberservable数据/参数的最佳实践是什么,这样当子组件修改它时,我就可以访问新的值?我试图避免组件之间的硬依赖关系,所以

  • 本文向大家介绍vuejs父子组件通信的问题,包括了vuejs父子组件通信的问题的使用技巧和注意事项,需要的朋友参考一下 父子组件之间可以通过props进行通信: 组件的定义: 1.创建component类:  2.注册一个tagnme: 局部注册: 模板注意事项:  因为 Vue 就是原生的DOM,所以有些自定义标签可能不符合DOM标准,比如想在 table 中自定义一个 tr,如果直接插入 my

  • 问题内容: 我有一个“ ChildClass”类,它扩展了“ ParentClass”类。我不想完全替换父类的构造函数,而是要先调用父类的构造函数,然后再做一些额外的工作。 我相信默认情况下会调用父类的0参数构造函数。这不是我想要的 我需要用参数调用构造函数。这可能吗? 我试过了 但这不起作用,因为您无法修改“ this”。 问题答案: 您可以从子代的构造函数中以“ super”引用父代的构造函数

  • 在Vue 2.0中,文档和其他文档清楚地表明,父母与孩子之间的沟通是通过道具进行的。 父母如何通过道具告诉孩子事情发生了? 我应该看一个叫事件的道具吗?这感觉不对,替代方案也不对(/是子元素到父元素的,中心模型是远程元素的)。 我有一个父容器,它需要告诉它的子容器,可以在API上执行某些操作。我需要能够触发函数。

  • 如何从父组件中访问子组件数据?我有一个父组件“MissionPlanner ”,我想访问名为“ChosenHeroes”的子组件“chosenHeroes”数组。如果数组中有元素,我想最终呈现一个div并能够更新父数组中的数组 我不确定我是否应该使用emit()以及如何确切地使用它。我尝试制作一个自定义事件“addHero”并将其传回。但是我遇到了错误 ChosenHeroes.vue HeroP

  • 我需要使用父组件中子组件内部的状态值。 组成部分: 这是父组件: