Files
cunkebao_v3/nkebao/src/components/Upload/README.md

6.4 KiB
Raw Blame History

Upload 组件使用说明

组件概述

本项目提供了多个专门的上传组件,所有组件都支持编辑时的数据回显功能,确保在编辑模式下能够正确显示已上传的文件。

组件列表

1. MainImgUpload 主图封面上传组件

功能特点

  • 只支持上传一张图片作为主图封面
  • 上传后右上角显示删除按钮
  • 支持图片预览功能
  • 响应式设计,适配移动端
  • 16:9宽高比宽度高度自适应
  • 支持数据回显:编辑时自动显示已上传的图片

使用方法

import MainImgUpload from '@/components/Upload/MainImgUpload';

const MyComponent = () => {
  const [mainImage, setMainImage] = useState<string>('');

  return (
    <MainImgUpload
      value={mainImage}
      onChange={setMainImage}
      maxSize={5} // 最大5MB
      showPreview={true} // 显示预览按钮
      disabled={false}
    />
  );
};

编辑模式数据回显

// 编辑模式下传入已有的图片URL
const [mainImage, setMainImage] = useState<string>('https://example.com/image.jpg');

<MainImgUpload
  value={mainImage} // 会自动显示已上传的图片
  onChange={setMainImage}
/>

2. ImageUpload 多图上传组件

功能特点

  • 支持多张图片上传
  • 可设置最大上传数量
  • 支持图片预览和删除
  • 支持数据回显:编辑时自动显示已上传的图片数组

使用方法

import ImageUpload from '@/components/Upload/ImageUpload/ImageUpload';

const MyComponent = () => {
  const [images, setImages] = useState<string[]>([]);

  return (
    <ImageUpload
      value={images}
      onChange={setImages}
      count={9} // 最大9张
      accept="image/*"
    />
  );
};

编辑模式数据回显

// 编辑模式下传入已有的图片URL数组
const [images, setImages] = useState<string[]>([
  'https://example.com/image1.jpg',
  'https://example.com/image2.jpg'
]);

<ImageUpload
  value={images} // 会自动显示已上传的图片
  onChange={setImages}
/>

3. VideoUpload 视频上传组件

功能特点

  • 支持视频文件上传
  • 支持单个或多个视频
  • 视频预览功能
  • 文件大小验证
  • 支持数据回显:编辑时自动显示已上传的视频

使用方法

import VideoUpload from '@/components/Upload/VideoUpload';

const MyComponent = () => {
  const [videoUrl, setVideoUrl] = useState<string>('');

  return (
    <VideoUpload
      value={videoUrl}
      onChange={setVideoUrl}
      maxSize={50} // 最大50MB
      showPreview={true}
    />
  );
};

编辑模式数据回显

// 编辑模式下传入已有的视频URL
const [videoUrl, setVideoUrl] = useState<string>('https://example.com/video.mp4');

<VideoUpload
  value={videoUrl} // 会自动显示已上传的视频
  onChange={setVideoUrl}
/>

4. FileUpload 文件上传组件

功能特点

  • 支持Excel、Word、PPT等文档文件
  • 可配置接受的文件类型
  • 文件预览和下载
  • 支持数据回显:编辑时自动显示已上传的文件

使用方法

import FileUpload from '@/components/Upload/FileUpload';

const MyComponent = () => {
  const [fileUrl, setFileUrl] = useState<string>('');

  return (
    <FileUpload
      value={fileUrl}
      onChange={setFileUrl}
      maxSize={10} // 最大10MB
      acceptTypes={['excel', 'word', 'ppt']}
    />
  );
};

编辑模式数据回显

// 编辑模式下传入已有的文件URL
const [fileUrl, setFileUrl] = useState<string>('https://example.com/document.xlsx');

<FileUpload
  value={fileUrl} // 会自动显示已上传的文件
  onChange={setFileUrl}
/>

5. AvatarUpload 头像上传组件

功能特点

  • 专门的头像上传组件
  • 圆形头像显示
  • 支持删除和重新上传
  • 支持数据回显:编辑时自动显示已上传的头像

使用方法

import AvatarUpload from '@/components/Upload/AvatarUpload';

const MyComponent = () => {
  const [avatarUrl, setAvatarUrl] = useState<string>('');

  return (
    <AvatarUpload
      value={avatarUrl}
      onChange={setAvatarUrl}
      size={100} // 头像尺寸
    />
  );
};

编辑模式数据回显

// 编辑模式下传入已有的头像URL
const [avatarUrl, setAvatarUrl] = useState<string>('https://example.com/avatar.jpg');

<AvatarUpload
  value={avatarUrl} // 会自动显示已上传的头像
  onChange={setAvatarUrl}
/>

数据回显机制

工作原理

所有Upload组件都通过以下机制实现数据回显

  1. useEffect监听value变化当传入的value发生变化时自动更新内部状态
  2. 文件列表同步将URL转换为文件列表格式显示已上传的文件
  3. 状态管理:维护上传状态、文件列表等内部状态
  4. UI更新:根据文件列表自动更新界面显示

使用场景

  • 新增模式value为空或未定义显示上传按钮
  • 编辑模式value包含已上传文件的URL自动显示文件
  • 混合模式:支持部分文件已上传,部分文件待上传

注意事项

  1. URL格式确保传入的URL是有效的文件访问地址
  2. 权限验证确保文件URL在编辑时仍然可访问
  3. 状态同步value和onChange需要正确配合使用
  4. 错误处理组件会自动处理无效URL的显示

技术实现

核心特性

  • 基于 antd Upload 组件
  • 使用 antd-mobile 的 Toast 提示
  • 支持 FormData 上传
  • 自动处理文件验证和错误提示
  • 集成项目统一的API请求封装
  • 完整的数据回显支持

文件结构

src/components/Upload/
├── MainImgUpload/          # 主图上传组件
├── ImageUpload/            # 多图上传组件
├── VideoUpload/            # 视频上传组件
├── FileUpload/             # 文件上传组件
├── AvatarUpload/           # 头像上传组件
└── README.md               # 使用说明文档

统一的数据回显模式

所有组件都遵循相同的数据回显模式:

// 1. 接收value属性
interface Props {
  value?: string | string[];
  onChange?: (url: string | string[]) => void;
}

// 2. 使用useEffect监听value变化
useEffect(() => {
  if (value) {
    // 将URL转换为文件列表格式
    const files = convertUrlToFileList(value);
    setFileList(files);
  } else {
    setFileList([]);
  }
}, [value]);

// 3. 在UI中显示文件列表
// 4. 支持编辑、删除、预览等操作