微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

子组件之间的Vue-js通信

如何解决子组件之间的Vue-js通信

我有一个父级组件,该父级组件会通过一个列表并为每个项目创建一个<ticket-item>子级组件。 <ticket-item>组件显示一个链接,该链接会弹出一个模式并传递该列表项的票证对象。如果用户单击页面上另一个列表中的<appointment-button>子组件,我也想弹出模式。我在<appointment-button>中向根实例发出一个事件,并在<ticket-item>组件中监听该根事件。以下是每个组件的代码片段:

<ticket-list>组件,其中列出了每个<ticket-item>组件:

<tr v-for="ticket in tickets" :key="ticket.id">
    <td><ticket-item :ticket="ticket"></ticket-item></td>
    <td>{{ticket.amount}}</td>
</tr>

<ticket-item>组件安装事件:

self = this
this.$root.$on('openTicket-'+this.ticket.id,data => {
  console.log('data='+data+',ticket.id='+self.ticket.id)
  //event name has ticket id in it,but checking here anyway
  if (self.ticket.id==data) {
    self.editTicket = true
  }
})

<appointment-button>发出事件的组件:

openTicket() {
  this.$root.$emit('openTicket-'+this.appt.ticket.id,this.appt.ticket.id)
}

当我单击约会按钮并发出上面的事件时,我从加载的<ticket-item>组件中获得了此控制台输出

console-output-1

因此只打印了一行输出,但是我的测试中有8个<ticket-item>组件。如果我从事件名称删除'-'+ ticket.id,那么我将获得以下控制台输出

console-output-2

因此,有8行与<ticket-item>组件的数量匹配,但全部使用最后一个组件的票证道具中的数据。知道我在这里缺少什么吗?为什么装入的生命周期事件没有从父级(列表)传递来的正确的“票证”道具?我从编写的其余代码中知道,从父级传递到组件的任何道具都可以在安装的事件中使用。

更新:

如果我创建约会并签入用户,则会创建一个新的票证项目。现在,根侦听器已更新为使用此最新ID。我可以从约会按钮(侦听器)打开票证,但是其他人显然都不起作用...

解决方法

是的。你是对的。我不需要self = this。我把const放在前面,并且也修复了它,但是无论如何都不需要。

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。