For AI agents: the complete documentation index is available at https://ifhover.github.io/leaf-ui/v/0.6.0/llms.txt, the full documentation bundle is available at https://ifhover.github.io/leaf-ui/v/0.6.0/llms-full.txt, and this page is available as Markdown at https://ifhover.github.io/leaf-ui/v/0.6.0/components/file-list.md.
  • 简体中文
  • FileList 文件列表

    展示文件信息、上传状态,并提供预览、下载和移除操作。

    文件信息

    按文件类型展示图标,文件大小可按需提供。图片支持预览,其他文件可直接下载。

    • 项目方案.pdf
      PDF685 B
    • 季度数据.csv
      CSV
    • 夏日风景.svg
      SVG414 B
    • 交付说明.md
      MD
    basic.tsx
    import { FileList, Space } from '@ifhover/leaf-ui';
    
    import { withBase } from '@rspress/core/runtime';
    
    export function FileListBasic() {
      return (
        <Space direction="vertical" align="stretch">
          <FileList
            items={[
              {
                url: withBase('/media/sample.pdf'),
                name: '项目方案.pdf',
                size: 685,
              },
              { url: withBase('/media/quarterly-data.csv'), name: '季度数据.csv' },
              { url: withBase('/media/landscape-1.svg'), name: '夏日风景.svg', size: 414 },
              { url: withBase('/media/file-list-readme.md'), name: '交付说明.md' },
            ]}
          />
        </Space>
      );
    }
    

    缩略图列表

    使用 listType="picture" 展示图片缩略图,非图片文件保留类型图标。

    • 夏日风景.svg
      SVG414 B
    • 山间小径.svg
      SVG
    • 项目方案.pdf
      PDF685 B
    picture.tsx
    import { FileList } from '@ifhover/leaf-ui';
    
    import { withBase } from '@rspress/core/runtime';
    
    export function FileListPicture() {
      return (
        <div>
          <FileList
            listType="picture"
            items={[
              { uid: 'lake', url: withBase('/media/landscape-1.svg'), name: '夏日风景.svg', size: 414 },
              { uid: 'trail', url: withBase('/media/landscape-2.svg'), name: '山间小径.svg' },
              { uid: 'plan', url: withBase('/media/sample.pdf'), name: '项目方案.pdf', size: 685 },
            ]}
          />
        </div>
      );
    }
    

    图片卡片

    使用 listType="picture-card" 展示图片卡片,预览中可以切换同一列表中的图片。

    • 夏日风景.svg
      SVG414 B
    • 山间小径.svg
      SVG
    • 首页封面最终稿.svg
      SVG
    cards.tsx
    import { FileList } from '@ifhover/leaf-ui';
    
    import { withBase } from '@rspress/core/runtime';
    
    export function FileListCards() {
      return (
        <div>
          <FileList
            listType="picture-card"
            items={[
              { uid: 'lake', url: withBase('/media/landscape-1.svg'), name: '夏日风景.svg', size: 414 },
              { uid: 'trail', url: withBase('/media/landscape-2.svg'), name: '山间小径.svg' },
              { uid: 'cover', url: withBase('/media/landscape-3.svg'), name: '首页封面最终稿.svg' },
            ]}
          />
        </div>
      );
    }
    

    上传状态

    分别展示上传进度、完成、失败、等待和取消状态。失败说明放在对应文件下方。

    • 项目介绍.mp4
      MP412 MB
      上传中 42%
    • 交付说明.pdf
      PDF685 B
      上传完成
    • 附件包.zip
      ZIP3 MB
      上传失败

      连接中断,请重新上传。

    • 项目笔记.md
      MD
      待上传
    • 备份文件.zip
      ZIP
      已取消
    states.tsx
    import { FileList } from '@ifhover/leaf-ui';
    
    import { withBase } from '@rspress/core/runtime';
    
    export function FileListStates() {
      return (
        <div>
          <FileList
            downloadable={false}
            previewable={false}
            items={[
              {
                uid: 'uploading',
                name: '项目介绍.mp4',
                size: 12582912,
                status: 'uploading',
                percent: 42,
              },
              {
                uid: 'done',
                name: '交付说明.pdf',
                size: 685,
                status: 'done',
                url: withBase('/media/sample.pdf'),
              },
              {
                uid: 'error',
                name: '附件包.zip',
                size: 3145728,
                status: 'error',
                error: '连接中断,请重新上传。',
              },
              { uid: 'ready', name: '项目笔记.md', status: 'ready' },
              { uid: 'cancelled', name: '备份文件.zip', status: 'cancelled' },
            ]}
          />
        </div>
      );
    }
    

    仅 URL 与移除操作

    名称可从 URL 获取。通过 onRemove 更新 items;返回 Promise 时,移除按钮会等待操作结束。

    名称可以从 URL 获取,文件大小可不提供。零字节文件也会展示大小。
    • main.zip
      ZIP
    • file-list-readme.md
      MD
    • empty.txt
      TXT0 B
    advanced.tsx
    import { type FileItem, FileList, Space, Text } from '@ifhover/leaf-ui';
    
    import { withBase } from '@rspress/core/runtime';
    
    import { useState } from 'react';
    
    export function FileListActions() {
      const [items, setItems] = useState<FileItem[]>([
        { uid: 'a', url: 'https://github.com/ifhover/leaf-ui/archive/refs/heads/main.zip' },
        { uid: 'b', url: withBase('/media/file-list-readme.md') },
        { uid: 'c', url: withBase('/media/empty.txt'), size: 0 },
      ]);
      return (
        <Space direction="vertical" align="stretch">
          <Text tone="muted">名称可以从 URL 获取,文件大小可不提供。零字节文件也会展示大小。</Text>
          <FileList
            items={items}
            removable
            onRemove={(file) => setItems((current) => current.filter((item) => item.uid !== file.uid))}
          />
        </Space>
      );
    }
    

    空列表

    没有文件时展示空状态,也可以通过 emptyContent 自定义内容。

    暂无文件
    empty.tsx
    import { FileList } from '@ifhover/leaf-ui';
    
    export function FileListEmpty() {
      return (
        <div>
          <FileList items={[]} />
        </div>
      );
    }
    

    使用说明

    文件大小可不提供,不会自动请求文件元信息。图标根据 MIME 或后缀识别,缩略图加载失败时回退为类型图标。图片、视频、音频支持预览,其他文件只提供下载。媒体能否播放取决于浏览器支持的编码。跨域下载可能在新标签打开,可通过 onDownload 接入下载服务。上传交互请使用 Upload。

    类型

    import type { FileItem, FileListProps } from '@ifhover/leaf-ui';

    FileListProps API

    属性类型默认值说明
    itemsreadonly FileItem[]必填必需。展示的文件
    downloadablebooleantrue为有 URL 的文件显示下载操作
    previewablebooleantrue为有 URL 的图片、视频和音频显示预览操作
    removablebooleanfalse配合 onRemove 显示移除操作
    onPreview(file: FileItem) => void—接管媒体预览;未提供时使用内置预览
    onDownload(file: FileItem) => void—接管下载;未提供时使用文件 URL
    onRemove(file: FileItem) => void | boolean | Promise<void> | Promise<boolean>—请求移除,由调用方更新 items。等待异步操作;拒绝时在该文件行显示错误。返回 false 可拒绝移除
    renderActions(file: FileItem, actions: ReactNode) => ReactNode—定制操作区
    emptyContentReactNode暂无文件空列表内容
    disabledbooleanfalse禁用交互。
    listType'text' | 'picture' | 'picture-card''text'文件列表的展示形式。

    FileItem API

    属性类型默认值说明
    uidstring—稳定标识,建议提供
    urlstring—文件地址
    namestring—文件名称,默认取 URL 的文件名
    sizenumber—字节数,可不提供;未提供时不显示大小
    typestring—MIME 类型,未提供时根据扩展名识别
    status'ready' | 'uploading' | 'done' | 'error' | 'cancelled'—上传状态,可不提供
    percentnumber—上传进度 0–100
    errorstring—失败说明
    originFileglobalThis.File—浏览器选择的原始文件