之前在做vue組件擴展的時候,遇到過一些xx的事情,比如基于element-ui的el-table
進行組件擴展,支持render/slot雙渲染模式,支持分頁等。(假設新組件是zl-table
)
實際封裝中遇到一個巨坑問題是:el-table
有那么多v-on
和v-bind
,之前的處理方案是,在zl-table
中用props和$emit轉接到el-table
上,平白增加很多工作量,而且如果el-table
擴展了,zl-table
也要擴展。當時就在想,要是能用react就好了,{...props}
短短一句全搞定。
相信跟我遇到同樣問題的朋友不少,今天重新看官方文檔,發現2.4.0新增了兩個屬性vm.$attrs
和vm.$listeners
(表白尤大)。上代碼
<!-- zl-table內 -->
<el-table v-bind="$attrs" v-on="$listeners">
<!-- ... -->
</el-table>
-
vm.$attrs
包含了父作用域中不作為 prop 被識別 (且獲取) 的 attribute 綁定 (class 和 style 除外)。當一個組件沒有聲明任何 prop 時,這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內部組件——在創建高級別的組件時非常有用。
-
vm.$listeners
包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監聽器。它可以通過 v-on="$listeners" 傳入內部組件。