首页

Vue 组件通信(父传子,子传父,跨组件传值)

前端达人

目录

一, 简单介绍组件通信

二, 详解传值方法

1.父传子 props

2.子传父 $emit

3.跨组件通信 event-bus


一, 简单介绍组件通信

        我们知道在现在的开发环境下,不管前后端开发都是组件化模块化,这是因为组件的优势无比的巨大,可以进行多次的复用增加开发效率,也可以分类鲜明,便于维护,而我今天所写的就是开发中分割成不同的组件互相传递数据和互动

        我的工作中常用地组件通信大致分为三类: 父传子 , 子传父 , 跨组件传值

        下面就来分别介绍一下 我常用的这三种传值方法

二, 详解传值方法

        父子组件的确认方法:我将 B 组件import引入到 A 组件中,那么 B 就是 A 的子组件,A 就是 B 的父组件

1.父传子 props

        简而言之,父传子就是父组件把数据传给子组件,具体就是如下,在子组件的props中定义自定义属性来待接收父组件的数据,有两种方法 如下:

        第一种,也是最推荐用的一种,以复杂类型的方式进行声明,这样存储的便是一个地址,可以和父组件的数据进行双向绑定,同步数据,虽然可以双向绑定,但是在Vue2.0中还是不可以直接在子组件中更改父组件的数据,需要用到子传父才行,这点等下会写到

        这里只是用 text 举个栗子,具体叫什么都可以哈,只是父子里面需要对应上相同

        这个 text 接收到数据后的使用方法和一般data中声明的变量一样,只是不能再子组件中改变他

子组件中:        props 定义属性接收

 
  1. <template>
  2. <div>
  3. <h2>son组件</h2>
  4. <p>props:{{ text }}</p>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. // 在此处定义props
  10. props: {
  11. // props中定义 接收父组件数据的自定义属性,叫什么都可以,我随便起了个text
  12. text: {
  13. type: String, // type 是用来规定此属性接收到的数据的数据类型
  14. default: "未传递时默认的文字" // 这个default是当这个 text 没有接收到传递的数据时的默认值
  15. }
  16. }
  17. }
  18. </script>

父组件中:        标签内 传递数据

 
  1. <template>
  2. <div id="app">
  3. <!--
  4. 这里的text就是子组件props里定义的text,这两个名字得一致
  5. 并且传递的数据也要符合 type 规定的数据类型
  6. text就是传递字符串,:text就是传递动态数据
  7. -->
  8. <Son text="我是大娃 传给子啦" />
  9. <Son :text="wenzi" />
  10. </div>
  11. </template>
  12. <script>
  13. import Son from './components/son.vue';
  14. export default {
  15. data () {
  16. return {
  17. wenzi: '我是二娃 传给子啦'
  18. }
  19. },
  20. components: {
  21. Son
  22. }
  23. }
  24. </script>

        如上 虽然我的注释写的很清楚了,但是还是在介绍一下, <Son/> 是子组件的标签,在此标签的基础上书写 子组件props 定义的属性名,并且传递参数具体对应关系和效果如下:

        如上就是第一种我最常用的父传子,其实还有一种方法,但是我一般也不用,很不方便,也贴到下边了,这个是以数组方式声明

 
  1. export default {
  2. // 在此处定义props
  3. props: ['text']
  4. }
  5. </script>

 

2.子传父 $emit

        刚刚说到了在 Vue2.0 子组件不能直接改父组件的数据,否则会报错,这个解决方法就是在子组件中发起一个 自定义事件 ,在父组件监听这个事件,并且定义一个函数来改变数据,具体操作如下:

子组件:        发起一个自定义事件,等待父组件监听到执行函数

 
  1. <template>
  2. <div>
  3. <h2>son组件</h2>
  4. <p>props:{{ text }}</p>
  5. <button @click="changeTextFn">改变文字</button>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. // 在此处定义props
  11. props: {
  12. // props中定义 接收父组件数据的自定义属性,叫什么都可以,我随便起了个text
  13. text: {
  14. type: String, // type 是用来规定此属性接收到的数据的数据类型
  15. default: "未传递时默认的文字" // 这个default是当这个 text 没有接收到传递的数据时的默认值
  16. }
  17. },
  18. methods: {
  19. // 按钮点击事件
  20. changeTextFn () {
  21. // 发起自定义事件,名字叫什么都行,第一个参数是事件名,之后再跟着的都是传递的参数
  22. this.$emit('changeFn', '我想变成三娃')
  23. }
  24. }
  25. }
  26. </script>

        我先在原有的代码上添加了一个<button>按钮,在点击调用的函数中,通过 $emit 来发起事件并且可以传递参数

