封装全局图片组件

100 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

 目的

封装全局图片组件,就是为了实现:当某个数据没有src属性时,能有一个默认图片

实现步骤

封装这个组件不需要从0开始,elementui里有 首先在src下components里建个文件,存放图片组件, 注册全局组件在components下index.js设置全局注册 install(Vue){ //注册全局组件 Vue.component(ImageHolder,ImageHolder) } 其他全局注册步骤,现省略

注册完后在父组件使用 并传src的值,然后子组件接收值 还有考虑下,当图片加载失败时也要给个默认的图片

第一步

一创建组件

在src/components目录下创建组件

具体目录结构如下

|-components
	|-ImageHolder
	   |-index.vue  # 组件本身
	   |-head.jpg   # 默认头像,当没有图像需要显示时,使用这张图

代码

src\components\ImageHolder\index.vue

<template>
<!-- el-image组件 :https://element.eleme.io/#/zh-CN/component/image -->
  <el-image :src="src" class="img-container">
   <!-- error插槽:设置如果出错,要显示的内容 -->
    <template #error>
      <!-- 静态资源就近维护:把head.jpg这张图放在这个组件的目录下 -->
      <img src="./head.jpg" alt="">
    </template>
  </el-image>
</template>

<script>
export default {
  // 定义如何从父组件中接收数据
  props: {
    src: {
      type: String,
      default: ''
    }
  }
}
</script>


<style scoped lang="scss">
.img-container {
  border-radius: 50%;
  ::v-deep img{
    width: 100px;
    height: 100px;
  }
}
</style>

 备注

// 样式穿透, 有三种写法:
// 1. >>>       在less中使用
// 2. /deep/    在less中使用
// 3. ::v-deep  在scss中使用
// v-slot: 简写# 具名插槽

二全局注册

在src/components/index.js中注册全局组件

// 定义全局组件PageTools
// 省略其它...
+ import ImageHolder from '@/components/ImageHolder/index.vue'
const MyPlugin = {
  install: function(Vue) {
    // 省略其它...
+   Vue.component('ImageHolder', ImageHolder)
  }
}

export default MyPlugin

在业务组价中使用

src\views\ployees\ployees.vue中,用上面定义的组件来显示员工图像

<el-table-column label="头像">
  <template slot-scope="scope">
		<image-holder :src="scope.row.staffPhoto" />
  </template>
</el-table-column>

props接收父组件传过来的值