1. v-bind=”$attrs”
v-bind=”$attrs” 的妙用是在创建更高级别的组件,在封装第三方组件时,
可以自动将在父作用域中使用的 v-bind 的属性自动绑定,
并向下传入被封装的使用了 v-bind=”$attrs” 的组件。
一段摘自 vue 官网的介绍
包含了父作用域中不作为 prop 被识别 (且获取) 的 attribute
绑定 (class 和 style 除外)。当一个组件没有声明任何 prop 时,
这里会包含所有父作用域的绑定 (class 和 style 除外),
并且可以通过 v-bind=”$attrs” 传入内部组件——在创建高级别的组件时非常有用。
例如我们封装的 custom-Image 组件,使用了 v-bind=”$attrs” 之后, 我们在 custom-Image 组件中,也拥有了 el-image 的几乎所有属性, 而且其作用效果和用法,是和我们使用 el-image 是一样的, 也就说我们可以看着 el-image 的文章去使用 custom-Image。
2. v-on=”$listeners”
v-on=”listeners” 的作用和用法与 v−bind=”listeners” 的作用和用法与 v-bind=”listeners” 的作用和用法与 v−bind=”attrs” 类似, 它可以将父作用域中的使用 v-on 的时间监听器向下传入到使用了 v-on=”listeners” 组件中,和 v−bind=”listeners” 组件中, 和 v-bind=”listeners” 组件中,和 v−bind=”attrs” 的功效类似,只不过一个属性一个是事件。还是 custom-Image 组件为例, 这时候 custom-Image 组件就拥有了 el-image 组件的几乎所有事件。而且其作用效果和用法,是和我们使用 el-image 是一样的。
包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。
它可以通过 v-on=”$listeners” 传入内部组件——在创建更高层次的组件时非常有用。
一段摘自 vue 官网的介绍
vue3 $listeners已经移除,合并入了$attrs
3. 封装 el-image 的代码示例
使用 custom-Image 组件的示例
<custom-Image fit="fill" class="icon-img" :src="picPreview(expert)"></custom-Image>
封装 el-image 为 custom-Image 组件的示例
<template> <div id="CustomImage">
<el-image v-bind="$attrs" v-on="$listeners">
<div slot="error" class="image-slot">
<img :src="require('image-f/icon-empty-img.png')" alt="图片加载失败.png"/>
</div>
<div slot="placeholder" class="placeholder-slot">加载中...</div>
</el-image>
</div>
</template>
<script>
export default {
name: 'CustomImage'
}
</script>
<style scoped lang="scss">
#CustomImage {
.image-slot {
text-align: center;
}
.placeholder-slot {
text-align: center;
}
}
</style>