博客 / 詳情

返回

使用wujie(無界)微前端過程中的e.target指向問題修復

緣起

微前端的方案很多,大體上調研階段躲不過qiankun, wujie, single-spa這些。

如果你使用的是無界,那麼在使用子應用的時候會發現事件回調函數的e.target指向發生了變化,導致你原先的從e.target.value取值的方式無法讀取到表單的值,或者setTimeout的回調函數執行會出現一些詭異的現象。

官方解釋

對於這種現象官方的文檔也做了解釋,官方歸咎於瀏覽器原生的處理導致了這個問題。

解決辦法

解法-1(更直接)

在異步處理時,獲取 e.target 的方式需要修改成: (e.target.shadowRoot && e.composed) ? (e.composedPath()[0] || e.target) : e.target

解法-2(更徹底)

對於自定義的組件,按照解法1可以解決,那如果我引用的第三方組件庫遇到了這個問題該怎麼處理呢?我總不能fork一份自己魔改吧。

聰明的你一定想到了,那我是不是可以劫持掉e.target,讓它指向我想要的地方。

這個方式非常徹底,但是聽起來風險很大,如果造成事故了怎麼辦?

當然讓官方被這個鍋,其實使用一個官方提供的插件就OK了

插件的鏈接在這裏。

使用方法如下:

import { startApp } from 'wujie'
import { EventTargetPlugin } from "wujie-polyfill";
// 無框架
setupApp({
   name: '唯一id',
   url: '子應用地址',
   exec: true,
   el: '容器',
   sync: true,
   plugins: [EventTargetPlugin()]
}) 

// vue 
<WujieVue
  width="100%"
  height="100%"
  name="xxx"
  :url="xxx"
  :plugins=“[EventTargetPlugin()]”
 ></WujieVue>

// react
<WujieReact
  width="100%"
  height="100%"
  name="xxx"
  url="{xxx}"
  plugins="{[EventTargetPlugin()]}"
 ></WujieReact>

如上,在主應用中使用這個官方插件就可以解決問題了。神奇的地方在於,官網的Q&A沒有直接貼上這個插件的鏈接,以至於我還是在stackoverflow上面發現的這個插件,也就有了這篇文章的撰寫。

希望能幫到你。

公眾號:webcooking

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.