upload组件二次封装及回显功能的实现

需求:app.vue给上传组件一个图片地址,该组件能回显出来

  • 1:先通过父子传值将图片地址传过去
    在子组件标签定义一个属性 value=值
    子组件通过props接收 props:[“value”]
    子组件接收图片路径后,将上传组件的img标签上的imageUrl换成相应的props传参value
  • 2:修复上传功能(上传成功后,图片路径没有使用上)
    通过父组件修改value的值
    1:在子组件标签绑定一个方法 @input="父组件方法"
    2:在子组件内触发父组件方法,并传递图片路径
    在图片上传成功后.触发父组件方法并传递图片路径
    this.$emit(‘input’,res.data.url)
    3:父组件接收参数,将该值传给value对应的值
  • 3:使用v-model简写父组件的写法
el-upload属性介绍
  • el-upload
    • action:上传接口地址
    • name:上传文件对应的参数名
    • show-file-list:是否显示文件列表
    • :before-upload:上传前的处理
      • function(file){
        • file.type:文件类型
        • file.size:文件大小(字节)
        • return boolean值 true:正常上传 false:中止上传
          }
          :on-success:“上传后处理”
          function(res,file){
          res:接口返回值
          file: file.response:接口返回值
          file.raw:上传的文件对象 type size
          }

实现

  • upload.vue
<template>
  <el-upload
    class="avatar-uploader"
    :action="baseUrl+'/question/upload'"
    name="file"
    :show-file-list="false"
    :on-success="handleAvatarSuccess"
    :before-upload="beforeAvatarUpload"
  >
    <img v-if="value" :src="baseUrl + '/' + value" class="avatar" />
    <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  </el-upload>
</template>

<script>
export default {
  props: ['value'],
  data () {
    return {
      imageUrl: '',
      baseUrl: process.env.VUE_APP_URL
    }
  },
  methods: {
    handleAvatarSuccess (res) {
      // window.console.log(res)
      // window.console.log(file.raw)
      // this.imageUrl = URL.createObjectURL(file.raw)
      this.$emit('input', res.data.url)
    },
    beforeAvatarUpload (file) {
      const isJPG = file.type === 'image/jpeg' || file.type === 'image/png'
      const isLt2M = file.size / 1024 / 1024 < 2

      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG,PNG 格式!')
      }
      if (!isLt2M) {
        this.$message.error('上传头像图片大小不能超过 2MB!')
      }
      return isJPG && isLt2M
    }
  }
}
</script>

<style>
.avatar-uploader .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.avatar-uploader .el-upload:hover {
  border-color: #409eff;
}
.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  line-height: 178px;
  text-align: center;
}
.avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>

  • App.vue
<template>
  <div id="app">
    <upload :value="imageUrl" @input="inputEvent"></upload>
  </div>
</template>

<script>
import upload from '@/components/upload'
export default {
  name: 'App',
  components: {
    upload
  },
  data () {
    return {
      imageUrl: 'upload/20201127/a5892332dc3cd91b39f8b57d61411dcc.jpeg'
    }
  },
  methods: {
    inputEvent(msg){
      this.imageUrl = msg
    }
  },
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

  • 使用v-model简写父组件的写法
  • App.vue
<template>
  <div id="app">
    <!-- <upload :value="imageUrl" @input="inputEvent"></upload> -->
    <upload v-model="imageUrl"></upload>
    <upload v-model="imageUrl1"></upload>
  </div>
</template>

<script>
import upload from '@/components/upload'
export default {
  name: 'App',
  components: {
    upload
  },
  data () {
    return {
      imageUrl: 'upload/20201127/a5892332dc3cd91b39f8b57d61411dcc.jpeg',
      imageUrl1: 'upload/20201127/a5892332dc3cd91b39f8b57d61411dcc.jpeg'
    }
  },
  methods: {
    // inputEvent(msg){
    //   this.imageUrl = msg
    // }
  },
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

  • 效果:
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现二次封装el-upload回显多个图片,你可以按照以下步骤进行: 1. 在el-upload组件的基础上封装一个新组件,并命名为MultiUpload。 2. 在MultiUpload组件中,添加一个data属性,用于存储已上传的图片路径数组。 3. 在el-upload组件中,添加一个success事件处理函数。在该函数中,将上传成功的图片路径添加到data属性中保存。 4. 在MultiUpload组件中,添加一个template模板。该模板中,可以使用v-for指令遍历data属性中的图片路径数组,并将每个图片路径渲染到页面上。 下面是一个简单的MultiUpload组件示例代码: ``` <template> <el-upload action="/upload" :on-success="handleSuccess" multiple :show-file-list="false"> <el-button type="primary">点击上传</el-button> </el-upload> <div v-for="url in imageUrlList" :key="url"> <img :src="url" alt="uploaded image" style="max-width: 100%;"> </div> </template> <script> export default { data() { return { imageUrlList: [] } }, methods: { handleSuccess(response, file, fileList) { this.imageUrlList.push(response.url) } } } </script> ``` 在这个示例代码中,MultiUpload组件使用了element-ui中的el-upload组件,并通过v-for指令遍历了imageUrlList数组中的图片路径,并将每个图片路径渲染到页面上。在handleSuccess方法中,将上传成功的图片路径添加到imageUrlList数组中保存。 使用这个二次封装的MultiUpload组件,只需要像使用el-upload组件一样使用即可。例如: ``` <multi-upload></multi-upload> ``` 这里没有传递任何属性或事件处理函数,因为MultiUpload组件中已经处理了所有必要的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值