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>
Vue组件中,v-model可以用于实现子组件与父组件之间的双向数据绑定。具体的传值过程如下: 1. 在子组件中,使用props来定义需要接收的value参数。例如props: { value: [String, Object] }。 2. 在子组件中,使用watch来深度监听value的变化。可以设置immediate为true,以便在初始化时立即改变监听的。例如watch: { value: { handler: function(val, oldVal) { this.videoForm.showVideoPath = val; }, deep: true, immediate: true } }。 3. 子组件中的某个事件(例如上传成功的回调函数)需要通过$emit("input", )来将传递给父组件的v-model。例如this.$emit("input", res.url)。 在父组件中,使用v-model来绑定子组件的。例如<video-upload v-model="form.videoDz" />。 总结起来,v-model传值的过程包括在子组件中定义props来接收value参数,在watch中监听value的变化,并通过$emit("input", )来将传递给父组件的v-model。在父组件中使用v-model来绑定子组件的。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue——父子组件通过v-model传值和显示](https://blog.csdn.net/weixin_42247720/article/details/127650801)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue父子组件v-model传值](https://blog.csdn.net/libinemail/article/details/123826501)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值