如何在组件链上传播 Vue.js 事件?

新手上路,请多包涵

我确实有三个组成部分。

Vue.js 开发视图

我对 Datatable 组件没有任何影响,因为我从 npm 获得了它。

现在我想从 EditButton 发送一个事件到我的 Zonelist

Zonelist 组件:

 <template>
<datatable :columns="table_columns" :data="table_rows" filterable paginate v-on:remove="removeItem"></datatable>
</template>
<script>
import datatable from 'vuejs-datatable';
import moment from 'moment';
export default {
    data() {
        return {
            table_columns: [
                {label: "Zone", component: 'ZoneLink'},
                {label: "Last updated", callback (row) {
                    let locale = $('html').closest('[lang]').attr('lang') || 'en';
                    moment.locale(locale);
                    return moment(row.last_updated).format('D. MMM YYYY');
                }},
                {label: '', component: 'EditButton'}
            ],
            table_rows: [
                {
                    "name": "xyz.de",
                    "last_updated": "2017-10-21 17:29:50"
                }
            ],
            form: {
                name: '',
                errors: []
            }
        };
    },
    components: {
        datatable
    },
    methods: {
            removeItem (item) {
                this.table_rows.forEach((value, index, array) => {
                    if (value.name === item) {
                        Vue.delete(array, index);
                    }
                });
            }
      }
}
</script>

现在我的 EditButton 组件 $emit() 是带有参数的 remove 事件。

但是没有任何反应。所以我认为vue是无法定位监听器的。

(我在这里使用 ES6 的方法简写)

如果不通过 this.$parent.$parentEditButton 改变 Zonelist 的状态,我怎么能正确地做到这一点?

原文由 jankal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 276
2 个回答

Vue 中的 非父子通信 通常通过事件总线或状态管理系统处理。

在这种情况下,除非您的应用程序更复杂,否则事件总线可能就是您所需要的。由于您使用的是单文件组件,您可能需要在窗口上声明总线,可能在您的主脚本中。

 window.bus = new Vue()

然后在你的 EditButton 中,你可以发出事件

bus.$emit('some-event', someData)

在你的 ZoneList 你可以听。

 bus.$on('some-event', someData => this.doSomething(someData))

原文由 Bert 发布,翻译遵循 CC BY-SA 4.0 许可协议

另一种选择是要求 DataTable 通过向其添加 v:on="$listeners" 属性来传递任何和所有事件。

有关更详细的说明,请参阅 https://stackoverflow.com/a/61329264/578318

编辑:

一个更安全的选择是简单地监听父类中的事件并将其传递给……

     <ancestor @message="console.log($event)"> <!-- cute trick see * -->
    ...
    <parent @message="$emit('message', $event)"> <!-- passes it on -->
    ...
    <child @click="$emit('Hello World')"> <!-- creates the event -->

\* computed: {'console' : () => console}

原文由 sparkyspider 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题