javascript - 子组件发送给父组件,父组件更新所有子组件

标签 javascript vuejs2 vue.js

我正在尝试使用 vue js 2 创建一个包含可扩展项目的列表。这个想法是,当我单击一个项目时,我希望它展开(显示其内容)(如果它尚未展开)并关闭所有其他展开的元素。我创建了两个组件 expandable-panelexpandable-item。我可以在里面有多种类型的内容,所以我想使用插槽。

我的代码:

ExpandablePanel 组件:

<template>
    <div class="expandable-panel" @expanded="doStuff">
        <slot></slot>
    </div>
</template>

<script type="text/babel">
    export default {
        methods: {
            doStuff: function() {
                alert('expanded');
            }
        }
     }
</script>

ExpandableItem 组件:

<template>
    <div class="expandable-item" @click="toggleExpand">
        <div class="expandable-item-header">
            {{ title }}
        </div>
        <div class="expandable-item-body" v-if="expanded">
            <slot></slot>
        </div>
    </div>
</template>
<script type="text/babel">
    export default {
        props: {
            title: String
            // expanded: {
            //     type: Boolean,
            //     default: true
            // }
        },
        data: function() {
            return {
                expanded: true
            }
        },
        methods: {
            toggleExpand: function() {
                this.expanded = !this.expanded;
                this.$emit('expand');
            }
        }
    }
</script>

还有我的 HTML 文件

<expandable-panel>
    <expandable-item title='title 1'>Lorem ipsum...</expandable-item>
    <expandable-item title='title 2'>Lorem ipsum...</expandable-item>
    <expandable-item title='title 3'>Lorem ipsum...</expandable-item>
</expandable-panel>

我的应用程序和组件是这样注册的:

Vue.component('expandable-panel',    require('./components/global/ExpandablePanel.vue'));
Vue.component('expandable-item', require('./components/global/ExpandableItem.vue'));
const app = new Vue({
    el: '#app'
});

问题: $emit 部分似乎没有到达父组件内的 @expanded="doStuff" 。 即使它到达那里,我如何正确切换扩展值?我可以为此使用 Prop 吗?

现在,它会切换每个元素,但我无法更新其他元素。 谢谢

最佳答案

这里父子之间有严格的关系,因此您可以通过 $parent 对象发出事件。

首先,在创建父对象时,使用 this.$on 监听事件:

Vue.component('parent', {
  template: `<div><slot></slot></div>`,
  created: function() {
    this.$on('event', function(message) {
        alert(message);
    })
  }
});

然后在您的子组件内使用 $parent.$emit 发出此事件

Vue.component('child', {
  template: `<button @click="$parent.$emit('event', 'From child')">I'm slot</button>`
});

这是工作演示:https://jsfiddle.net/rdjjpc7a/1754/

关于javascript - 子组件发送给父组件,父组件更新所有子组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42394687/

相关文章:

javascript - Vuejs 在组件中单击按钮时将类切换到主体

javascript - 在 Nuxt.js 中检测服务器端渲染

javascript - 如何在此 JSON 响应中访问 browser 和 browser_version?

javascript - 为什么 Eclipse 将有效的 JavaScript 标记为错误?

javascript - Vue.Js(2) : Property or method "hideModel" is not defined on the instance but referenced during render

javascript - 如何正确观察 Vuex 中的状态变化?

vue.js - 在 Vuetify 数据表中选择行

javascript - Angular ui-grid 以编程方式设置过滤器字段并刷新。值不显示

javascript - Highcharts 不会显示数据

javascript - 尝试从 vuejs 组件打印时,样式参数不适用于 print-js