需要场景
咱们可能在工作中常常会遇到这样的场景,须要基于某个UI组件库(本文以Vuetify为例,其余的也同理)封装一个可复用的组件,不仅要实现自定义性能,还心愿能沿用第三方组件自身提供的属性,事件等。
举几个具体的栗子:
- 对立给text-field增加一个clearable的动作
- 想更改text-field默认label款式,由点击悬浮变为固定地位
- 给image组件增加loading的成果
- 给table组件对立增加一些诸如挪动列,刷新,csv下载的动作
技术关键点
一、继承属性
v-bind="$attrs" 和 inheritAttrs: false
$attrs蕴含了父组件里除了props属性的 attribute 绑定,所以在子组件中应用$attrs就能够获取到父组件传递的属性。
然而默认状况下这些属性会被认作是一般的HTML attribute利用到子组件的根元素上,当初咱们像创立一个wrapper来做封装时很可能会呈现不合乎预期的状况,此时咱们就须要设置inheritAttrs: false来打消这种默认行为。
vue2.x和vue3.x中的区别
$attrs在vue2和vue3中的体现有所不同,在vue2里,$attrs不蕴含style和class,而在vue3中蕴含
二、继承事件
v-on="$listeners"
$listeners里蕴含了父组件作用域中v-on 事件监听器。咱们在子组件中能够通过v-on="$listeners"来获取父组件传入的事件
vue2.x和vue3.x中的区别
$listeners在vue3中被移除了,能够间接通过$attrs来代替
三、继承插槽
$scopedSlots 和 $slots
vuetify中提供了非常灵活的自定义插槽,所以对于插槽的继承也是十分重要滴
<template v-for="(_, scopedSlotName) in $scopedSlots" #[scopedSlotName]="slotData"> <slot :name="scopedSlotName" v-bind="slotData" /></template><template v-for="(_, slotName) in $slots" #[slotName]> <slot :name="slotName" /></template>
参考文章
- https://dev.to/onurelibol/cre...
- https://dev.to/kouts/create-w...