元素配合React状态管理可以实现基本文件上传功能。创建一个受控组件来跟踪选中的文件: import { useSt…">
当前位置:首页 > React

react实现附件功能

2026-01-26 18:26:34React

文件上传基础实现

使用HTML的<input type="file">元素配合React状态管理可以实现基本文件上传功能。创建一个受控组件来跟踪选中的文件:

import { useState } from 'react';

function FileUpload() {
  const [selectedFile, setSelectedFile] = useState(null);

  const handleFileChange = (event) => {
    setSelectedFile(event.target.files[0]);
  };

  const handleUpload = () => {
    if (!selectedFile) return;

    const formData = new FormData();
    formData.append('file', selectedFile);

    // 替换为实际API端点
    fetch('/api/upload', {
      method: 'POST',
      body: formData
    }).then(response => {
      // 处理响应
    });
  };

  return (
    <div>
      <input type="file" onChange={handleFileChange} />
      <button onClick={handleUpload}>上传</button>
    </div>
  );
}

多文件上传支持

修改状态和事件处理器以支持多文件选择:

const [selectedFiles, setSelectedFiles] = useState([]);

const handleFileChange = (event) => {
  setSelectedFiles([...event.target.files]);
};

const handleUpload = () => {
  const formData = new FormData();
  selectedFiles.forEach(file => {
    formData.append('files', file);
  });

  // 上传逻辑...
};

文件预览与限制

添加文件类型和大小验证,实现图片预览功能:

const [preview, setPreview] = useState('');

const handleFileChange = (event) => {
  const file = event.target.files[0];
  if (!file) return;

  // 大小限制(2MB)
  if (file.size > 2 * 1024 * 1024) {
    alert('文件大小超过限制');
    return;
  }

  // 图片预览
  if (file.type.startsWith('image/')) {
    const reader = new FileReader();
    reader.onload = () => setPreview(reader.result);
    reader.readAsDataURL(file);
  }

  setSelectedFile(file);
};

进度显示与拖拽上传

使用XMLHttpRequest实现上传进度跟踪,添加拖拽区域:

const [progress, setProgress] = useState(0);

const handleDragOver = (e) => {
  e.preventDefault();
};

const handleDrop = (e) => {
  e.preventDefault();
  setSelectedFile(e.dataTransfer.files[0]);
};

const handleUpload = () => {
  const xhr = new XMLHttpRequest();
  xhr.upload.addEventListener('progress', (e) => {
    setProgress(Math.round((e.loaded / e.total) * 100));
  });

  xhr.open('POST', '/api/upload');
  xhr.send(formData);
};

return (
  <div 
    onDragOver={handleDragOver}
    onDrop={handleDrop}
    style={{ border: '2px dashed #ccc', padding: '20px' }}
  >
    {progress > 0 && <div>上传进度: {progress}%</div>}
    {/* 其他元素 */}
  </div>
);

文件列表管理

实现已上传文件的展示和管理功能:

const [fileList, setFileList] = useState([]);

const handleDelete = (fileName) => {
  setFileList(fileList.filter(file => file.name !== fileName));
};

return (
  <div>
    {fileList.map(file => (
      <div key={file.name}>
        <span>{file.name}</span>
        <button onClick={() => handleDelete(file.name)}>删除</button>
      </div>
    ))}
  </div>
);

与后端API集成

典型的上传API请求应包含认证头和错误处理:

const handleUpload = async () => {
  try {
    const response = await fetch('/api/upload', {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`
      },
      body: formData
    });

    if (!response.ok) throw new Error('上传失败');

    const data = await response.json();
    setFileList([...fileList, data.fileInfo]);
  } catch (error) {
    console.error('上传错误:', error);
  }
};

第三方库方案

使用react-dropzone库可以快速实现高级上传功能:

react实现附件功能

import { useDropzone } from 'react-dropzone';

function DropzoneUpload() {
  const { getRootProps, getInputProps, isDragActive } = useDropzone({
    accept: {
      'image/*': ['.jpeg', '.png'],
      'application/pdf': ['.pdf']
    },
    maxSize: 5 * 1024 * 1024,
    onDrop: acceptedFiles => {
      // 处理接收的文件
    }
  });

  return (
    <div {...getRootProps()}>
      <input {...getInputProps()} />
      {isDragActive ? (
        <p>拖放文件到这里</p>
      ) : (
        <p>拖放文件或点击选择</p>
      )}
    </div>
  );
}

标签: 附件功能
分享给朋友:

相关文章

vue实现app功能

vue实现app功能

Vue 实现 App 功能的常见方法 使用 Capacitor 或 Cordova 进行混合开发 Vue 结合 Capacitor 或 Cordova 可以将 Web 应用打包成原生 App。Capa…

php分页功能的实现

php分页功能的实现

分页功能的基本原理 分页功能的核心是通过SQL的LIMIT子句实现数据分段查询。LIMIT接受两个参数:起始位置偏移量和每页记录数。例如查询第2页(每页10条)的SQL语句为: SELECT * F…

vue拨号功能实现

vue拨号功能实现

Vue 拨号功能实现 基本思路 拨号功能通常包括数字键盘、号码显示区、拨号按钮等组件。通过Vue的数据绑定和事件处理机制,可以轻松实现交互逻辑。 实现步骤 1. 创建数字键盘组件 使用Vue的v-f…

vue下载功能实现

vue下载功能实现

实现 Vue 文件下载功能 在 Vue 项目中实现文件下载功能可以通过多种方式完成,以下是几种常见的方法: 使用 <a> 标签下载 通过动态创建 <a> 标签并设置 dow…

vue答题功能实现

vue答题功能实现

Vue 答题功能实现 数据结构设计 使用 Vue 的响应式数据管理题目和答案。通常需要一个数组存储题目列表,每个题目包含题干、选项、正确答案等字段。 data() { return {…

vue 实现编辑功能

vue 实现编辑功能

Vue 实现编辑功能的步骤 数据绑定与状态管理 使用v-model双向绑定表单数据,结合data或Vuex/Pinia管理编辑状态。例如: data() { return { edita…