start

  • 最近在学习 vue3,在学习 vue3 的 之前。先总结一下,vue2 中的组件之间的通信;

以下示例皆为 vue2

1.父组件传值给子组件,利用 props

父组件 app.vue

<template><div id="app"><boxA :name="appName" :age="appAge" /></div>
</template>
​
<script>
import boxA from './boxA.vue'
​
export default {name: 'App',data() {return {appName: '我是app页面的name',appAge: '我是app页面的age 123',}},components: {boxA,},
}
</script>

子组件 boxA.vue

<template><div class="box">我是 A盒子<pre>我有这些属性:
​{{ name }}</pre></div>
</template>
​
<script>
export default {name: 'boxA',props: {name: {type: String, // 限制类型default: '', // 设置默认值require: true, // 是否必传},},
}
</script>

2.子组件和父组件通信 $emit

父组件 app.vue

<template><div id="app">主应用
​<boxA @say="sayApp" /></div>
</template>
​
<script>
import boxA from './boxA.vue'
​
export default {name: 'App',components: {boxA,},methods: {sayApp(value) {console.log('hello', value)},},
}
</script>

子组件 boxA.vue

<template><div class="box"><span @click="handleClick">你好</span></div>
</template>
​
<script>
export default {name: 'boxA',methods: {handleClick() {this.$emit('say', '输出的参数')},},
}
</script>

3. 跨多级组件通信

/*新建一个Vue实例作为中央事件总线*/
let event = new Vue()
​
/*监听事件*/
event.$on('eventName', (val) => {//......do something
})
​
/*触发事件*/
event.$emit('eventName', 'this is a message.')

4.跨多级组件数据通信

vuex4.

5. 父-》子-》孙 三个层级之间的组件通信 $attrs $listeners

有这么一个场景,组件 A 中有组件 B,组件 B 中有 C。AC 之间通信怎么办?

  • 使用父子通信,B 组件中会有很多冗余代码。
  • 使用事件总线,不太利于管理;
  • 使用 vuex,有点大材小用;

在 vue2.4 版本之后,添加了这么几个属性:

  • $attrs
  • $listeners

$attrs

  • vm 上的属性。所以我们可以直接在组件中,this.$attrs打印出来;
  • 2.4.0 新增的属性;
  • 简单理解就是一个对象。所有父组件传递给子组件的值,当子组件没有用 prop 属性接收,就会存储在this.$attrs中。(class 和 style 除外)

$listeners

  • vm 上的属性。所以我们可以直接在组件中,this.$listeners打印出来;
  • 2.4.0 新增的属性;
  • 简单理解就是一个对象。所有父组件给子组件绑定到事件会存储在this.$listeners中,(不含 .native 修饰器的)

有什么用?

想象我们的场景:

  1. A 组件和 C 组件通信;
  2. A 传递数据给 B,绑定事件到 B 上。
  3. 可以在 B 中通过 this.$attrsthis.$listeners 拿到数据和事件
  4. 一起传递给 C 组件。

例如:

父组件 app.vue

<template><div id="app"><boxA :name="appName" :age="appAge" @fn1="appFn1" @fn2="appFn2" /></div>
</template>
​
<script>
import boxA from './boxA.vue'
​
export default {name: 'App',data() {return {appName: '我是app页面的name',appAge: '我是app页面的age 123',}},components: {boxA,},methods: {appFn1(value) {console.log('appFn1', value)},appFn2(value) {console.log('appFn2', value)},},
}
</script>

子组件 boxA.vue

<template><div class="box">我是 A盒子<pre>我有这些属性:
​{{ name }}</pre>
​<!-- !!!这里可以再来一个组件  boxB; 通过 v-bind="$attrs" v-on="$listeners" 就能在boxB中收到数据了--><!-- <boxB v-bind="$attrs" v-on="$listeners"> --></div>
</template>
​
<script>
export default {name: 'boxA',inheritAttrs: false,props: {name: {type: String, // 限制类型default: '', // 设置默认值require: true, // 是否必传},},created() {console.log(this)this.$emit('fn1', '触发父组件第一个函数')},
}
</script>

另外说个其他的小 tips

  • 没有被 父组件传递给子组件的值,如果没有被 props 接受。 默认会展示在 html 的标签上

可使用 inheritAttrs: false, 隐藏

总结一下 vue2 组件之间的通信相关推荐

  1. VUE 2.0 父子组件之间的通信

    父组件是通过props属性给子组件通信的来看下代码: 父组件: <parent><child :child-com="content"></child ...

  2. vue中子组件和子组件之间怎么通信_vue.js组件之间如何通信?

    vue.js组件之间如何通信?下面本篇文章就来给大家介绍一下Vue.js组件间通信方式.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. 平时在使用Vue框架的业务开发中,组件不仅仅要 ...

  3. [vue] vue组件之间的通信都有哪些?

    [vue] vue组件之间的通信都有哪些? 父子Coms: 1/2/3 ..兄弟Coms: 4/5跨级Coms: 4/5/6/7props$emit/$on( $parents/$children ) ...

  4. android组建之间通信_Android组件化(三)组件之间的通信

    介绍 在组件化开发的时候,组件之间是相互独立的没有依赖关系,我们不能在使用显示调用来跳转页面了,因为我们组件化的目的之一就是解决模块间的强依赖问题,假如现在要从A业务组件跳转到业务B组件,并且要携带参 ...

  5. 第十节:实现vue组件之间的通信

    这一节我们还是来继续介绍组件:组件之间如何通信. 第九节我们在介绍组件知识的时候,提到过组件可以接受参数props,这其实就是组件之间的一种通信方式:父组件→子组件传递数据. 父组件→子组件 那我们还 ...

  6. vue/父子组件之间的通信

    父子组件之间的通信 父组件绑定数据在组件上子组件props属性接收 父组件内的data属性中待传的数据data1 => <cpn :data2="data1">& ...

  7. 使用reflux进行react组件之间的通信

    前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...

  8. Vue组件之间的通信-父传子-子传父

    文章目录 Vue的组件嵌套 Vue组件间通信 1.父组件传递给子组件 1.1数组的方式 1.2对象的方式 2.子组件传递给父组件 Vue的组件嵌套 前面我们是将所有的逻辑放到一个App.vue中: 在 ...

  9. Vue非父子组件之间的通信

    文章目录 非父子组件的通信 1.Provide和Inject 1.1基本使用 1.2处理响应式数据(了解) 2.全局事件总线 非父子组件的通信 此篇讲解的是, 在学习状态管理之前, 非父子间通信的方案 ...

最新文章

  1. Dinic最大流 || Luogu P3376 【模板】网络最大流
  2. LPC43xx SGPIO Pattern Match Mode
  3. SRP:The Single-Responsibility Principle
  4. NOIP2018比赛总结
  5. 在Windows下为PHP安装redis扩展
  6. P1303 A*B Problem 高精度乘法
  7. html访问时sessionid变,传统Session跨域导致的Sessionid不一致问题解决方案
  8. 网易博客挂了,转一篇以前的文章过来纪念一下吧。。
  9. Date和SimpleDateFormat
  10. SystemVerilog搭建测试平台---第一章:验证导论
  11. 【Python】基于Python的百度迁徙5——实时拥堵与拥堵指数(附代码)
  12. 【Java】Response约定
  13. centos安装Docker与使用构建业务镜像挂载卷harbor仓库的高可用及网络模式和资源限制介绍...
  14. MAC清除Launchpad 应用程序 图标
  15. 【编译原理】 NFA转变为DFA的子集构造法
  16. Rosalind全排列的问题
  17. 【算法】最直接的算法——穷举法详解
  18. 成功解决VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run the p
  19. 微信h5登录php,vue实现微信授权登录步骤详解
  20. 自己的web前端工程师之路的感慨与规划

热门文章

  1. 解决 Win8 Pl2302 下不能识别的问题
  2. 电信增值业务彩信平台模块
  3. 班主任请收下!成绩统计必不可少的一波Excel技巧
  4. 数据结构:栈「详解」
  5. win7蓝屏0x000000f4修复_超赢科技:关于电脑F4蓝屏的处理和预防方法
  6. 罗浩博士-Bag of Tricks and A Strong Baseline for ReID
  7. 数据湖(十):Hive与Iceberg整合
  8. cisco881配置连接计算机,cisco 881 无线路由配置
  9. 车载DVD GPS导航地图围棋GPS地图
  10. spring struts hibernate web.xml配置文件模板