当前位置:首页 » 网页前端 » 前端页面通信
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

前端页面通信

发布时间: 2023-08-31 01:27:05

1. 前端跨域通信的⼏几种⽅方式

自定义事件组件间通信深入理解:

自定义事件:自己定义的事件:事件类型(自己定义)和回调函数(自己定义自己触发)

系统定义的事件:事件类型(固定几个)和回调函数(自己定义系统触发)

做法:在父组件当中可以看到子组件对象,给子组件对象绑定自定义事件$on 回调函数在父组件中

在子组件当中,我们需要传递数据的地方,去触发自己身上的事件$emit,调用回调函数中传参给父

适用:子向父通信

原因:因为父组件内部可以看到子组件对象,可以给子组件对象绑定事件,回调函数在父组件定义

而子组件内部看不到父组件对象,没法给父组件对象绑定事件,子组件没法定义回调函数,但是可以看到自己,可以触发

接受数据的组件必须能看到预绑定事件的组件对象,才能绑定

发送数据的组件必须能看到绑定了事件的组件对象,才能触发事件

$on

$emit

$off //解绑事件

$once //绑定只能触发一次的事件

vm和组件对象的关系

全局事件总线组件间通信

适用于任意组件间传递 必须理解必须搞定

利用了自定义事件

创建一个中间人,让所有的组件都可以看到这个人,并且这个人可以使用$on和$emit (vm添加到Vue原型当中作为总线)

在想要接受数据的组件内 找中间人去绑定事件

在想要发送数据的组件内 触发中间人绑定的事件

通信方式 props

父子之间传递

父向子传递属性,通过属性把数据交给子组件

子向父传递数据,子组件通过调用父组件的行为函数,把数据当参数交给父组件使用场合:

父子最好

父向非子后代传递,必须逐层去传递 麻烦

不是父子关系的组件,必须借助相同的父组件去通信 麻烦

通信方式 vue自定义事件 子向父传递,只是适合这个场合

理解原生dom事件:

事件类型 : 固定的有限的几个

回调函数 : 谁调用(浏览器) 调用时候的默认参数(事件对象event)

vue自定义事件

事件类型 : 无数个

回调函数 : 谁调用 (自己调用) 调用时候默认的参数 (有可能有也可能没有 如果调用时候传了参数,默认参数就有

如果没有传,那就没有(undefined))

父组件当中去给子组件对象绑定事件监听

@直接在组件标签对象当中去绑定,和绑定系统事件一致

$on,在mounted当中去绑定,但是需要获取到子组件标签对象(通过ref指定,然后获取到)

$once()和$on()类似,但是只能触发一次

在子组件当中适当的位置去触发事件并传递参数

$emit(),在子组件当中去触发,子组件对象触发

$off()可以在销毁之前解绑事件

使用场合:子向父传递数据,其余情况都不能用

通信方式 全局事件总线

适用场合: 任何场合

事件总线(对象)满足的两个条件:1、所有的组件对象都能找到它 2、可以调用$on和$emit

vm对象和组件对象的关系

vm的原型对象 === 组件对象的原型对象的原型对象

本身自定义事件可以完成子向父之间的传递,因为父组件中可以看到子组件,可以为子组件绑定事件,子组件中可以触发事件

但是如果不是子向父,那么其余的就没办法了,因为两个组件互相是看不到的,没办法再其中一个给另外一个绑定事件

此时我们可以借助中间人,也就是他们都可以同时看到的一个人,就是全局事件总线(所有的组件对象都能看到)

在接收数据的组件中,获取总线绑定事件

在发送数据的组件中,获取总线触发事件

全局事件总线说到底就是个对象,我们通常就是用vm对象作为全局事件总线使用

把vm对象添加到Vue原型对象 就形成全局事件总线(vm)

通信方式 消息订阅和发布(类似于全局事件总线,vue当中几乎不用)

github查阅 PubSubJS第三方库

订阅者是接收数据的组件

发布者是发送数据的组件

坑: 订阅者的回调函数里面形参第一个必须有,而且是为了接受发布者的消息类型的,实际意义没有,但是必须写上

通信方式 slot插槽

一个组件会多次使用,但是又有少部分结构数据会发生变化,(当然可以用不同的子组件)

那么就得通过父组件告诉子组件变化的内容是什么,此时就要用到这个插槽

子组件当中<slot></slot>其实就是占位用的,让父元素给它填充内容,可以带标签

具名插槽

默认插槽

作用域插槽

子组件的slot可以通过 属性传递值给父组件,然后父组件可以根据不同需求改变这个slot内部的显示结构

把子组件的值,传给父组件固定的区域进行操作

2. 前端多系统集成通信

集成多个相互独立的系统展示在一孙碰握个页面上,多个系统可以相互进行数据通信。

一般会存在3种信息传递场景:
1: 父——>子 由父系统把消息传递到子系统

2: 子1——>父——>子2 🈶子1把消息传递给子2,但是需要父系统作为代理中转

3: 子——> 父 由子系统把消息传递给父系统

在此不再详细赘述此技术,可通过相关书籍(推荐《JavaScript高级程序设计》)和博客自行学习。

注意: 前端框架使用vue

步骤:

2: 父系统触发事件,例如click事件,通吵让过id获取子系统的window,然后发送消息,例如触发的事件名为: postMessage

3: 子系统接收数据
以app1为例:
在vue中,可以写在mounted钩子函数中;
在原生js中,可以写在 window.onload = function () {} 中,页面渲染的时则庆候进行接收消息事件注册

页面展示效果:

以app1为例
app1系统触发事件,例如click事件,直接获取parent对象(父系统window),通过parent发送消息,例如触发的事件名为: postMessage

然后需要在父系统里注册message事件,来监测从app1传来的消息

页面展示效果:

解决办法是需要通过父系统作为代理来进行传递数据,我们从app1 将数据通过父系统传递给app2
首先在app2触发消息传递

父系统接收数据,做转发的准备

app2注册message事件,来接收从app来的消息

页面展示效果如下: