From 251d2411f235e23209d57173857e05b637729ce8 Mon Sep 17 00:00:00 2001
From: LiuHao <liuhaoai545@gmail.com>
Date: 星期日, 02 四月 2023 01:01:56 +0800
Subject: [PATCH] refactor ts

---
 src/components/FileUpload/index.vue |  155 +++++++++++++++++++++++++++------------------------
 1 files changed, 82 insertions(+), 73 deletions(-)

diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
index a5c2734..cc24f36 100644
--- a/src/components/FileUpload/index.vue
+++ b/src/components/FileUpload/index.vue
@@ -1,46 +1,8 @@
-<template>
-  <div class="upload-file">
-    <el-upload
-      multiple
-      :action="uploadFileUrl"
-      :before-upload="handleBeforeUpload"
-      :file-list="fileList"
-      :limit="limit"
-      :on-error="handleUploadError"
-      :on-exceed="handleExceed"
-      :on-success="handleUploadSuccess"
-      :show-file-list="false"
-      :headers="headers"
-      class="upload-file-uploader"
-      ref="fileUpload"
-    >
-      <!-- 涓婁紶鎸夐挳 -->
-      <el-button type="primary">閫夊彇鏂囦欢</el-button>
-    </el-upload>
-    <!-- 涓婁紶鎻愮ず -->
-    <div class="el-upload__tip" v-if="showTip">
-      璇蜂笂浼�
-      <template v-if="fileSize"> 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
-      <template v-if="fileType"> 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
-      鐨勬枃浠�
-    </div>
-    <!-- 鏂囦欢鍒楄〃 -->
-    <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
-      <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
-        <el-link :href="`${file.url}`" :underline="false" target="_blank">
-          <span class="el-icon-document"> {{ getFileName(file.name) }} </span>
-        </el-link>
-        <div class="ele-upload-list__item-content-action">
-          <el-link :underline="false" @click="handleDelete(index)" type="danger">鍒犻櫎</el-link>
-        </div>
-      </li>
-    </transition-group>
-  </div>
-</template>
-
-<script setup>
+<script setup lang="ts">
 import { getToken } from "@/utils/auth";
 import { listByIds, delOss } from "@/api/system/oss";
+import { ComponentInternalInstance } from "vue";
+import { ElUpload, UploadFile } from "element-plus";
 
 const props = defineProps({
   modelValue: [String, Object, Array],
@@ -66,32 +28,35 @@
   }
 });
 
-const { proxy } = getCurrentInstance();
-const emit = defineEmits();
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const emit = defineEmits(['update:modelValue']);
 const number = ref(0);
-const uploadList = ref([]);
+const uploadList = ref<any[]>([]);
+
 const baseUrl = import.meta.env.VITE_APP_BASE_API;
 const uploadFileUrl = ref(baseUrl + "/system/oss/upload"); // 涓婁紶鏂囦欢鏈嶅姟鍣ㄥ湴鍧�
 const headers = ref({ Authorization: "Bearer " + getToken() });
-const fileList = ref([]);
+
+const fileList = ref<any[]>([]);
 const showTip = computed(
   () => props.isShowTip && (props.fileType || props.fileSize)
 );
