元素配合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.js) 创建注册表单组件 使用Vue的单文件组件结构,包含用户名、邮箱、密码等输入框,并添加表单验证逻辑。 <template> <form…

vue实现用户添加功能

vue实现用户添加功能

实现用户添加功能的基本步骤 在Vue中实现用户添加功能通常涉及表单设计、数据绑定、验证和提交等环节。以下是具体实现方法: 表单设计与数据绑定 创建用户表单组件,使用v-model实现双向数据绑定:…

vue实现分页功能

vue实现分页功能

Vue 分页功能实现 在 Vue 中实现分页功能通常需要结合后端 API 或前端数据分页逻辑。以下是两种常见的实现方式: 前端分页实现 适用于数据量较小的情况,直接在 Vue 组件中处理分页逻辑。…

vue实现审核功能

vue实现审核功能

实现审核功能的基本思路 审核功能通常涉及状态管理、权限控制和操作记录。Vue中可以通过组件化设计、状态管理库(如Vuex或Pinia)和后端API配合实现。 审核状态管理 使用Vuex或Pinia存…

vue实现账号注册功能

vue实现账号注册功能

实现账号注册功能 在Vue中实现账号注册功能通常需要结合前端表单和后端API交互。以下是一个完整的实现方案: 创建注册表单组件 新建一个Register.vue组件,包含基本的注册表单字段:…

vue实现用户添加功能

vue实现用户添加功能

实现用户添加功能的步骤 表单设计与数据绑定 在Vue组件中设计一个表单,包含用户名、邮箱、密码等字段。使用v-model指令实现双向数据绑定,将表单输入与组件的数据属性关联起来。 <temp…