每日质量NPM包拖拽文件上传_react-dropzone

本文介绍了React-dropzone,一个基于HTML5 API的React拖拽文件上传组件。内容包括如何限制文件类型、预览上传文件、自定义样式,以及如何在实际React项目中应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、react-dropzone

官方定义: Simple HTML5-compliant drag'n'drop zone for files built with React.js.

理解: 一个为react量身定制,基于H5 API:drop && drag可以实现拖拽上传文件的npm插件包

是的,以后再也不用自己苦苦地封装drop和drag了, react-dropzone使用非常简单,只需要调用一个事件.
当然这个包是针对于react的(直接作为组件使用),如果需要非组件的,直接npm官网搜索dropzone即可.

简单看一个效果图

1414709-20181001160827076-2088135026.png

二、用法

第一步当然是给项目添加插件包

//安装
npm install -D react-dropzone

//项目引入
import ReactDropzone from 'react-dropzone'

//项目使用
<ReactDroppzone
    onDrop = {xxx}
    ...
/>

我们先来全面认识一下它

基础功能: onDrop事件
function onDrop(acceptedFiles, rejectedFiles) {
  //识别成功的文件
  console.log(acceptedFiles)
  
  //识别失败的文件
  console.log(rejectedFiles)
}

默认是可以接收任何文件,即使文件类型无法识别;

做一个测试,我同时上传.jpg .doc 文件夹 .html .pdf,然后打印一下上传成功后的信息

1414709-20181001163220167-1535053026.png

我们可以看到只有文件夹类型不能识别.另外还有一些其他属性

lastModified: 最后一次修改文件的时间
lastModifiedDate: 最后一次修改文件的日期
preview: 预览,后面具体介绍一下

限制文件类型

只需要在组件里添加accept属性即可

<ReactDropZone 
    accept="pdf/*"
    onDrop = {this.handleDrop}
/>

如果我上传非pdf类文件,会输出到rejectFiles,我们打印一下

1414709-20181001164300126-991480142.png

上传文件预览
//提取file里面preview值即可
{
    fileArr.length > 0 && fileArr.map( (item, index) => (
    <div key={index} className="previewDiv">
        <h3>预览</h3>
        <img alt="Preview" src={item.preview} className="previewImg"/>
    </div>))    
}

1414709-20181001170428606-1880307954.png

样式相关属性

Default State(dropzone原始状态): className && style

Drag is Active(拖拽到盒子上但未放开): activeClassName && activeStyle

Dropped Files are Accepted(拖拽后,文件能被识别): acceptClassName && acceptStyle

Dropped Files are Rejected(拖拽后,文件不能被识别):
rejectClassName && rejectStyle

Dropzone is Disabled(功能被禁止时): disabledClassName && disabledStyle

最后一条是在disabled="true"时生效
当设置了这个属性,在DOM里可以看到变成:aria-disabled="true"
字面上意思应该是无障碍交流,当时我实际上用的时候,是自动打开这个文件.(比如拖拽了一个图片后,会自动用浏览器打开)

结合React
import React,{ Fragment } from 'react'
import './style.css'
import ReactDropZone from 'react-dropzone'

export default class DropzoneComp extends React.Component{
    constructor(props){
        super(props)

        this.state = {
            fileArr: []
        }

        this.handleDrop = this.handleDrop.bind(this);
    }

    handleDrop(acceptFile, rejectFile){
        let { fileArr } = this.state;
        
        console.log('acceptFile ======>', acceptFile)
        console.log('rejectFile ======>', rejectFile)
        if(rejectFile.length){
            alert('不支持该格式')
            return;
        }
        acceptFile.map( item => {
            fileArr.push(item)
        })

        

        this.setState({
            fileArr,
        })

    }

    render(){
        const { fileArr } = this.state;
        return(
            <div className="dropzone">
                <div className="upload initUpload">
                    <p>
                        原上传文件方式
                    </p>
                    <input type="file"/>
                </div>
                <div className="upload dropzoneUpload">
                    <p>
                        dropzone上传方式
                    </p>
                    <ReactDropZone 
                        className="dropZoneStyles"
                        activeClassName="dragStyles"
                        acceptClassName="addDropZoneStyles"
                        accept="image/*"
                        onDrop = {this.handleDrop}
                    >
                    <span>+</span>
                    </ReactDropZone>
                    { 
                        fileArr.length ? fileArr.map( (item, index) => (
                            <p >{item.name}</p>     
                        )) : <p>未选择任何文件</p>
                    }
                </div>
                {
                    fileArr.length > 0 && fileArr.map( (item, index) => (
                    <div key={index} className="previewDiv">
                        <h3>预览</h3>
                        <img alt="Preview" src={item.preview} className="previewImg"/>
                    </div>))
                }
            </div>
        )
    }
}

1414709-20181001172111177-1784233054.png

转载于:https://www.cnblogs.com/soyxiaobi/p/9735067.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值