FilesUpload.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <template>
  2. <el-upload
  3. v-model:file-list="fileList"
  4. class="upload-demo"
  5. :on-change="handleChange"
  6. :limit="limit"
  7. :auto-upload="false"
  8. :show-file-list="false"
  9. >
  10. <el-button
  11. type="primary"
  12. :loading="loading"
  13. :disabled="fileList.length >= limit"
  14. >点击上传文件</el-button
  15. >
  16. <template #tip>
  17. <div class="tip">
  18. 文件类型限制为.jpg,.jpeg,.png,word文档,pdf,大小不超过{{ size }}M
  19. </div>
  20. </template>
  21. <div>
  22. <el-tag
  23. class="file-item"
  24. v-for="(file, index) in fileList"
  25. :key="file.name"
  26. closable
  27. type="success"
  28. @close="deleteFile(index)"
  29. >
  30. {{ file.name }}
  31. </el-tag>
  32. </div>
  33. </el-upload>
  34. </template>
  35. <script lang="ts" setup>
  36. import { ref } from "vue";
  37. const props = defineProps({
  38. size: {
  39. type: Number,
  40. default: 4,
  41. },
  42. limit: {
  43. type: Number,
  44. default: 1,
  45. },
  46. src: {
  47. type: String,
  48. default: "",
  49. },
  50. srcList: {
  51. type: Array,
  52. default: [],
  53. },
  54. });
  55. const loading = ref(false);
  56. const emit = defineEmits(["update:src", "update:srcList"]);
  57. // 上传文件成功返回的值
  58. const src = useVModel(props, "src", emit); //单文件用这个
  59. const srcList = useVModel(props, "srcList", emit); //多文件用这个
  60. import { UploadFile, UploadFiles, UploadUserFile } from "element-plus";
  61. import { uploadFileApi } from "@/api/file";
  62. // el-upload 绑定的值
  63. const fileList = ref<UploadUserFile[]>([]);
  64. const handleChange = async (uploadFile: UploadFile) => {
  65. if (uploadFile.size! > props.size * 1048 * 1048) {
  66. ElMessage.warning(`上传文件不能大于${props.size}M`);
  67. return;
  68. }
  69. loading.value = true;
  70. uploadFileApi(uploadFile.raw as File)
  71. .then((res: any) => {
  72. loading.value = false;
  73. src.value = res.data.fileUrl;
  74. srcList.value.push(res.data.fileUrl);
  75. })
  76. .catch((err) => {
  77. ElMessage.error(err.message);
  78. loading.value = false;
  79. });
  80. };
  81. const deleteFile = (index: number) => {
  82. src.value = ""; //删除直接清空src即可,不用考虑是哪个,因为单文件不会有多个
  83. fileList.value.splice(index, 1);
  84. srcList.value.splice(index, 1);
  85. };
  86. </script>
  87. <style scoped lang="scss">
  88. .tip {
  89. font-size: 12px;
  90. color: #e6a23c;
  91. margin-top: 5px;
  92. }
  93. .file-item {
  94. margin-left: 10px;
  95. }
  96. </style>