😄
前端学习
  • 👋Welcome
  • 📖前端基础
    • HTML
      • 基础知识
      • 进阶知识
      • HTML5
    • CSS
      • 基础知识
      • 进阶知识
      • CSS 专题
        • CSS 选择器
        • CSS 布局
        • CSS 动画
        • CSS 画图
        • 响应式方案
        • CSS BEM 规范
        • CSS 案例
    • JavaScript
      • 基础知识
      • 进阶知识
      • 常用内置对象
        • Array 对象
        • String 对象
        • Number 对象
        • Boolean 对象
        • Math 对象
        • Date 对象
        • RegExp 对象
        • Object 对象
      • JS 专题
        • 数据类型
        • 原型链/继承
        • 对象赋值与拷贝
        • this 的指向
        • 异步操作
        • 模块化
        • 设计模式
    • 浏览器
      • 浏览器模型
      • 事件
      • 位置属性
      • Web 缓存
      • 本地存储
    • 综合内容
      • 前端跨域
      • 登录鉴权
      • 文件上传与下载
  • 🏗️前端框架
    • Vue.js
      • 基础知识
      • Vue 组件通信
      • Vuex 使用指南
      • Vue 动画
      • 静态网站框架 VuePress
    • React.js
      • 基础知识
      • 组件通信
  • 📦计算机基础/后端
    • 图解计算机网络
    • HTTP/HTTPS
    • TCP/UDP
    • Node.js
    • MongoDB
  • 🛠️开发工具
    • 版本控制工具-Git
      • git submodule
    • 构建工具-Webpack
    • 错误监控工具-Sentry
    • 单元测试工具-Jest
    • 包管理工具-NPM
    • 代码编辑器-VSCode
  • 🤔专题内容
    • 前端工程化
    • 代码规范
      • JavaScript 代码规范
      • CSS 代码规范
      • Vue 代码规范
      • Git Commit 规范
      • 代码规范配置
    • 网络安全与防御
    • 性能优化
    • 算法编程
    • 数据可视化
  • 🧑‍💻 面试相关
    • 面试知识总结
    • 面试问题总结
    • 面试常见编程
    • 面试资源汇总
  • 🍭其他
    • 项目经验❗️
    • 踩坑指南❗️
      • JavaScript 踩坑指南
      • CSS 踩坑指南
      • Vue 踩坑指南
    • 学习资源
    • 综合收藏夹
由 GitBook 提供支持
在本页
  • 1. 组件关系
  • 2. 组件通讯
  • 2.1 props/emit/sync
  • 2.2 Vuex
  • 2.3 中央事件总线 Bus
  • 2.4 $attrs/$listeners
  • 2.5 provide/inject
  • 2.6 $ref/$parent/$children

这有帮助吗?

  1. 前端框架
  2. Vue.js

Vue 组件通信

上一页基础知识下一页Vue 动画

最后更新于3年前

这有帮助吗?

项目地址:,参考资料:

1. 组件关系

  • 父子组件:A 与 B、B 与 C、B 与 D、C 与 E、D 与 E

  • 子孙组件:A 与 D、B 与 E

  • 兄弟组件:C 与 D

  • 隔代组件:A 与 E

2. 组件通讯

方法
父子通信
兄弟通信
跨级通信

props/emit/sync

☑️

✖️

✖️

Vuex(工程项目最常用方式)

☑️

☑️

☑️

中央事件总线 Bus

☑️

☑️

☑️

$attrs/$listeners

☑️

✖️

☑️

provide/inject

☑️

✖️

☑️

$ref/$parent/$children

☑️

✖️

✖️

2.1 props/emit/sync

父组件向子组件传值:props

<!-- 父组件 -->
<template>
  <child :msg='myMsg'></child>
</template>
<script>
import Child from "./components/Child"
export default {
  components:{ Child },
  data(){
    return{
      myMsg: 'hello child'
    }
  }
}
</script>


<!-- 子组件 -->
<template>
  <div>{{ myMsg }}</div>
</template>
<script>
export default {
  props: {
    myMsg: { // hello child
      type: String,
      default: ''
    }
  }
}
</script>

子组件向父组件传值:绑定事件 + emit

<!-- 父组件 -->
<template>
  <child @getMsg='updateMsg'></child>
</template>
<script>
import Child from "./components/Child"
export default {
  components:{ Child },
  methods: {
    updateMsg: (val) => {
      console.log(val) // hello parent
    }
  }
}
</script>


<!-- 子组件 -->
<template>
  <button @click='onClick'>点击</button>
</template>
<script>
export default {
  methods: {
    onClick: () => {
      this.$emit('getMsg', 'hello parent')
    }
  }
}
</script>

通过 sync 使得子组件更新父组件属性

<!-- 父组件 -->
<template>
  <child :msg.sync='myMsg'></child>
</template>
<script>
import Child from "./components/Child"
export default {
  components:{ Child },
  data(){
    return{
      myMsg: 'hello child'
    }
  }
}
</script>


<!-- 子组件 -->
<template>
  <button @click='onClick'>点击</button>
</template>
<script>
export default {
  methods: {
    onClick: () => {
      this.$emit('update:myMsg', 'hello parent')
    }
  }
}
</script>

2.2 Vuex

2.3 中央事件总线 Bus

// bus.js - 创建实例
import Vue from 'vue';
export default new Vue();

// 调用事件
import Bus from 'bus.js'
Bus.$emit('getTarget', 'hello world!');

// 注册事件
import Bus from 'bus.js'
Bus.$on('getTarget', target => {  
    console.log(target);  
});

2.4 $attrs/$listeners

A组件嵌套B,B组件嵌套C;A传递属性到B,B可以通过this.$attrs获取,并且要继续传递给下一层,就需要在下一层组件上绑定v-on='$attrs',注意如果B中通过props接收相同名称的属性, this.$attrs此时以及后续都不能读取到该名称属性。$listeners传递方法与$attrs传递属性同理。

2.5 provide/inject

export default {
  provide: {
    name: 'hello'
  }
}
// B.vue
export default {
  inject: ['name'], // 通过this.name获取
  mounted () {
    console.log(this.name);  // hello
  }
}

2.6 $ref/$parent/$children

对组件进行ref命名,则可以通过this.$refs.名字来获取并调用其相应的方法和获取相应的数据,而this.$parent和this.$children同样能够获取完整的vue组件信息。

这是最常用的方式,具体详见和。

祖先组件中通过provider来提供变量,然后在子孙组件中通过inject来注入变量。provide 和 inject 绑定并不是可响应的,provide与inject 实现数据响应式可详见(Vue.observable 优化响应式 provide)。

如果你对内容有任何疑问,欢迎提交 或

🏗️
「官方文档」
「项目工程」
「Vue 通信六种方式」
❕issues
✉️ email
Vue 组件通信
「Vue 通信六种方式」