現象
<a-layout-sider />
渲染到頁面上會變成 <section class="undefined-has-sider">
丟失了 layout
字首
問題分析
排查了原始碼,看了下 antd 的檔案結構,發現其大體上是按元件模組分類
那麼 layout
元件自然就在 layout
資料夾下了。
定位到 layout.js
下的 generator
方法,下面是該方法的原始碼截圖:
注意第 68 行到 72 行這塊程式碼,不難理解這裡做的是屬性合併,問題就出在了 _extends
這個工具方法,同樣看下該方法的原始碼:
方法不難解讀,當瀏覽器支援 Object.assign
的時候,優先使用該方法進行屬性合併。
但是, Object.assign
最大的問題“無腦”合併,即後面的物件欄位即使是 undefined
也是會覆蓋前面的屬性的。
這也是出現這個問題的關鍵。
下面的截圖是我在瀏覽器裡斷點的時候,將 68 行到 72 行程式碼分開執行的結果:
layout
被 undefined
無情的覆蓋了
後記
雖然 2.0.1 版本肯定早就不用了,官方也應該修復了這個問題,但養成從根本上查到問題的原因,還是很重要的。