Skip to content

ImageUpload 图片上传

介绍

图片上传组件,支持多选、预览、删除,以及上传状态展示。适用于表单中的图片上传场景。

引入

typescript
import { TnImageUpload, TnUploadFile } from "@tuniao/tn-ui";

TnUploadFile 类说明

TnUploadFile 是一个 @ObservedV2 类,包含以下属性:

属性说明类型
url图片地址string
status上传状态"ready" | "uploading" | "success" | "error"
progress上传进度(0-100)number
message提示信息string

代码演示

基础用法

通过 fileList 属性传入文件列表,配合 onChoose 事件处理文件选择。

基础用法

点我查看代码
typescript
@Local fileList: TnUploadFile[] = [];

TnImageUpload({
  fileList: this.fileList,
  onChoose: (files: TnUploadFile[]) => {
    this.fileList = [...this.fileList, ...files];
  },
  onDelete: (file: TnUploadFile, index: number) => {
    this.fileList = this.fileList.filter(
      (item: TnUploadFile, i: number) => i !== index
    );
  },
})

限制数量

通过 maxCount 属性限制最大上传数量,达到上限后上传区域自动隐藏。

限制数量

点我查看代码
typescript
@Local fileList: TnUploadFile[] = [];

TnImageUpload({
  fileList: this.fileList,
  maxCount: 3,
  onChoose: (files: TnUploadFile[]) => {
    this.fileList = [...this.fileList, ...files];
  },
  onDelete: (file: TnUploadFile, index: number) => {
    this.fileList = this.fileList.filter(
      (item: TnUploadFile, i: number) => i !== index
    );
  },
})

多列布局

通过 columns 属性设置每行显示的列数。

点我查看代码
typescript
@Local fileList: TnUploadFile[] = [];

TnImageUpload({
  fileList: this.fileList,
  columns: 4,
  onChoose: (files: TnUploadFile[]) => {
    this.fileList = [...this.fileList, ...files];
  },
  onDelete: (file: TnUploadFile, index: number) => {
    this.fileList = this.fileList.filter(
      (item: TnUploadFile, i: number) => i !== index
    );
  },
})

自定义上传区域

通过 uploadIconuploadText 属性自定义上传区域的图标和文案。

自定义上传区域

点我查看代码
typescript
@Local fileList: TnUploadFile[] = [];

TnImageUpload({
  fileList: this.fileList,
  uploadIcon: "camera",
  uploadText: "拍照上传",
  onChoose: (files: TnUploadFile[]) => {
    this.fileList = [...this.fileList, ...files];
  },
  onDelete: (file: TnUploadFile, index: number) => {
    this.fileList = this.fileList.filter(
      (item: TnUploadFile, i: number) => i !== index
    );
  },
})

禁用状态

通过 disabled 属性禁用上传组件,禁用后不可选择和删除图片。

禁用状态

点我查看代码
typescript
@Local fileList: TnUploadFile[] = [
  { url: "https://example.com/image1.jpg", status: "success", progress: 100, message: "" } as TnUploadFile,
];

TnImageUpload({
  fileList: this.fileList,
  disabled: true,
})

模拟上传

通过模拟上传过程,展示上传进度动画和上传状态。

模拟上传

点我查看代码
typescript
@Local uploadDemoFileList: TnUploadFile[] = [];

TnImageUpload({
  fileList: this.uploadDemoFileList,
  onChoose: (files: TnUploadFile[]) => {
    this.addFilesWithUpload(files);
  },
  onDelete: (file: TnUploadFile, index: number) => {
    this.deleteUploadDemoFile(index);
  }
});
/**
 * 添加文件并模拟上传过程
 * @param files 待添加的文件数组
 */
addFilesWithUpload(files: TnUploadFile[]): void {
  const uploadingFiles: TnUploadFile[] = files.map((f: TnUploadFile): TnUploadFile => {
    return new TnUploadFile(f.url, "uploading");
  });
  this.uploadDemoFileList = [...this.uploadDemoFileList, ...uploadingFiles];
  for (let i: number = 0; i < uploadingFiles.length; i++) {
    this.simulateUpload(uploadingFiles[i]);
  }
}
/**
 * 删除模拟上传列表中的指定文件
 * @param index 待删除文件的索引
 */
deleteUploadDemoFile(index: number): void {
  this.uploadDemoFileList = this.uploadDemoFileList.filter((_item: TnUploadFile, i: number) => i !== index);
}

/**
 * 模拟单个文件的上传过程
 * 直接修改 TnUploadFile 的 @Trace 属性,仅触发进度文字的局部刷新
 * @param file 文件对象引用
 */
private simulateUpload(file: TnUploadFile): void {
  const timerId: number = setInterval(() => {
    if (file.status !== "uploading") {
      clearInterval(timerId);
      return;
    }
    const newProgress: number = file.progress + UPLOAD_STEP;
    if (newProgress >= 100) {
      clearInterval(timerId);
      const isFail: boolean = Math.random() < FAIL_THRESHOLD;
      file.progress = 100;
      file.status = isFail ? "error" : "success";
      file.message = isFail ? "上传失败" : "";
    } else {
      file.progress = newProgress;
    }
  }, UPLOAD_INTERVAL);
}

API

Props

参数说明类型默认值
fileList文件列表TnUploadFile[]-
maxCount最大上传数量number9
multiple是否支持多选booleanfalse
disabled是否禁用booleanfalse
deletable是否可删除booleantrue
previewImage是否支持预览booleantrue
columns每行列数number3
uploadIcon上传区域图标string"add-circle"
uploadText上传区域文案string""

Events

事件名说明回调参数
onChoose选择文件后触发(files: TnUploadFile[]) => void
onDelete删除文件时触发(file: TnUploadFile, index: number) => void
onPreview预览图片时触发(file: TnUploadFile, index: number) => void
onOversize文件超出大小限制时触发(files: TnUploadFile[]) => void