+
+const fileUploadRef = ref(ElUpload);
 
 watch(() => props.modelValue, async val => {
   if (val) {
     let temp = 1;
     // 棣栧厛灏嗗�艰浆涓烘暟缁�
-    let list;
+    let list = [];
     if (Array.isArray(val)) {
       list = val;
     } else {
-      await listByIds(val).then(res => {
-        list = res.data.map(oss => {
-          oss = { name: oss.originalName, url: oss.url, ossId: oss.ossId };
-          return oss;
+      const res =  await listByIds(val as string)
+      list = res.data.map((oss) => {
+          const data = { name: oss.originalName, url: oss.url, ossId: oss.ossId };
+          return data;
         });
-      })
     }
     // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁�
     fileList.value = list.map(item => {
@@ -106,14 +71,14 @@
 },{ deep: true, immediate: true });
 
 // 涓婁紶鍓嶆牎妫�鏍煎紡鍜屽ぇ灏�
-function handleBeforeUpload(file) {
+const handleBeforeUpload = (file: any) => {
   // 鏍℃鏂囦欢绫诲瀷
   if (props.fileType.length) {
     const fileName = file.name.split('.');
     const fileExt = fileName[fileName.length - 1];
     const isTypeOk = props.fileType.indexOf(fileExt) >= 0;
     if (!isTypeOk) {
-      proxy.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${props.fileType.join("/")}鏍煎紡鏂囦欢!`);
+      proxy?.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${props.fileType.join("/")}鏍煎紡鏂囦欢!`);
       return false;
     }
   }
@@ -121,41 +86,41 @@
   if (props.fileSize) {
     const isLt = file.size / 1024 / 1024 < props.fileSize;
     if (!isLt) {
-      proxy.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`);
+      proxy?.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`);
       return false;
     }
   }
-  proxy.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
+  proxy?.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��...");
   number.value++;
   return true;
 }
 
 // 鏂囦欢涓暟瓒呭嚭
-function handleExceed() {
-  proxy.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`);
+const handleExceed = () => {
+  proxy?.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`);
 }
 
 // 涓婁紶澶辫触
-function handleUploadError(err) {
-  proxy.$modal.msgError("涓婁紶鏂囦欢澶辫触");
+const handleUploadError = () => {
+  proxy?.$modal.msgError("涓婁紶鏂囦欢澶辫触");
 }
 
 // 涓婁紶鎴愬姛鍥炶皟
-function handleUploadSuccess(res, file) {
+const handleUploadSuccess = (res:any, file: UploadFile) => {
   if (res.code === 200) {
     uploadList.value.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId });
     uploadedSuccessfully();
   } else {
     number.value--;
-    proxy.$modal.closeLoading();
-    proxy.$modal.msgError(res.msg);
-    proxy.$refs.fileUpload.handleRemove(file);
+    proxy?.$modal.closeLoading();
+    proxy?.$modal.msgError(res.msg);
+    fileUploadRef.value.handleRemove(file);
     uploadedSuccessfully();
   }
 }
 
 // 鍒犻櫎鏂囦欢
-function handleDelete(index) {
+const handleDelete = (index: number) => {
   let ossId = fileList.value[index].ossId;
   delOss(ossId);
   fileList.value.splice(index, 1);
@@ -163,18 +128,18 @@
 }
 
 // 涓婁紶缁撴潫澶勭悊
-function uploadedSuccessfully() {
+const uploadedSuccessfully =() => {
   if (number.value > 0 && uploadList.value.length === number.value) {
     fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value);
     uploadList.value = [];
     number.value = 0;
     emit("update:modelValue", listToString(fileList.value));
-    proxy.$modal.closeLoading();
+    proxy?.$modal.closeLoading();
   }
 }
 
 // 鑾峰彇鏂囦欢鍚嶇О
-function getFileName(name) {
+const getFileName = (name: string) => {
   // 濡傛灉鏄痷rl閭d箞鍙栨渶鍚庣殑鍚嶅瓧 濡傛灉涓嶆槸鐩存帴杩斿洖
   if (name.lastIndexOf("/") > -1) {
     return name.slice(name.lastIndexOf("/") + 1);
@@ -184,18 +149,62 @@
 }
 
 // 瀵硅薄杞垚鎸囧畾瀛楃涓插垎闅�
-function listToString(list, separator) {
+const listToString = (list: any[], separator?: string) => {
   let strs = "";
   separator = separator || ",";
-  for (let i in list) {
-    if(list[i].ossId) {
-      strs += list[i].ossId + separator;
+  list.forEach(item => {
+    if (item.ossId) {
+      strs += item.ossId + separator;
     }
-  }
-  return strs != "" ? strs.substr(0, strs.length - 1) : "";
+  })
+  return strs != "" ? strs.substring(0, strs.length - 1) : "";
 }
 </script>
 
+<template>
+	<div class="upload-file">
+		<el-upload
+			multiple
+			:action="uploadFileUrl"
+			:before-upload="handleBeforeUpload"
+			:file-list="fileList"
+			:limit="limit"
+			:on-error="handleUploadError"
+			:on-exceed="handleExceed"
+			:on-success="handleUploadSuccess"
+			:show-file-list="false"
+			:headers="headers"
+			class="upload-file-uploader"
+			ref="fileUploadRef"
+		>
+			<!-- 涓婁紶鎸夐挳 -->
+			<el-button type="primary">閫夊彇鏂囦欢</el-button>
+		</el-upload>
+		<!-- 涓婁紶鎻愮ず -->
+		<div class="el-upload__tip" v-if="showTip">
+			璇蜂笂浼�
+			<template v-if="fileSize">
+				澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b>
+			</template>
+			<template v-if="fileType">
+				鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
+			</template>
+			鐨勬枃浠�
+		</div>
+		<!-- 鏂囦欢鍒楄〃 -->
+		<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
+			<li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
+				<el-link :href="`${file.url}`" :underline="false" target="_blank">
+					<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
+				</el-link>
+				<div class="ele-upload-list__item-content-action">
+					<el-link :underline="false" @click="handleDelete(index)" type="danger">鍒犻櫎</el-link>
+				</div>
+			</li>
+		</transition-group>
+	</div>
+</template>
+
 <style scoped lang="scss">
 .upload-file-uploader {
   margin-bottom: 5px;

--
Gitblit v1.9.3