元素配合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实现拨号功能

vue实现拨号功能

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

vue功能实现难点

vue功能实现难点

Vue 功能实现的常见难点 响应式系统深度监听 Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3),但对嵌套对象或数组的深层属性变化需要额外…

vue实现轨道功能

vue实现轨道功能

Vue 实现轨道功能的方法 轨道功能通常指在界面中实现元素沿特定路径移动的效果,例如进度条、时间轴或动画轨迹。以下是几种常见的实现方式: 使用 CSS 动画与 Vue 结合 通过 Vue 动态绑定样…

php秒杀功能的实现

php秒杀功能的实现

秒杀功能的核心设计 高并发场景下秒杀系统的核心在于解决超卖问题和性能瓶颈。需要结合缓存、队列、锁机制等技术实现。 数据库设计 商品表需包含库存字段,例如: CREATE TABLE `seckil…

h5能实现抽题功能吗

h5能实现抽题功能吗

H5实现抽题功能的技术方案 H5完全能够实现抽题功能,主要通过前端技术结合后端数据交互完成。以下是具体实现方式: 前端技术实现 HTML5结合JavaScript可以动态生成和展示题目,利用DOM操…

vue实现退出功能

vue实现退出功能

Vue 实现退出功能的方法 在 Vue 中实现退出功能通常涉及清除用户登录状态、跳转登录页等操作。以下是几种常见的实现方式: 清除登录状态并跳转 使用 Vue Router 进行页面跳转,同时清除本…