當我們要復寫各類 UI 組件的時候,為了保證UI組件的參數(shù)與插槽都能使用,且不用重復定義扣泊,我們可以通過
屬性透傳
與插槽透傳
來實現(xiàn)
屬性透傳 $attrs
$attrs
一個包含了組件所有透傳 attribute
的對象(不包含已定義的 props
)。
透傳 Attribute 是一些由父組件傳入的 attribute
和 事件處理器
,且沒有在此子組件中聲明為一個 prop
或要拋出的事件
赁遗。
默認情況下,若是單一根節(jié)點組件族铆,$attrs
中的所有 property
都是直接自動繼承自組件的根元素岩四。而多根節(jié)點組件則不會如此,同時你也可以通過配置 inheritAttrs
選項來顯式地關(guān)閉該行為哥攘。
實現(xiàn)屬性透傳
// 自定義的 MyButton
<el-button v-bind="$attrs"></el-button>
// 其他組件調(diào)用
<MyButton type="primary">按鈕<MyButton>
/**
* type="primary" 將會通過 v-bind="$attrs" 透傳給 el-button 組件
*/
插槽透傳 $slots
$slots
一個表示父組件所傳入插槽的對象剖煌。
通常用于手寫渲染函數(shù)材鹦,但也可用于檢測是否存在插槽。
每一個插槽都在 this.$slots
上暴露為一個函數(shù)耕姊,返回一個 vnode 數(shù)組桶唐,同時 key 名對應(yīng)著插槽名。默認插槽暴露為 this.$slots.default
茉兰。
如果插槽是一個作用域插槽尤泽,傳遞給該插槽函數(shù)的參數(shù)可以作為插槽的 prop 提供給插槽。
實現(xiàn)插槽透傳
// 自定義組件 MyButton
<el-button v-bind="$attrs">
<!-- 通過便利實現(xiàn)插槽透傳 -->
<template v-for="(item, key, index) in $slots" :key="index" v-slot:[key]>
<slot :name="key"></slot>
</template>
</el-button>
// 其他組件調(diào)用
<MyButton type="primary">
<el-icon><Back /></el-icon>
<MyButton>