组件通信可以分为父子组件通信、非父子组件通信,可以是数据的传递,也可以是方法的传递,先介绍数据的相互传递,再介绍方法的相互传递。

父组件到子组件传递数据:

一、通过props,父组件可以传递动态和静态数据。

//父组件
<template><div id="app">//第一种静态数据 <HelloWorld msg="我是父组件的数据"/>//第二种动态绑定 <HelloWorld :msg="message"/></div>
</template><script>
import HelloWorld from './components/HelloWorld.vue'export default {name: 'app',data(){return{message: '我来自父组件'}},components: {HelloWorld}
}
</script>
复制代码
//子组件
<template><div class="hello">来自父组件的值:{{msg}}</div>
</template><script>
export default {name: 'HelloWorld',props: ['msg']//或者 props: { msg: String//指定传入的类型 }//或者 props: { msg: String,default: '默认值' //指定默认值 }
}
</script>复制代码

二、provide / inject

provide 和 inject 主要为高阶插件/组件库提供用例。并不推荐直接用于应用程序代码中。并且这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。

//父组件
<template><div><child-dom></child-dom></div>
</template>
<script>import childDom from "./components/ChildDom.vue";export default {data() {return{}},provide: {house: '房子',car: '车子',money: '¥10000'},methods:{},components:{childDom},}
</script>复制代码
//子组件
<template><div></div>
</template>
<script>export default {data() {return{}},inject: {house: {default: '没房'},car: {default: '没车'},money: {default: '¥4500'}},created () {console.log(this.house, this.car, this.money)},methods:{}}
</script>
复制代码

子组件传值给父组件

一、通过props的回调

//父组件
<template><div id="app"><HelloWorld :msg="message"/></div>
</template><script>
import HelloWorld from './components/HelloWorld.vue'export default {name: 'app',data(){return{}},methods: {message: (data)=>{console.log('我是父组件的方法,在子组件中被触发了')console.log('来自子组件的值是:'+data)}},components: {HelloWorld}
}
</script>复制代码
//子组件
<template><div class="hello" @click="msg('来自子组件的值~~')">来自父组件的方法,点我执行</div>
</template><script>
export default {name: 'HelloWorld',props: ['msg']
}
</script>复制代码

二、通过$emit

//父组件
<template><div id="app"><HelloWorld @getData="message"/></div>
</template><script>
import HelloWorld from './components/HelloWorld.vue'export default {name: 'app',data(){return{}},methods: {message: (data)=>{console.log('来自子组件的值是:'+data)}},components: {HelloWorld}
}
</script>复制代码
//子组件
<template><div class="hello" @click="goFun">点击传值给父组件</div>
</template><script>
export default {name: 'HelloWorld',data(){return{s: 1111}},methods: {goFun(){this.$emit('getData',this.s)}}
}
</script>复制代码

三、.sync修饰实现双向绑定

