vue的组件通信(父传子,子传父,兄弟通信)

前言:

首先我们得了解子组件,组件是页面的一部分,可以理解成为封装的html子组件和放在views底下的区别:页面在坑里加载,而子组件是页面的一部分

方法一:父组件向子组件传值

首先在使用子组件的标签上写一个 自定义属性 属性的值就是要传递的值到了子组件 用props接收 是一个数组,注意不要忘了加“”,props接收到的数据跟data 的用法是一样的

我们来一个最简单的例子:
父组件
//父组件
<template>
  <div class="">
    <div:aaa="msg"></div>
    //首先就是在我们的标签上写一个自定义属性,而这个自定义属性定义的msg在下面data中定义了值
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg: "111",
    };
  },
  mounted() {},
  methods: {},
  components: {
   
  },
};
</script>
<style lang="scss"></style>
子组件
<template>
  <div class="">
    <h5>这是一个子组件</h5>
    接收到的父组件的数据是:
    {{ aaa }}
  </div>
</template>

<script>
export default {
  props: ["aaa"],
  //   props如果不需要识别格式就直接写成数组 如果需要识别格式就写成对象
  data() {
    return {};
  },
  mounted() {},
  methods: {},
};
</script>
<style lang="scss"></style>

方法二:子组件向父组件传值

在父组件中给子组件添加自定义事件,然后在子组件中通过$emit(‘事件名’, ‘要传递的数据’)触发函数并传递数据给父组件
子组件
// 子组件
<template>
<div>
  <span>{{childValue}}</span>
  <!-- 定义一个子组件传值的方法 -->
  <input type="button" value="点击触发" @click="childClick">
</div>
</template>
<script>
  export default {
    data () {
      return {
        childValue: '我是子组件的数据'
      }
    },
    methods: {
      childClick () {
        // childByValue是在父组件on监听的方法
        // 第二个参数this.childValue是需要传的值
        this.$emit('childByValue', this.childValue)
      }
    }
  }
</script>
父组件
// 父组件
<template>
 <div>
  <span>{{name}}</span>
  <!-- 引入子组件 定义一个on的方法监听子组件的状态-->
  <child @childByValue="childByValue"></child>
</div>
</template>
<script>
  import child from './child'
  export default {
    components: {
      child
    },
    data () {
      return {
        name: ''
      }
    },
    methods: {
      childByValue(childValue) {
        // childValue就是子组件传过来的值
        this.name = childValue
      }
    }
  }
</script>

方法三:兄弟通信

通过bus实现,给vue原型上挂载一个new Vue()的实例作为bus 可以通过 bus. e m i t ( ′ 要 触 发 的 事 件 ′ , ′ 要 传 递 的 数 据 ′ ) , 在 要 接 受 数 据 的 页 面 通 过 b u s . emit('要触发的事件', '要传递的数据'),在要接受数据的页面通过bus. emit,,bus.on()接收数据

1.初始化,全局创建 $bus
直接在项目中的 main.js 初始化 $bus :

window.$bus=new Vue();
2. 发送事件

$ bus.$emit(“aMsg”, ‘来自A页面的消息’)

<!-- A.vue -->
<template>
   <button @click="sendMsg()">-</button>
</template>

<script> 
//import $bus from "../bus.js";
export default {
 methods: {
   sendMsg() {
     $bus.$emit("aMsg", '来自A页面的消息');
   }
 }
}; 
</script>
3.接收事件

$bus. $on(“事件名”,callback)

<!-- IncrementCount.vue -->
<template>
 <p>{{msg}}</p>
</template>

<script> 
//import $bus  from "../bus.js";
export default {
 data(){
   return {
     msg: ''
   }
 },
 mounted() {
   $bus.$on("aMsg", (msg) => {
     // A发送来的消息
     this.msg = msg;
   });
 }
};
</script>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值