组件之间通过bus中央事件总线进行通信

news2024/11/16 12:01:22

案例完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../lib/vue.js"></script>
    <style>
        div img{
            width: 100px;
        }
        .active{
            width: 300px;
            min-height: 200px;
            background-color: yellow;
            position: fixed;
            right: 50px;
            top: 100px;
            border: 1px solid blue;
        }
    </style>
</head>
<body>
    <div id="box">
        <button @click="handleAjax">ajax</button>

        <film-item v-for="item in datalist" :key="item.filmId" :mydata="item"></film-item>
        
        <film-detail></film-detail>
    </div>
    <script>
        //定义bus
        var bus = new Vue()
        //bus中有两个方法:
        //bus.$on() 监听
        //bus.$emit() 触发


        Vue.component("filmItem",{
            props:['mydata'],
            template:`
            <div>
                <img :src="mydata.poster">
                {{mydata.name}}
                <button @click="handleClick">详情</button>
            </div>
            `,
            methods:{
                handleClick(){
                    console.log(this.mydata.synopsis)
                    //发布者
                    bus.$emit("yiyi",this.mydata.synopsis)
                }
            }
        })

        Vue.component("filmDetail",{
            data(){
                return{
                    info:""
                }
            },

            // 生命周期,组件创建完就会触发
            mounted(){
                //订阅者,监听要在发布之前就做好,不然有可能监听不到,
                bus.$on("yiyi",(data)=>{
                    console.log("111",data)
                    this.info=data
                })
            },

            
            template:`
                <div class="active">
                    {{info}}
                </div>
            `,

        })

        new Vue({
            el:"#box",
            data:{
                datalist:[],
            },
            methods:{
                handleAjax(){
                    fetch("test.json").then(res=>res.json())
                    .then(res=>{
                        console.log(res.data.films)
                        this.datalist=res.data.films
                    })
                },
            }
        })
    </script>
</body>
</html>

结果:

 

  • 上面的代码实现了兄弟之间的通信,中间人不再是“父组件”,而是通过 bus中央事件总线 来实现的;

bus中央事件总线引入:

如果说是简单的兄弟之间的通信,可以用父组件进行通信,但是如果说稍微复杂一点呢,叔侄之间的通信呢,用父组件做中间人就很麻烦了;

有两种办法:

  • bus中央事件总线 和 vuex状态管理;简单一点的用前者,更复杂一点的用后者;
  • 这一篇我们引入了 bus中央事件总线 ;

bus的原理:

  • 原理很简单就是订阅发布模式;就是定义一个bus--一个vue实例,然后通信的两端,一个是发布者,一个是订阅者;
  • 发布者是控制事件的触发;
  • 订阅者是监听事件,事件触发后,执行函数代码;
  • bus里有两个方法,bus.$on()、bus.$emit();
  • bus.$on():是监听方法,给订阅者用来监听事件;
  • bus.$emit():是事件触发方法,给发布者来进行事件触发;
  • 关系简单用“bus”,很复杂用“vuex” ;
  • 原理图:

 


关键代码说明:

首先定义bus:

var bus = new Vue()
  • 要使用bus,先定义bus,是一个Vue实例; 

 发布者事件触发:

//发布者
bus.$emit("yiyi",this.mydata.synopsis)
  • 要触发的事件是“yiyi”,这个事件名是自定义的,后面参数是要传给订阅者的参数;

订阅者监听到事件触发后,执行函数:

    // 生命周期,组件创建完就会触发
    mounted(){
         //订阅者,监听要在发布之前就做好,不然有可能监听不到,
         bus.$on("yiyi",(data)=>{
              console.log("111",data)
              this.info=data
         })
    },
  • 订阅者的监听方法要在发布者触发之前就定义好,不然有可能监听不到;
  • mounted(){}:是Vue中的一个生命周期,在组件创建完以后就自动被触发;
  • 所以我们把监听方法放在 mounted(){}去执行,当组件创建完,监听方法就准备好监听了;
  • 监听方法第一个参数是要监听的事件,第二个参数是一个回调函数,回调函数的参数是用来接收发布者传来的实参,然后这个data参数是临时的,不能显示在页面上,所以订阅者要重新定义一个状态来接收它,也就是代码中的info;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

66. SAP ABAP Function Module 的动态调用方式使用方式介绍

在本教程前面的步骤 7,我们介绍了 ABAP Function Module 的基本使用方法: 7. ABAP function module 的使用最近我的知识星球有朋友提问: 大佬,我想问一下动态获取到物料主数据的字段名之后,如何将获取到的字段名去与bapi中的字段名对应起来从而去修改物料主数据中对应的字…

多维时序 | MATLAB实现CNN-GRU多变量时间序列预测

多维时序 | MATLAB实现CNN-GRU多变量时间序列预测 目录多维时序 | MATLAB实现CNN-GRU多变量时间序列预测基本介绍模型特点程序设计学习总结参考资料基本介绍 本次运行测试环境MATLAB2020b&#xff0c;MATLAB实现CNN-GRU多变量时间序列预测&#xff0c;卷积门控循环单元。 模型特…

ComponentAce FlexCompress强大功能

ComponentAce FlexCompress强大功能 FlexCompress是一个高速压缩库&#xff0c;旨在为您的应用程序提供归档功能。此解决方案提供了灵活的压缩和强大的加密算法&#xff0c;使您可以快速轻松地将归档或备份功能集成到程序中。 FlexCompress包括我们新的独特技术&#xff0c;即交…

分片架构设计技巧

Elasticsearch集群设计技巧 ES的基本架构 节点可以配置为不同角色&#xff0c;通过选举Master管理集群Coordinating&#xff1a;协调节点&#xff1b;Master&#xff1a;管理节点&#xff1b;Data&#xff1a;数据存储节点 数据是按照索引分片的&#xff0c;而不是按照节点分片…