//父组件
<template><div id="app"><HelloWorld :show.sync='valueChild'/>父组件值:{{valueChild}}<button @click="changeValue">点击</button></div>
</template><script>
import HelloWorld from './components/HelloWorld.vue'export default {name: 'app',data(){return{valueChild:true}},methods: {changeValue(){console.log('父组件的值被修改:'+this.valueChild)this.valueChild =!this.valueChild}},components: {HelloWorld}
}
</script>复制代码
//子组件
<template><div><div><p>子组件值:{{show}}</p><button @click.stop="closeDiv">修改</button></div></div>
</template><script>
export default {name: 'HelloWorld',methods: {closeDiv() {this.$emit('update:show', !this.show); //触发 input 事件,并传入新值}},props:['show']
}
</script>复制代码

关系型组件跨级传递(根组件、儿子组件、孙子组件)

一、使用 $attrs 和 $listeners

通过 $attrs 将值连续往下传递(和props传递类似),传递过程中可以只选择当前需要的值,组件中可以通过 inheritAttrs:false 保持当前组件的属性纯净度。通过 $listeners 可以在(…子组件)中 this. $emit(“upRocket”,11111)来触发父组件中的事件,从而达到传值给父组件的目的。

//父组件
<template><div><child-dom:foo="foo":coo="coo"@upRocket="reciveRocket"></child-dom></div>
</template>
<script>import childDom from "./components/ChildDom.vue";export default {data() {return {foo:"Hello, world",coo:"Hello,rui"}},methods:{reciveRocket(data){console.log("我是根组件,这是接受的孙子组件的数据"+data)}},components:{childDom},}
</script>复制代码
//子组件
<template><div><p>foo:{{foo}}</p><childDomChild v-bind="$attrs" v-on="$listeners"></childDomChild></div>
</template>
<script>
import childDomChild from './childDomChild';
export default {name:'child-dom',props:["foo"],inheritAttrs:false,components:{childDomChild}
}
</script>复制代码
//孙子组件
<template><div><p>coo:{{coo}}</p> <button @click="startUpRocket">发送数据到根组件</button>   </div>
</template>
<script>export default {name:'child-dom',props:["coo"],methods: {startUpRocket() {this.$emit("upRocket");}}
}
</script>复制代码

二、$parent $children

其实通过 $ r e f 可以获取到子组件中的一些挂载属性和值, 父组件如果要获取子组件的方法可以通过this.$refs.mychild.funName("…");这种方式,给子组件指定ref名称。同理,通过 $parent $children可直接操作数据和方法。

  • this. $parent查找当前组件的父组件。
  • this.$children查找当前组件的直接子组件,可以获取到全部直接子组件, 需要注意$children 并不保证顺序,也不是响应式的。可以通过this.$root.$children[0].$children[0].$children[0].msg连续查找
  • this.$root查找根组件,并可以配合$children遍历全部组件
//父组件
<template><div>父组件的值:{{msg}}<child-dom></child-dom><button @click="change">父组件点击修改</button></div>
</template>
<script>import childDom from "./components/ChildDom.vue";export default {data() {return{msg: 0}},methods:{change(){this.msg = this.$children[0].childMsgthis.$children[0].childMsg = '子组件的值被父组件修改了'}},mounted(){},components:{childDom},}
</script>复制代码
//子组件
<template><div>子组件的值:{{childMsg}}<button @click="decrease()">子组件点击修改</button></div>
</template>
<script>
export default {name:'child-dom',data() {return {childMsg : 111};},methods: {decrease() {this.childMsg = this.$parent.msgthis.$parent.msg = "子组件修改了父组件的值"}}
}
</script>复制代码

非关系组件传值

一、EventBus

适用于小型项目,可以达到任意组件相互通信的效果

//组件a
<template><div>{{fontCount}}<child-dom></child-dom></div>
</template>
<script>//import Vue from 'vue'   //export const EventBus = new Vue()import { EventBus } from "./assets/bus.js";import childDom from "./components/ChildDom.vue";export default {data() {return{fontCount: 0}},methods:{},mounted(){EventBus.$on("decreased", ({num}) => {this.fontCount -= num});},components:{childDom},}
</script>复制代码
//组件b
<template><div><button @click="decrease()">-</button></div>
</template>
<script>
import { EventBus } from "../assets/bus.js";
export default {name:'child-dom',data() {return {num: 1,deg:180};},methods: {decrease() {EventBus.$emit("decreased", {num:this.num});}}
}
</script>复制代码

二、vuex

请移步官方文档查阅具体内容

转载于:https://juejin.im/post/5d254c0a6fb9a07f065594d9

vue通信的N种方式相关推荐

  1. vue 组件通信的几种方式

    前言 在vue中,​ 组件的关系不外乎以下三种: 组件是需要通信的,在开发中,常用到的通信方式有:vuex.eventBus.以及props与emit.$parent与$children,除此之外,还 ...

  2. Vue组件通信的五种方式

    Vue组件通信的五种方式 文章目录 Vue组件通信的五种方式 一. props/$emit(父子通信) 二. vuex(组件之间通信) 三. 事件总线EventBus(组件之间通信) 四. provi ...

  3. vue组件通信的几种方式

    vue组件通信的几种方式 最近用vue开发项目,记录一下vue组件间通信几种方式 第一种,父子组件通信 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Chil ...

  4. laydate组件 无法传值_Vue组件通信的几种方式

    组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 组件之间的关系 如上图所示,A 和 B.B 和 C. ...

  5. 前端跨域通信的几种方式

    前言 前端通信类的问题,主要包括以下内容: 1.什么是同源策略及限制 同源策略是一个概念,就一句话.有什么限制,就三句话.能说出来即可. 2.前后端如何通信 如果你不准备,估计也就只能说出ajax. ...

  6. linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

    linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...

  7. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  8. Windows下进程通信的几种方式介绍

    Windows下进程通信的几种方式 一.消息通信 所谓消息通信,就是指Windows发出的一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送 ...

  9. [转]WINDOW进程通信的几种方式

    windows进程通信的几种方式 1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/O操作,只需简单的指针 ...

最新文章

  1. 《Code Complete》ch.15 使用条件语句
  2. mysql 事务 数量_如何知道数据库创建以来并发事务的最大数量
  3. 【模型训练】SGD的那些变种,真的比SGD强吗
  4. 圆括号匹配c语言代码,求救!!一道关于表达式圆括号匹配的经典题目
  5. jQuery formValidator 表单校验插件4.1.1高仿网易邮箱注册页面(已发演示链接)
  6. 最详细的YOLOv3论文笔记
  7. linux内核锁死怎么解决_解决Linux内核中的2038年问题
  8. 【算法总结】积性函数相关
  9. 7000字整理: 全网最详细Pandas合并数据集操作总结
  10. Codeforces Round #360 (Div. 2) C. NP-Hard Problem 水题
  11. vivo手机解锁工具_vivo正式官宣APEX 2020概念手机!或将实现全面屏指纹解锁
  12. 6种最好的图片无损压缩工具
  13. (原创)十大危险cmd命令代码总结
  14. 霍夫丁------霍夫丁不等式
  15. 物联网安全风险威胁报告
  16. 【转】中国只有俩导演,一个叫贾樟柯,一个叫姜文
  17. ES Elasticsearch
  18. linux打开文件管理器的快捷键
  19. 116 Ajax简单应用
  20. 精读5G:关于5G的NSA和SA,看完秒懂!

热门文章

  1. ZOJ-2770 Burn the Linked Camp 差分约束
  2. LD_DEUBG 调试动态库加载
  3. Python使用LDAP做用户认证
  4. Python基础学习01
  5. 剑指Offer面试题:4.从尾到头打印链表
  6. zookeeper+kafka集群安装之中的一个
  7. c#实现Socket网络编程
  8. CentOS6.8网络接口配置文件ifcfg-eth0
  9. REST Framework 的用户认证组件
  10. Flutter入门三部曲(3) - 数据传递/状态管理 | 掘金技术征文