Vue组件传值——兄弟组件传值

兄弟组件传值

在这里插入图片描述

  • 兄弟组件之间彼此没有联系,它们需要通过中间Vue实例对象bus(快递员)进行数据传递。

1. 声明事件

给组件实例(或Vue实例) 声明事件有两种方式:

  1. 直接声明
  2. 通过$on实现

给组件实例声明事件:

<组件 @事件名称="事件驱动方法"></组件>

通过$on进行声明:

// 语法:
组件实例.$on(事件名称,事件驱动方法(形参,形参){})
// 例如:
// 声明事件
vm.$on('hello',function(traffic,city){console.log(`我坐着{$traffic}到达${city}城市`)})

注意:组件实例 和 vue实例 都可以调用$on。

2. 兄弟组件传值

实现步骤

  1. 定义模块 src/bus.js,内容就是导入Vue模块,并导出一个Vue实例对象:

    import Vue from 'vue'
    export default new Vue() 
    
  2. 在各个兄弟组件中,导入 bus.js 模块:

    import bus from '@/bus.js'
    

    虽然bus.js被各个组件都导入,但是系统中bus只有一份。

  3. 接收数据的兄弟组件的 created 生命周期方法里(使得事件及时响应),发送数据的组件中声明

    使用 bus.$on(‘事件名称’, (接收的数据) => {}) 定义事件成员方法

    created(){
      // 定义事件,注意箭头函数应用
      bus.$on('xxx', data=>{
        console.log(data)
      })
    }
    

    xxx是事件方法的名称。data是形参,待接收数据,并且可以定义多个。

    注意:如果$on内部要使用this,请通过"箭头函数"声明方法。

  4. 发送数据的兄弟组件中,使用 bus.$emit(‘事件名称’, 要发送的数据) 来向外发送参数。

    <button @click="sendMsg">传值</button>
    export default {
      methods: {
        sendMsg(){
          // 触发绑定的事件,并向外传递参数。
          bus.$emit('xxx', '1000元保护费')
        }
      }
    }
    

第一个参数xxx 是接收数据组件给bus声明的方法。第二个参数是传递的实参数据。

说明

  1. Vue实例可以调用$on()方法进行事件方法创建

    实例.$on(名称,(形参,形参,形参……){})
    

    参数根据需要,可以是一个或多个。

  2. Vue实例可以调用$emit()方法进行事件方法执行

    实例.$emit(名称,实参,实参,实参……)
    

    参数 与 $on的形参是一一对应的。

注意

虽然各个兄弟组件针对bus.js都有做引入,系统在运行的时候只有一个bus对象,故大哥 给 bus绑定的事件方法,兄弟组件可以通过bus调用。

案例应用

兄弟组件传值

src/bus.js代码:

// 快递员,负责兄弟组件之间传递数据
import Vue from 'vue'
// 导出一个Vue对象
// 注意:这是一个新的对象,与main.js里边的没有关系
export default new Vue()

First.vue代码(created、$on设置事件方法,准备接受数据):

<template>
    <div id="first">
      <h3>大哥组件</h3>
      <span>{{dt}}</span>
    </div>
</template>

<script>
// 导入bus的模块对象
import bus from '@/bus.js'

export default {
  name: 'First',
  data () {
    return {
      dt: ''
    }
  },
  // 第一时间就把事件声明好,以便小弟调用并传递数据
  created () {
    // 实例对象.$on(事件名称,function(形参,形参){}事件事件的回调方法)
    // 注意:回调函数变为箭头函数,使得this可以正确使用
    bus.$on('jieshou', msg => {
      // console.log(msg)
      // 把数据给dt接收
      this.dt = msg
    })
  }
}
</script>

Second.vue代码(bus调用$emit()调动事件进行数据传递):

<template>
    <div id="second">
      <h3>小弟组件</h3>
      <button @click="back()">给大哥回话</button>
    </div>
</template>

<script>
// 导入bus的模块对象
import bus from '@/bus.js'

export default {
  name: 'Second',
  methods: {
    // 给大哥组件传值
    back () {
      // 使得bus调用自己的事件(是大哥给bus声明的)
      // bus.$emit(事件,参数,参数)
      bus.$emit('jieshou', '1000元保护费')
    }
  }
}
</script>

App.vue代码(引入、注册、使用各个兄弟组件):

<template>
  <div id="app">
    <h2>App根组件</h2>
    <first></first>
    <second></second>
  </div>
</template>

<script>
// 引入、注册、使用 两个兄弟组件
import First from './components/First.vue'
import Second from './components/Second.vue'

export default {
  components: {
    First,
    Second
  }
}
</script>
  • 9
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue组件Vue.js中非常重要的一个概念,它涉及到父子组件之间的数据递和通信。下面是一些常见的Vue组件面试题及其答案: 1. 请介绍Vue组件之间的父子组件方式。 答:Vue组件之间的父子组件方式有props和$emit。通过props可以将数据从父组件递给子组件,子组件通过props接收数据。而$emit则是在子组件中触发一个自定义事件,并通过事件参数将数据递给父组件。 2. 请介绍Vue组件之间的兄弟组件方式。 答:Vue组件之间的兄弟组件方式可以通过共享状态管理工具(如Vuex)或者事件总线来实现。使用共享状态管理工具可以在全局定义一个状态,兄弟组件通过读取和修改该状态来进行数据递。而事件总线则是在Vue实例上定义一个事件中心,兄弟组件通过$emit和$on来进行事件的发布和订阅,从而实现数据递。 3. 请介绍Vue组件之间的跨级组件方式。 答:Vue组件之间的跨级组件方式可以通过provide和inject来实现。父级组件通过provide提供数据,然后子孙级组件通过inject来注入数据。这样就可以实现跨级组件之间的数据递。 4. 请介绍Vue组件之间的非父子组件方式。 答:Vue组件之间的非父子组件方式可以通过事件总线、Vuex或者localStorage等方式来实现。事件总线和Vuex的方式在前面已经介绍过了,而localStorage则是通过将数据存储在浏览器的本地存储中,然后在其他组件中读取该数据来实现非父子组件之间的数据递。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值