格式:        this.$emit('changeFn', '我想变成三娃') 

格式:        this.$emit('自定义事件名', 传递的参数) 

 

父组件:        行内监听子组件的 自定义事件名(函数上不用写参数,在 methods 中直接写形参就行)

 
  1. <template>
  2. <div id="app">
  3. <Son :text="wenzi" @changeFn="changeFn" />
  4. </div>
  5. </template>
  6. <script>
  7. import Son from './components/son.vue';
  8. export default {
  9. data () {
  10. return {
  11. wenzi: '我是二娃 传给子啦'
  12. }
  13. },
  14. components: {
  15. Son
  16. },
  17. methods: {
  18. // 监听子组件自定义事件
  19. changeFn (newText) {
  20. // 这里的形参接受到的就是子组件中 第二个参数传递的数值
  21. this.wenzi = newText
  22. }
  23. }
  24. }
  25. </script>

对应关系和效果图如下:

 

 

 

3.跨组件通信 event-bus

        如果两个组件的关系非常的复杂或者没有未产生直接联系,那么通过父子组件通讯是非常麻烦的。这时候可以使用通用的组件通讯方案:事件总线(event-bus)

        按照我的习惯,我会将事件总线创建到 main.js 中,这个使用原理是将bus挂载到Vue原型上,这样就可以保证所有的组件都能通过 this.bus 访问到事件总线,从而通过同一个事件总线监听同一个事件,具体原理和父子传参差不多,都是 $emit 传递数据, 只不过接收变成了$on 

        我这次以送礼物举例用了两个关系不大的组件 分别是 男组件 和 女组件 (随便起的名)具体如下图:

发送数据 男组件:   

    this.bus.$emit('自定义事件名',传递的参数) 

 
  1. <template>
  2. <div>
  3. <h1>男组件</h1>
  4. <button @click="sendGiftFn">送礼物</button>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data () {
  10. return {
  11. gift: '玫瑰花'
  12. }
  13. },
  14. methods: {
  15. sendGiftFn () {
  16. // 通过 bus 事件总线发起 自定义事件,并且传递参数(第一个是事件名,第二个开始是参数)
  17. this.bus.$emit('sendMessage', this.gift)
  18. }
  19. }
  20. }
  21. </script>

接收数据 女组件:         

 this.bus.$on('监听的事件名',(e)=>{ e这个形参所接收的就是监听事件所携带的参数数据 }) 

 
  1. <template>
  2. <div>
  3. <h1>女组件</h1>
  4. <p>来自男组件的礼物:{{ info }}</p>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. data () {
  10. return {
  11. info: ""
  12. }
  13. },
  14. created () {
  15. // e 就是 sendMessage 这个事件所传递的数据
  16. this.bus.$on("sendMessage", (e) => {
  17. this.info = e;
  18. });
  19. }
  20. }
  21. </script>
  22. <style>
  23. </style>

具体效果如下:

 

综上所述,就是我在工作中总结出来的一些组建通信的方法,希望您看到这里会有所收获

蓝蓝设计建立了UI设计分享群,每天会分享国内外的一些优秀设计,如果有兴趣的话,可以进入一起成长学习,请扫码蓝小助,报下信息,蓝小助会请您入群。欢迎您加入噢~~希望得到建议咨询、商务合作,也请与我们联系。

分享此文一切功德,皆悉回向给文章原作者及众读者.

转自:csdn
免责声明:蓝蓝设计尊重原作者,文章的版权归原作者。如涉及版权问题,请及时与我们取得联系,我们立即更正或删除。

蓝蓝设计www.lanlanwork.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计 、 cs界面设计 、 ipad界面设计 、 包装设计 、 图标定制 、 用户体验 、交互设计、 网站建设 平面设计服务

日历

链接

个人资料

蓝蓝设计的小编 http://www.lanlanwork.com

存档