之前在做vue組件擴(kuò)展的時(shí)候,遇到過(guò)一些xx的事情高诺,比如基于element-ui的el-table
進(jìn)行組件擴(kuò)展碌识,支持render/slot雙渲染模式,支持分頁(yè)等虱而。(假設(shè)新組件是zl-table
)
實(shí)際封裝中遇到一個(gè)巨坑問(wèn)題是:el-table
有那么多v-on
和v-bind
丸冕,之前的處理方案是,在zl-table
中用props和$emit轉(zhuǎn)接到el-table
上薛窥,平白增加很多工作量胖烛,而且如果el-table
擴(kuò)展了,zl-table
也要擴(kuò)展诅迷。當(dāng)時(shí)就在想佩番,要是能用react就好了,{...props}
短短一句全搞定罢杉。
相信跟我遇到同樣問(wèn)題的朋友不少趟畏,今天重新看官方文檔,發(fā)現(xiàn)2.4.0新增了兩個(gè)屬性vm.$attrs
和vm.$listeners
(表白尤大)滩租。上代碼
<!-- zl-table內(nèi) -->
<el-table v-bind="$attrs" v-on="$listeners">
<!-- ... -->
</el-table>
-
vm.$attrs
包含了父作用域中不作為 prop 被識(shí)別 (且獲取) 的 attribute 綁定 (class 和 style 除外)赋秀。當(dāng)一個(gè)組件沒(méi)有聲明任何 prop 時(shí)利朵,這里會(huì)包含所有父作用域的綁定 (class 和 style 除外),并且可以通過(guò) v-bind="$attrs" 傳入內(nèi)部組件——在創(chuàng)建高級(jí)別的組件時(shí)非常有用猎莲。
-
vm.$listeners
包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽(tīng)器绍弟。它可以通過(guò) v-on="$listeners" 傳入內(nèi)部組件。