umi之qiankun全局傳值三種解決方案

使用initGlobalState(state)全局傳值

  • 參數(shù)

    • state - Record<string, any> - 必選
  • 用法

    定義全局狀態(tài)铡原,并返回通信方法量九,建議在主應(yīng)用使用黍檩,微應(yīng)用通過 props 獲取通信方法申钩。

  • 返回

    • MicroAppStateActions

      • onGlobalStateChange:==監(jiān)聽數(shù)據(jù)變化==

        (callback: OnGlobalStateChangeCallback, fireImmediately?: boolean) => void次绘, 在當(dāng)前應(yīng)用監(jiān)聽全局狀態(tài),有變更觸發(fā) callback撒遣,fireImmediately = true 立即觸發(fā) callback

      • setGlobalState:==改變數(shù)據(jù)==

        (state: Record<string, any>) => boolean邮偎, 按一級屬性設(shè)置全局狀態(tài),微應(yīng)用中只能修改已存在的一級屬性

      • offGlobalStateChange: ==移除監(jiān)聽==

        () => boolean义黎,移除當(dāng)前應(yīng)用的狀態(tài)監(jiān)聽禾进,微應(yīng)用 umount 時會默認(rèn)調(diào)用

  • 示例

主應(yīng)用:

import { initGlobalState, MicroAppStateActions } from 'qiankun';

// 初始化 state
const actions: MicroAppStateActions = initGlobalState(state);

actions.onGlobalStateChange((state, prev) => {
  // state: 變更后的狀態(tài); prev 變更前的狀態(tài)
  console.log(state, prev);
});
actions.setGlobalState(state);
actions.offGlobalStateChange();

微應(yīng)用:

// 從生命周期 mount 中獲取通信方法,使用方式和 master 一致
export function mount(props) {

  props.onGlobalStateChange((state, prev) => {
    // state: 變更后的狀態(tài); prev 變更前的狀態(tài)
    console.log(state, prev);
  });

  props.setGlobalState(state);
}

優(yōu)點:可傳遞store到各子應(yīng)用

缺點:子應(yīng)用在app.ts中才比較好使用props.onChangeGlobalState之類語法

路由綁定式消費微應(yīng)用

主應(yīng)用:需要在 src/app.ts 里導(dǎo)出一個 useQiankunStateForSlave 函數(shù)廉涕,函數(shù)的返回值將作為 props 傳遞給微應(yīng)用泻云,如:

// src/app.ts
export function useQiankunStateForSlave() {
  const [globalState, setGlobalState] = useState({ str: 'aaa' })
  const [ablState, setAblState] = useState({ hh: 'kkk' })
  // 實際給子應(yīng)用調(diào)用修改state的方法  
  // 傳參和實現(xiàn)可以自定義,子應(yīng)用直接調(diào)用setGlobalState是不生效的火的,所以才需要這個額外的方法壶愤,這是一個坑  
  const setState = (str: any) => { setGlobalState({ str}) }  
  const setablState = (hh: any) => { setAblState({hh}) }  
  return { globalState, setGlobalState, setState ,ablState,setAblState,setablState};
}
  • 實際給子應(yīng)用調(diào)用修改state的方法 ,傳參和實現(xiàn)可以自定義馏鹤,子應(yīng)用直接調(diào)用setGlobalState是不生效的征椒,所以才需要這個額外的方法,這是一個坑

子應(yīng)用:微應(yīng)用中會自動生成一個全局 model湃累,可以在任意組件中獲取主應(yīng)用透傳的 props 的值勃救。

import { useModel } from 'umi';
   
function MyPage() {
  const masterProps = useModel('@@qiankunStateFromMaster');
  return <div>{ JSON.strigify(masterProps) }</div>;
}

子應(yīng)用中的改變和監(jiān)聽

const alist=masterProps.globalState.str.list
console.log(alist)
masterProps.onGlobalStateChange((state: any, prev: any) => {
state: 變更后的狀態(tài); prev 變更前的狀態(tài)
console.log(state, prev);
 });
 useEffect(() => {    masterProps.setState('bbb')  }, [])
    console.log('masterProps',masterProps)

基于 props 傳遞

類似 react 中組件間通信的方案

  1. 主應(yīng)用中配置 apps 時以 props 將數(shù)據(jù)傳遞下去(參考主應(yīng)用運行時配置一節(jié))

    // src/app.js
       
    export const qiankun = fetch('/config').then(config => {
      return {
        apps: [
          {
            name: 'app1',
            entry: '//localhost:2222',
            props: {
              onClick: event => console.log(event),
              name: 'xx',
              age: 1,
            },
          },
        ],
      };
    });
    
  2. 子應(yīng)用在生命周期鉤子中獲取 props 消費數(shù)據(jù)(參考子應(yīng)用運行時配置一節(jié))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市治力,隨后出現(xiàn)的幾起案子蒙秒,更是在濱河造成了極大的恐慌,老刑警劉巖宵统,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晕讲,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓢省,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門弄息,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勤婚,你說我怎么就攤上這事摹量。” “怎么了馒胆?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵缨称,是天一觀的道長。 經(jīng)常有香客問我祝迂,道長睦尽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任液兽,我火速辦了婚禮骂删,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘四啰。我一直安慰自己,他們只是感情好粗恢,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布柑晒。 她就那樣靜靜地躺著,像睡著了一般眷射。 火紅的嫁衣襯著肌膚如雪匙赞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天妖碉,我揣著相機(jī)與錄音涌庭,去河邊找鬼。 笑死欧宜,一個胖子當(dāng)著我的面吹牛坐榆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冗茸,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼席镀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夏漱?” 一聲冷哼從身側(cè)響起豪诲,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎挂绰,沒想到半個月后屎篱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年交播,在試婚紗的時候發(fā)現(xiàn)自己被綠了专肪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡堪侯,死狀恐怖嚎尤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伍宦,我是刑警寧澤芽死,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站次洼,受9級特大地震影響关贵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卖毁,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一揖曾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧亥啦,春花似錦炭剪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至届吁,卻和暖如春错妖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疚沐。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工暂氯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亮蛔。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓痴施,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尔邓。 傳聞我的和親對象是個殘疾皇子晾剖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)梯嗽,斷路器齿尽,智...
    卡卡羅2017閱讀 134,638評論 18 139
  • 前言 隨著技術(shù)的發(fā)展,前端應(yīng)用承載的內(nèi)容也日益復(fù)雜灯节,基于此而產(chǎn)生的各種問題也應(yīng)運而生循头,從MPA(Multi-Pag...
    維李設(shè)論閱讀 1,525評論 0 0
  • 今天是親子菜商訓(xùn)練營的第七天绵估,也是這一個訓(xùn)練營的最后一天。那么今天訓(xùn)練營的內(nèi)容呢是由洪濤教練以及其他幾位嘉賓分享自...
    陳元昊閱讀 493評論 0 1
  • 久違的晴天卡骂,家長會国裳。 家長大會開好到教室時,離放學(xué)已經(jīng)沒多少時間了全跨。班主任說已經(jīng)安排了三個家長分享經(jīng)驗缝左。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,515評論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友浓若。感恩相遇渺杉!感恩不離不棄。 中午開了第一次的黨會挪钓,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,559評論 0 11