美文网首页
前端跨页面通信 的几种思路

前端跨页面通信 的几种思路

作者: 爱学习的小仙女早睡早起 | 来源:发表于2023-08-07 16:38 被阅读0次

同源页面

A页面打开B页面,B页面的业务进行完成后,B页面需要触发A页面的某刷新方法

广播模式,页面将消息通知给一个中转,中转再通知给各个页面。中转可以是一个 BroadCast Channel 实例、一个 Service Worker 或是 LocalStorage。

BrocastChannel

BrocastChannel可以实现同源下浏览器不同窗口,tab页,frame或frame下的浏览器上下文之间的通信。

// a页面
var bc = new BroadcastChannel('qwer')
bc.postMessage('发送数据')

// b页面
var bc = new BroadcastChannel('qwer')
bc.onmessage = function(e) {
  console.log(e)
}
/** 消息发送后,所有连接到该频道的 BrocastChannel对象上都会触发 meaasge事件,
该事件没有默认行为,可以使用`onmessage`事件处理程序来定义一个函数处理消息
**/

LocalStorage

LocalStorage是前端常用的本地存储,当LocalStorage变化是,会触发storage事件,发送消息时,将消息写入LocalStorage中,然后在各个页面中,通过监听storage事件即可收到通知。

// a页面
window.addEventListener('storage', function(e) {
  console.log(e)
})

// b页面
localStorage.setItem('qwer', 10000)



1、A页面的mounted里监听

    let CHANNEL_CODE = 'refreshTable'
    this.listenChannel = new BroadcastChannel(CHANNEL_CODE);
    this.listenChannel.onmessage = (res) => {
        // console.log(res);
        if (res.data.success) {
            that.bs.queryTableList();
        }
    };


// 注意在A页面里这里要销毁
beforeDestory(){
    this.listenChannel.close();
}

2、B页面触发

        let CHANNEL_CODE = 'refreshTable'
          let listenChannel = new BroadcastChannel(CHANNEL_CODE);
          listenChannel.postMessage({
            type: 'refreshTable',
            success: 'true' + Math.random()
          });
          console.log("触发刷新数据" )
          listenChannel.close();

Vuex

如果是vue项目
还可以考虑将监测数据存入到store里,在A页面的computed拿到检测数据,然后watch数据的变化;


或者在浏览器缓存存储检测数据,在A页面定时器获取检测数据来判断变化

通过事件的发布订阅模式

代码实现
utils/msgCenter.js

class msgCenter {
    constructor() {

    }

    msgObj = new Object();

    on = (msgName, func) => {
        this.msgObj[msgName] = func;
    }

    one = (msgName, func) => {
        this.msgObj[msgName] = func;
    }

    emit = (msgName, data) => {
        if (!Object.prototype.hasOwnProperty.call(this.msgObj, msgName)) return;
        this.msgObj[msgName](data);

    }

    off = (msgName) => {
        if (!Object.prototype.hasOwnProperty.call(this.msgObj, msgName)) return;
        delete this.msgObj[msgName];
    }

}

export default new msgCenter()

使用:

发布事件
              import $SLMC from "@/utils/msgCenter";

              $SLMC.emit("refreshTable", data);  

订阅事件
              import $SLMC from "@/utils/msgCenter";

              $SLMC.on("refreshTable", this.refreshTable);

相关文章

  • 前端跨页面通信

    跨页面通信主要分两大类 同源页面间的跨页面通信 非同源页面间的跨页面通信 同源页面间的跨页面通信 1.BroadC...

  • iframe和父级窗口通信

    1:目前需求需要在页面中嵌入一个外部页面,同时页面实现跨域通信。 1:思路是利用postMessage来实现交互。...

  • 前端跨页面通信:Broadcast Channel

    虽然日常开发并不常见,偶尔还是会闪现这样一个需求: 一个项目同时打开了两个页面,一个页面的某个操作我想让另一个页面...

  • 监听localStorage中值的变化实现跨页面通信

    本次分享一个之前困扰很久的,跨页面之间的通信方式。 以前跨页面通信,就拿我们之前vue项目中多页面为例,每个页面都...

  • 前端跨tab页通信

    一、同源页面间的跨页面通信 BroadCast Channel Service WorkerService Wor...

  • 同源跨页面通信

    同源跨页面通信小记 BroadcastChannel The BroadcastChannel interface...

  • 前端页面通信

    websocket:需要服务端配合socket.io/ websocket-node service worker...

  • kbone 高级 - 跨页面通信和跨页面数据共享

    在 kbone 中,每个页面拥有独立的 window 对象,页面与页面间是相互隔离的,为此需要一个跨页面通信和跨页...

  • 小程序页面之间如何通讯

    首先将通信的模型列举出来, 分为以下几种 1.兄弟页面间通信2.父路径页面向子路径页面通信3.子路径页面向父路径页...

  • react之组件通信

    需要组件之进行通信的几种情况: 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 ...

网友评论

      本文标题:前端跨页面通信 的几种思路

      本文链接:https://www.haomeiwen.com/subject/mspgpdtx.html