在C#方法中 out、ref、in、params 关键字的用法

out&#xff1a;关键字&#xff1a; 指定的参数在进入函数时会清空自己&#xff0c;必须在函数内部赋初值 ref关键字&#xff1a; 指定的参数必须在进入函数时赋初值&#xff0c;在函数内部可以重新赋值 In关键字&#xff1a; 指定的参数必须在进入函数时赋初值&#xff0c;…

MySQL进阶篇(五)- 锁

一、概述&#xff08;P121&#xff09; 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、 RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性…

51、部署PaddleSeg的pp_liteseg到MNN框架、OpenVINO框架和OAK框架、NPU(RK3399 PRO)框架

基本思想&#xff1a;需要一个快的实例分割模型&#xff0c;由于需要配置oak使用&#xff0c;所以就记录和实现一下微软社区提供的思路&#xff0c;去部署PaddleSeg的轻量级(实际是语义)分割模型 所有的实验模型&#xff0c;花了两天。。。mmp 自己训练模型&#xff0c;开始整…

[附源码]java毕业设计药品销售管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【AI】浅谈梯度下降算法(理论篇)

前言 在求解机器学习算法的模型参数&#xff0c;即无约束优化问题时&#xff0c;梯度下降&#xff08;Gradient Descent&#xff09; 是最常采用的方法之一&#xff0c;另一种常用的方法是最小二乘法。 目前正在学习这方面相关的内容&#xff0c;因此简单谈谈与梯度下降法相关…

13T搅拌运输车冷却系统改进设计

目 录 摘 要 1 Abstract 2 1绪论 5 1.1选题背景及意义 5 1.2研究现状 6 1.2.1 影响13T混凝土搅拌运输车冷却系统的因素以及目前存在的问题 6 1.2.2目前存在的问题 6 1.2.3现代冷却系统研究现状及发展方向 7 1.3研究主要内容 8 2 13T混凝土搅拌运输车冷却系统组成功用和选型 9 2…

m基于PTS+TR的OFDM系统PAPR联合抑制算法matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 部分传输序列(Partial Transmit Sequence , PTS)由于其不受载波数量限制&#xff0c;并且能够有效的&#xff0c;无失真的降低OFDM信号峰均比&#xff0c;而受到广泛关注。部分传输序列算…

m基于matlab的无线光通信CDMA闭环链路功率控制算法仿真,对比了OOK,2PPM,4PPM,8PPM,16PPM

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 在光通信领域&#xff0c;多址技术主要有WDM(波分复用)、TDM(时分复用)及OCDMA(光码分多址)三种方式。OCDMA技术从70年代中期开始出现&#xff0c;现在引起了人们的广泛重视。将CDMA(码分…

谁能拒绝一个会动的皮卡丘挂件

说在前面 &#x1f388;相信很多80、90后的朋友&#xff0c;对QQ宠物印象非常深刻&#xff0c;每次开机宠物就会自动跑出来。曾经很多人想饿死他&#xff0c;但失败了&#xff1b;也有很多人一上线就退出&#xff0c;但就是不愿因取消“开机自动开启”的勾选。2018年09月15日&a…

基于simulink的直升机控制系统

目录 1.算法描述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法描述 直升机机体减振为目标,研究基于自适应滤波技术的前馈控制问题.为了模拟机体的力学特性以及旋翼对机体的激振作用,采用了FIR,SIIR等滤波模型进行识别和控制.通过对作动器和与之相适应的滤…

【MyBatis】二、入门程序

第一个程序 一、resources目录 放在resources目录的一般是资源文件、配置文件&#xff0c;直接放在该路径的资源相当于放到了类的根路径下。 二、开发步骤 1.打包方式jar <!--打包方式jar--><packaging>pom</packaging>2.引入依赖 mybatis依赖 mysql驱动…

网页设计成品DW静态网页Html5响应式css3——电影网站bootstrap制作(4页)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

求圆心到点的直线与圆的相交点

求圆心到点的直线与圆的相交点 点B为圆上一动点&#xff0c;已知圆心O(x2,y2), 圆外点A(x1,y1)&#xff0c;圆半径r值&#xff0c;求B(x,y)坐标。 由图可知,产生下面两个公式。 m/n y1-y2/x1-x2 m^2n^2r^2 由上面的公式可以得出 n的长度计算公式为n^2 r^2 / [ (y1-y2 / x1-x…

昨日,一老师课前预测日本赢球,结果令人惊叹

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 世界杯是当前最为热门的一个体育赛事&#xff0c; 也是很多小伙伴最为喜欢的一个体育运动之一 而在昨日第四场&#xff1a;F组第一轮&#xff0c;比赛时间&#xff1a;2022年11月23日 21:00 德国VS日本 被一老师成功预测…

视频怎么加水印?这里有你想要的答案

现在不管是游戏解说&#xff0c;还是一些网课视频&#xff0c;亦或是视频博主制作的vlog&#xff0c;我们都能看到这些视频带上了水印&#xff0c;它不仅可以防止其他人随意盗用视频&#xff0c;还可以很好地为自己作宣传&#xff0c;吸引流量。不过还是有很多小伙伴没有著作权…

大部分PHP程序员,都搞不懂如何安全代码部署【二】(nginx篇)

在此之前发布了 代码安全部署的&#xff0c;里面写的nginx 配置安全写了一点点&#xff0c;今天具体补充一下nginx 的配置 nginx站点目录及文件URL访问控制 一、根据扩展名限制程序和文件访问 利用nginx配置禁止访问上传资源目录下的PHP、Shell、Perl、Python程序文件。配置…