【vue3+ts+vant】上传图片

1.使用 van-upload 组件,进行样式和功能配置

  • 组件基础结构
  • 配置文字和图标
  • 配置最多数量和最大体积
  • 支持双向数据绑定,支持选择图片后触发函数,支持点击删除事件函数

 基础结构


        <van-uploader></van-uploader>
        <!-- 有图片在就不提示文字了 -->
        <p class="tip" v-if="!fileList.length">最多9张图,最大5MB</p>
 

修改组件样式scss

  ::v-deep() {
    .van-uploader {
      &__preview {
        &-delete {
          left: -6px;
          top: -6px;
          border-radius: 50%;
          background-color: pink;
          width: 20px;
          height: 20px;
          &-icon {
            transform: scale(0.9) translate(-22%, 22%);
          }
        }
        &-image {
          border-radius: 8px;
          overflow: hidden;
        }
      }
      &__upload {
        border-radius: 8px;
      }
      &__upload-icon {
        color: gray;
      }
    }
  }

配置双向数据绑定,支持选择图片后触发函数,支持点击删除事件函数,最多数量和最大体积,文字和图标

 <van-uploader
          :after-read="onAfterRead"
          @delete="onDeleteImg"
          v-model="fileList"
          max-count="9"
          :max-size="5 * 1024 * 1024"
          upload-icon="photo-o"
          upload-text="上传图片"
  ></van-uploader>
import type { UploaderAfterRead, UploaderFileListItem } from 'vant/lib/uploader/types'


const fileList = ref([])
const onAfterRead: UploaderAfterRead = (item) => {
  // 上传图片
}
const onDeleteImg = (item: UploaderFileListItem) => {
  // 删除图片
}

定义上传图片的接口,实现上传,实现删除

//后端约定 Body 参数(multipart/form-data) 传过去的数据是file,类型是File
//我们接收到的数据类型是<id:string,url:string>
export const uploadImage = (file: File) => {
  const fd = new FormData()
  fd.append('file', file)  //(key传过去的名字,文件)
  return request<id:string,url:string>('/upload', 'POST', fd)
}

实现上传

 

//传给后端的数据
const form = ref({
  pictures: []
})

const onAfterRead: UploaderAfterRead = (item) => {
  // item :UploaderFileListItem 选择一张图| UploaderFileListItem[] 选择多个图,我们是一个图
  //如果是数组 就结束,告诉他我们是一张图 是UploaderFileListItem,不告诉就点不出来东西
  if (Array.isArray(item)) return
 // item.file就是你选择的那张图片,因为file可能不存在,如果它不存在就不往下走了
  if (!item.file) return
  // 开始上传
  item.status = 'uploading'
  item.message = '上传中...'
  uploadImage(item.file)
    .then((res) => {
      // 上传成功
      item.status = 'done'
      item.message = undefined
     // 展示上传成功的图片 给 item 加上 url 是为了删除可以根据 url 进行删除
      item.url = res.data.url
     // 存储到form中,将来要提交
      form.value.pictures?.push(res.data)
    })
    .catch(() => {
      item.status = 'failed'
      item.message = '上传失败'
    })
}

删除

 

const onDeleteImg = (item: UploaderFileListItem) => {
  form.value.pictures = form.value.pictures?.filter((pic) => pic.url !== item.url)
}

猜你喜欢

转载自blog.csdn.net/weixin_51290060/article/details/130039066