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 组件的示例

  1. <custom-Image fit="fill" class="icon-img" :src="picPreview(expert)"></custom-Image>

封装 el-image 为 custom-Image 组件的示例

  1. <template> <div id="CustomImage">
  2. <el-image v-bind="$attrs" v-on="$listeners">
  3. <div slot="error" class="image-slot">
  4. <img :src="require('image-f/icon-empty-img.png')" alt="图片加载失败.png"/>
  5. </div>
  6. <div slot="placeholder" class="placeholder-slot">加载中...</div>
  7. </el-image>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. name: 'CustomImage'
  13. }
  14. </script>
  15. <style scoped lang="scss">
  16. #CustomImage {
  17. .image-slot {
  18. text-align: center;
  19. }
  20. .placeholder-slot {
  21. text-align: center;
  22. }
  23. }
  24. </style>