元素配合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);
  });

  // 上传逻辑...
};

文件预览与限制

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

react实现附件功能

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>
);

文件列表管理

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

react实现附件功能

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库可以快速实现高级上传功能:

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登录功能实现

前端vue登录功能实现

登录功能实现步骤 在Vue中实现登录功能通常需要结合后端API,以下是关键步骤和代码示例: 创建登录表单组件 <template> <div> <for…

vue实现拨号功能

vue实现拨号功能

Vue 实现拨号功能 使用 tel: 协议实现基础拨号 在 Vue 中可以通过 HTML 的 <a> 标签结合 tel: 协议实现拨号功能。这种方式适用于移动端浏览器,点击后会直接调用系统…

vue实现付费功能

vue实现付费功能

Vue 实现付费功能的方法 集成第三方支付平台 选择适合的第三方支付平台(如支付宝、微信支付、Stripe、PayPal等),并按照其文档进行集成。在 Vue 项目中,可以通过引入支付平台的 SDK…

php 实现聊天功能

php 实现聊天功能

PHP 实现聊天功能的方法 使用 WebSocket 和 Ratchet 库 WebSocket 是实现实时聊天的理想选择。Ratchet 是一个 PHP 库,用于处理 WebSocket 连接。…

vue 分页功能实现

vue 分页功能实现

分页功能实现方法 使用 Element UI 的分页组件 Element UI 提供了现成的分页组件 el-pagination,可以快速实现分页功能。 安装 Element UI: npm in…

vue实现预览功能

vue实现预览功能

Vue 实现文件预览功能 使用 FileReader 实现本地文件预览 通过 HTML5 的 FileReader API 可以读取本地文件内容并显示预览。创建一个文件上传组件,监听 change…