前端跨頁面通信 的幾種思路

同源頁面

A頁面打開B頁面,B頁面的業(yè)務(wù)進(jìn)行完成后,B頁面需要觸發(fā)A頁面的某刷新方法

廣播模式,頁面將消息通知給一個(gè)中轉(zhuǎn),中轉(zhuǎn)再通知給各個(gè)頁面。中轉(zhuǎn)可以是一個(gè) BroadCast Channel 實(shí)例、一個(gè) Service Worker 或是 LocalStorage。

BrocastChannel

BrocastChannel可以實(shí)現(xiàn)同源下瀏覽器不同窗口,tab頁,frame或frame下的瀏覽器上下文之間的通信。

// a頁面
var bc = new BroadcastChannel('qwer')
bc.postMessage('發(fā)送數(shù)據(jù)')

// b頁面
var bc = new BroadcastChannel('qwer')
bc.onmessage = function(e) {
  console.log(e)
}
/** 消息發(fā)送后,所有連接到該頻道的 BrocastChannel對象上都會(huì)觸發(fā) meaasge事件,
該事件沒有默認(rèn)行為,可以使用`onmessage`事件處理程序來定義一個(gè)函數(shù)處理消息
**/

LocalStorage

LocalStorage是前端常用的本地存儲(chǔ),當(dāng)LocalStorage變化是,會(huì)觸發(fā)storage事件,發(fā)送消息時(shí),將消息寫入LocalStorage中,然后在各個(gè)頁面中,通過監(jiān)聽storage事件即可收到通知。

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

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



1、A頁面的mounted里監(jiān)聽

    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頁面觸發(fā)

        let CHANNEL_CODE = 'refreshTable'
          let listenChannel = new BroadcastChannel(CHANNEL_CODE);
          listenChannel.postMessage({
            type: 'refreshTable',
            success: 'true' + Math.random()
          });
          console.log("觸發(fā)刷新數(shù)據(jù)" )
          listenChannel.close();

Vuex

如果是vue項(xiàng)目
還可以考慮將監(jiān)測數(shù)據(jù)存入到store里,在A頁面的computed拿到檢測數(shù)據(jù),然后watch數(shù)據(jù)的變化;


或者在瀏覽器緩存存儲(chǔ)檢測數(shù)據(jù),在A頁面定時(shí)器獲取檢測數(shù)據(jù)來判斷變化

通過事件的發(fā)布訂閱模式

代碼實(shí)現(xiàn)
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()

使用:

發(fā)布事件
              import $SLMC from "@/utils/msgCenter";

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

訂閱事件
              import $SLMC from "@/utils/msgCenter";

              $SLMC.on("refreshTable", this.refreshTable);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.vue優(yōu)點(diǎn)?答:輕量級框架:只關(guān)注視圖層,是一個(gè)構(gòu)建數(shù)據(jù)的視圖集合,大小只有幾十kb;簡單易學(xué):國人開發(fā),中文...
    高磊_IT閱讀 1,636評論 0 1
  • vue生命周期面試題vue 生命周期是什么? Vue 實(shí)例從創(chuàng)建到銷毀的過程,就是生命周期 beforeCreat...
    WEB前端含光閱讀 790評論 0 2
  • 一、xue的生命周期是什么 vue每個(gè)組件都是獨(dú)立的,,每個(gè)組件都有一個(gè)屬于他的生命周期,從一個(gè)組件創(chuàng)建、數(shù)據(jù)初始...
    康娜閱讀 1,255評論 0 0
  • 1.URL和URI的區(qū)別? URI: Uniform Resource Identifier 指的是統(tǒng)一...
    _鬼怪大叔閱讀 563評論 0 0
  • 關(guān)于webpack面試題(點(diǎn)擊查看原文[https://www.cnblogs.com/gaoht/p/11310...
    蘇苡閱讀 286評論 0 1

友情鏈接更多精彩內(nèi)容