当前位置:首页 > React

react实现预览

2026-01-26 16:09:23React

实现文件预览功能

在React中实现文件预览功能通常涉及多种文件类型(如图片、PDF、视频等)的处理。以下是几种常见文件类型的预览方法:

图片预览

使用URL.createObjectURL将上传的图片文件转换为可预览的URL:

react实现预览

const [previewUrl, setPreviewUrl] = useState('');

const handleImageChange = (e) => {
  const file = e.target.files[0];
  if (file) {
    const url = URL.createObjectURL(file);
    setPreviewUrl(url);
  }
};

return (
  <div>
    <input type="file" accept="image/*" onChange={handleImageChange} />
    {previewUrl && <img src={previewUrl} alt="Preview" style={{ maxWidth: '100%' }} />}
  </div>
);

PDF预览

使用第三方库如react-pdf实现PDF预览:

import { Document, Page } from 'react-pdf';

const [pdfUrl, setPdfUrl] = useState(null);
const [numPages, setNumPages] = useState(null);

const handlePdfChange = (e) => {
  const file = e.target.files[0];
  if (file) {
    const url = URL.createObjectURL(file);
    setPdfUrl(url);
  }
};

return (
  <div>
    <input type="file" accept=".pdf" onChange={handlePdfChange} />
    {pdfUrl && (
      <Document file={pdfUrl} onLoadSuccess={({ numPages }) => setNumPages(numPages)}>
        {Array.from(new Array(numPages), (el, index) => (
          <Page key={`page_${index + 1}`} pageNumber={index + 1} />
        ))}
      </Document>
    )}
  </div>
);

视频预览

使用HTML5的<video>标签预览视频:

react实现预览

const [videoUrl, setVideoUrl] = useState('');

const handleVideoChange = (e) => {
  const file = e.target.files[0];
  if (file) {
    const url = URL.createObjectURL(file);
    setVideoUrl(url);
  }
};

return (
  <div>
    <input type="file" accept="video/*" onChange={handleVideoChange} />
    {videoUrl && (
      <video controls width="100%" src={videoUrl} />
    )}
  </div>
);

通用文件预览

对于无法直接预览的文件类型(如.docx、.xlsx等),可以显示文件信息:

const [fileInfo, setFileInfo] = useState(null);

const handleFileChange = (e) => {
  const file = e.target.files[0];
  if (file) {
    setFileInfo({
      name: file.name,
      type: file.type,
      size: (file.size / 1024).toFixed(2) + ' KB'
    });
  }
};

return (
  <div>
    <input type="file" onChange={handleFileChange} />
    {fileInfo && (
      <div>
        <p>Name: {fileInfo.name}</p>
        <p>Type: {fileInfo.type}</p>
        <p>Size: {fileInfo.size}</p>
      </div>
    )}
  </div>
);

使用第三方预览组件

考虑使用react-file-viewer等库实现更全面的预览功能:

import FileViewer from 'react-file-viewer';

const [fileUrl, setFileUrl] = useState('');
const [fileType, setFileType] = useState('');

const handleFileChange = (e) => {
  const file = e.target.files[0];
  if (file) {
    const url = URL.createObjectURL(file);
    setFileUrl(url);
    setFileType(file.type.split('/')[1]); // 提取文件扩展名
  }
};

return (
  <div>
    <input type="file" onChange={handleFileChange} />
    {fileUrl && (
      <FileViewer
        fileType={fileType}
        filePath={fileUrl}
        onError={(e) => console.error('Error:', e)}
      />
    )}
  </div>
);

注意事项

  • 使用URL.revokeObjectURL()释放内存,可在组件卸载时调用:
    useEffect(() => {
      return () => {
        if (previewUrl) URL.revokeObjectURL(previewUrl);
      };
    }, [previewUrl]);
  • 对于大文件,考虑使用文件分片或流式处理
  • 服务端文件预览需要额外处理,通常通过返回文件URL实现

标签: react
分享给朋友:

相关文章

react native 如何

react native 如何

React Native 开发基础 React Native 是一个用于构建跨平台移动应用的框架,允许开发者使用 JavaScript 和 React 编写代码,同时生成原生 iOS 和 Androi…

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高:基于 JavaScript 和 React 语法,可同时开发 iOS 和 Android 应用,减少重复代码量。性能接近原生:通过原生组件渲染,性能…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

react 如何分页

react 如何分页

分页实现方法 在React中实现分页功能可以通过多种方式完成,具体取决于数据来源(如API或本地数据)和UI库的选择。以下是常见的实现方法: 使用本地数据分页 对于存储在组件状态或Contex…