前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Vue 组件通信

Vue 组件通信

作者头像
Nian糕
修改2024-03-19 14:44:41
4280
修改2024-03-19 14:44:41
举报
文章被收录于专栏:JavaScript高阶应用
  • 父组件通过 props 给子组件传值
代码语言:javascript
复制
// App.vue 父组件
<List :list="list" />

data() {
  return {
    list: [
      {
        id: 'id-1',
        title: 'title-1'
      },
      {
        id: 'id-2',
        title: 'title-2'
      }
    ]
  }
}
代码语言:javascript
复制
// List.vue 子组件
<ul>
  <li v-for="item in list" :key="item.id">
    {{item.title}}
    <button>删除</button>
  </li>
</ul>

props: {
  // 用来接收父组件传给子组件的数据
  list: {
    type: Array,
    default() {
      return []
    }
  }
}
  • 子组件通过 vm.$emit(event, arg) 触发父组件事件
代码语言:javascript
复制
// App.vue 父组件
<Input @add="addHandler"/>
<List :list="list" @delete="deleteHandler"/>

methods: {
  addHandler(title) {
    this.list.push({
      id: `id-${Date.now()}`,
      title
    })
  },
  deleteHandler(id) {
    this.list = this.list.filter(item => item.id !== id)
  }
}
代码语言:javascript
复制
// List.vue 子组件
<ul>
  <li v-for="item in list" :key="item.id">
    {{item.title}}
    <button @click="deleteItem(item.id)">删除</button>
  </li>
</ul>

methods: {
  deleteItem(id) {
    // 调用父组件的事件
    this.$emit('delete', id)
  }
}
代码语言:javascript
复制
// Input.vue 子组件
<input type="text" v-model="title"/>
<button @click="addTitle">添加</button>

methods: {
  addTitle() {
    // 调用父组件的事件
    this.$emit('add', this.title)
    this.title = ''
  }
}
  • 其他组件通过 vm.$on( event, fn ) 进行通信,实例一个 Vue 实例 event 作为媒介,在要相互通信的组件中引入 event
代码语言:javascript
复制
// event.js
import Vue from 'vue'

export default new Vue()
代码语言:javascript
复制
// Input.vue
methods: {
  addTitle() {
    // 调用父组件的事件
    this.$emit('add', this.title)
    // 调用自定义事件
    event.$emit('onAddTitle', this.title)
    this.title = ''
  }
}
代码语言:javascript
复制
// List.vue
methods: {
  addTitleHandler(title) {
    console.log('on add title', title)
  }
},
mounted() {
  // 绑定自定义事件
  event.$on('onAddTitle', this.addTitleHandler)
},
beforeDestroy() {
  // 及时销毁,否则可能会造成内存泄漏
  event.$off('onAddTitle', this.addTitleHandler)
},
运行结果
运行结果

该章节的内容到这里就全部结束了,源码我已经发到了 GitHub Vue-Communication 上了,有需要的同学可自行下载

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档