javascript - parent 不听 child $emit - VueJS

标签 javascript vue.js vue-component

这是子组件:

Vue.component("training-edit", {
    template: "#training-edit-template",
    props: ["show"],
    data: function () {
        return {
            form: new Form(),
            isWorking: false
        }
    },
    watch: {
        show: function (val) {
            if (val) {
                $("#editTrainingModal").modal("show");
            } else {
                $("#editTrainingModal").modal("hide");
            }
        }
    },
    methods: {
        onCancel: function () {
            this.$emit("doneEditing");
        }
    }
});

这是父级:

new Vue({
    el: "#trainingEditContainer",
    data: {
        isWorking: false,
        showEditTraining: false
    },
    methods: {
        onEdit: function (e) {
            e.preventDefault();
            this.showEditTraining = true;
        },
        doneEditing: function () {
            this.showEditTraining = false; 
        }
    }
});

HTML:

<div id="trainingEditContainer" class="row">
    // unrelated stuff here

    <training-edit v-bind:show="showEditTraining"></training-edit>
</div>
<script id="training-edit-template" type="x-template">
    <modal-right modalId="editTrainingModal">
        <div class="modal-header">
            <button type="button" class="close" v-on:click="onCancel" aria-label="close"><span aria-hidden="true">&times;</span></button>
            <h4 class="modal-title">Edit Training</h4>
        </div>
        @Html.Partial("Partial/_EditPartial")
    </modal-right>
</script>

我可以在 Chrome 的 Vue 开发人员工具中看到事件正在发出,但由于某种原因, parent 没有听到它并且从未调用过 doneEditing 函数。我在这里遗漏了什么明显的东西吗?

最佳答案

首先,我建议您将事件名称更改为done-editing

this.$emit("done-editing")

这是因为 HTML 中的属性不区分大小写,如果您要将某些模板渲染到 DOM,最好全部设为 avoid camelCased names .请注意,如果您在字符串中定义模板或使用单个文件组件,则这不适用。

然后你需要在组件上监听它。

<training-edit @done-editing="doneEditing" v-bind:show="showEditTraining">

当您从组件发出事件时,父组件必须显式监听该事件。

关于javascript - parent 不听 child $emit - VueJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47659930/

相关文章:

javascript - html 表单中的 jQuery 对话框表单

javascript - replaceWith on XML 问题

java - 当数据更新时,VueJS DOM 不更新

vuejs2 - 选择 Jquery 的 Vue 2

typescript - Vue.js 3 : props type validation with custom type

php - 过滤含有成人内容的网站 URL

javascript - 计算表格中所选项目的总计

javascript - vue @click 函数 on::after css element - close btn

unit-testing - 如何测试 Vue 组件是否响应 $root 发出的事件?

javascript - 为什么这个 Vue prop 对变化没有反应?