vue基础 - 11 (组件间的通信:event bus -- 事件车,$emit,$on,$off,封装一个事件车)

技术名称: event bus  -- 事件车

场景: 在`头部组件`中点击搜索按钮, 需要把输入框的值传递给`商品组件`

这些组件的共同点: 同一个vue对象管理的, 这些组件中的`this.$root` (root:根源,根) 是同一个对象

Vue对象提供3个方法:

- `$emit('事件名', 参数)`:触发一个事件

- `$on(监听事件名, 回调函数)`:监听指定事件触发

- `$off(监听事件)`: 删除事件的监听

例子:

1、触发事件:

        Header.vue头部组件中,点击搜索,触发事件

        this.$root.$emit("search_kw", this.kw)

        散布消息:this.kw

methods: {
    //1、当前不是Products触发跳转,2、如果是Products则触发搜索操作
    goProducts() {
      console.log("route", this.$route);
      if (this.$route.name == "Products") {
        //发布消息:搜索操作被触发,值是kw
        //$root:所有组件最终会出现在同一个vue对象中,这个vue对象就是根root
        //$emit:散布消息
        this.$root.$emit("search_kw", this.kw);
      } else {
        this.$router.push(`/products/${this.kw}`);
      }
    },
},

2、监听事件:

        Products.vue,接收散布过来的消息,然后网络请求获取数据

        this.$root.$on

 mounted() {
    this.getData(this.kw); //首次切换到当前组件,采用路由中提供的词
    //挂载时,监听搜索消息被触发这个消息$emit 
    this.$root.$on("search_kw", (kw) => {
      console.log("搜索操作:", kw);
      // this.kw = kw; //收到的消息kw,赋值到本地,好用,但是报错,this代表data,变量与props冲突
      this.getData(kw); //调用获取数据的方法
    });
  },

        注意:此处的kw存在变量props中,如果通过this.kw重新赋值,会冲突,所有获取网络数据的时候采用传参的方式

methods: {
    getData(kw) {
      let url = "product/list.php?pno=1&kw=" + kw;
      this.axios.get(url).then((res) => {
        console.log(res);
        this.data = res.data;
      });
    },
  },

3、删除事件监听:

        Products.vue,每次路由切换到当前组件,都会触发挂载方法,就会添加一个新的监听器,应该在组件销毁前删除监听器

        this.$root.$off

beforeDestroy() {
    console.log("组件将要销毁,删除监听器search_kw");
    //$off(监听的信息):删除监听器
    this.$root.$off("search_kw");
  },


        $root:整个项目的根 vue 对象

        如果事件车使用特别多,不推荐直接使用 $root 对象,会增加 vue 对象的负载,推荐自己制作一个专门的 vue 对象,就是用来做事件车使用

//main.js中书写

let eventBus = new Vue();
//为了方便后续使用, 注入到 页面Vue对象的原型中
Vue.prototype.eventBus = eventBus;

     后续使用时,调用this.eventBus.$emit 、this.eventBus.$on、.eventBus.$off

sendSMS() {
      //使用原型中的 eventBus
      this.eventBus.$emit("短信", "111444");
},
this.eventBus.$on("短信", (value) => {
      console.log("收到短信:", value);
 });

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值