react hook + antd upload 通过fileList控制文件列表展示status为uploading

摘要:
项目是用的reacthook写的,引入了antd的upload上传组件,页面效果如下代码importReact,{useState}from'react'import{Modal,Form,Upload,message,Button}from'antd'import{UploadOutlined}from'@ant-design/icons'import{TableListItem}from'@/

项目是用的react hook写的,引入了antd 的upload上传组件,页面效果如下

react hook + antd upload 通过fileList控制文件列表展示status为uploading第1张

代码

import React, { useState } from 'react'import { Modal, Form, Upload, message, Button } from 'antd'import { UploadOutlined } from '@ant-design/icons'import { TableListItem } from '@/services/data.d'import { importByExcelUrl } from '@/services/manually'import { validFileSize } from '@/utils/validate'
export interface FormValueType extends Partial<TableListItem>{
  time?: string;
  [propName: string]: any
}

const FormItem =Form.Item

interface CreateFormProps {
  modalVisible: boolean;
  onCancel: () => void;
  onConfirm: (values: FormValueType) => void;
  values: any
}
const formLayout ={
  labelCol: { span: 7},
  wrapperCol: { span: 13},
}

const UploadForm: React.FC<CreateFormProps> = (props) =>{
  const { modalVisible, onConfirm, onCancel } =props
  const [bussinessFileList, setFilelist] = useState<any[]>([])
  const [uploadFileList, setUploadFilelist] = useState<any[]>([])
  const [form] =Form.useForm()

  form.setFieldsValue({})

  const uploadprops ={
    name: 'file',
    action: importByExcelUrl(),
    headers: {
      authorization: 'authorization-text',
    },
    accept:
      '.csv,.xls,.xlsx, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-excel',
    data: { businessCode: props.values },
    disabled: bussinessFileList.length === 1,
    fileList: uploadFileList,
    beforeUpload(file: any) {
      //console.log(6, file, uploadFileList.length, validFileSize(file))
      if (uploadFileList.length > 0) {
        message.warning('只能上传一个文件')
        return false}
      if (file.size === 0) {
        message.error('文件不能为空')
        return false}
      returnvalidFileSize(file)
    },
    onChange(info: any) {
      let files: any[] =[...info.fileList]
      if (info.file.status === 'done') {
        if(info.file.response) {
          if (info.file.response.responseCode === '000000') {
            //files = [...info.fileList]
message.success(`${info.file.name} 文件上传成功`)
          } else{
            message.error(info.file.response.responseMsg)
          }
        } else{
          message.error(`${info.file.name} 上传失败.`)
        }
      } else if (info.file.status === 'error') {
        message.error(`${info.file.name} 上传失败.`)
      }
      files = files.filter((item : any) =>{
        return item.response?.responseCode === '000000'})
      files =JSON.parse(JSON.stringify(files))
      console.log(66666, info, files)
      setUploadFilelist(files)
      setFilelist(files)
    },
  }

  const renderContent = () =>{
    return(
      <>
        <FormItem
          name='uploads'label='上传模板'required
          rules={[{ validator: (rule, value, callback) =>{
            if (value && value.fileList &&value.fileList.length) {
              console.log(77, value)
              if (value.file.response && value.file.response.responseCode === '000000') {
                callback()
              } else if (value.file.status && value.file.status === 'uploading') {
                callback()
              } else{
                callback('文件信息有误,请删除后上传正确文件')
              }
            } else callback('请选择文件上传')
          } }]}
        >
          <Upload {...uploadprops}>
            <Button>
              <UploadOutlined /> 点击上传
            </Button>
          </Upload>
        </FormItem>
      </>
)
  }
  const handleConfirm = async() =>{
    const fieldsValue =await form.validateFields()
    //console.log(fieldsValue)
onConfirm(fieldsValue)
  }

  return(
    <Modal
      destroyOnClose
      title='上传模板'visible={modalVisible}
      onOk={() =>handleConfirm()}
      maskClosable={false}
      onCancel={() =>onCancel()}
    >
      <Form
        {...formLayout}
        form={form}
        initialValues={{}}
      >{renderContent()}
      </Form>
    </Modal>
)
}

export default UploadForm

想做到的效果是用户文件上传正确,才展示在页面上,上传错误不展示在页面上.使用了upload的fileList属性,发现文件上传状态一直是uploading

react hook + antd upload 通过fileList控制文件列表展示status为uploading第2张

在官网找了一圈答案https://github.com/ant-design/ant-design/issues/2423这个issue里有问题描述,试了里面的一些方法还是不起作用

后面发现实际问题是,fileList这个属性不能设置为空数组

react hook + antd upload 通过fileList控制文件列表展示status为uploading第3张

这里已经说得很明白了,所以说想用这个属性来控制文件,就必须保证不会为空数组,但是这个跟我的需求不符,所以后来没用这个属性,是用form的rules来提示客户删除不正确的文件重新上传

但是如果一定要实现这个功能可以自己写fileList

 <FormItem
          name='uploads'label='上传模板'required
          rules={[{ validator: (rule, value, callback) =>{
            if (value && value.fileList &&value.fileList.length) {
              console.log(77, value)
              if (value.file.response && value.file.response.responseCode === '000000') {
                callback()
              } else if (value.file.status && value.file.status === 'uploading') {
                callback()
              } else{
                callback('文件信息有误,请删除后上传正确文件')
              }
            } else callback('请选择文件上传')
          } }]}
        >
          <>
            <Upload {...uploadprops} showUploadList={false}>
              <Button>
                <UploadOutlined /> 点击上传
              </Button>
            </Upload>
            {bussinessFileList.length ? <ul>     // 大概的就是这样,具体样式自己要调整一下{bussinessFileList.map(item => <li key={item.uid}>{item.name}
              </li>)}
            </ul> : null}
          </>
        </FormItem>

这样写要注意一个问题,formtien默认值会获取内部的一个闭合标签的值,这里加了列表之后,form rules里面的value将会获取不到file上传的内容,可以换成bussinessFileList判断

免责声明:文章转载自《react hook + antd upload 通过fileList控制文件列表展示status为uploading》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇windows 10激活php栈的定义和出栈、入栈的实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多屏适应响应式布局方案,响应式、自适应布局区别 完整的思维导图

多屏适应响应式布局方案,响应式、自适应布局区别 响应式布局 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本,不需要分配子域名。可以为不同终端的用户提供更加舒适的界面和更好的用户体验,而且随着目前大屏幕移动设备的普及,用大势所趋来形容也不为过。 响应式布局能够兼容不同屏幕...

利用rtklib处理GPS以及北斗数据详解

利用rtklib开源代码处理GPS以及北斗数据详解          在GNSS领域最基础的工作是这些GNSS系统的定位工作,对于绝大多数研究者,自己着手完成这些工作是一个“鸡肋”:完全独立设计的话费时费力,运用开源代码又很难弄懂。我当初也是如此。但想到毕竟开源代码已经做了很多工作,不用实在可惜,最终毅然决定咬紧牙关弄懂rtklib。尝试用过rtklib的...

Node.js &amp;amp; Kubernetes Graceful Shutdown

k8s-graceful-shutdown:该库提供了使用 Kubernetes 实现 Graceful Shutdown(优雅退出) Node.js App 的资源。 问题描述 在 kubernetes 中运行微服务时。我们需要处理 kubernetes 发出的终止信号。这样做的正确方法是: 监听 SIGINT, SIGTERM 收到信号后,将服务...

react源码解析7.Fiber架构

react源码解析7.Fiber架构 视频课程(高效学习):进入课程 课程目录: 1.开篇介绍和面试题 2.react的设计理念 3.react源码架构 4.源码目录结构和调试 5.jsx&核心api 6.legacy和concurrent模式入口函数 7.Fiber架构 8.render阶段 9.diff算法 10.commit阶段 11.生命...

Aery的UE4 C++游戏开发之旅(5)字符&amp;amp;字符串

目录 TCHAR 字符 使用TEXT()宏包裹字符串字面量 转换字符编码 FString 字符串 FString 剖析 FString 使用 FName 字符串 FName 剖析 FName 使用 FText 字符串 FText 剖析 FText 使用 总结 参考 TCHAR 字符 C++支持两种字符集:即常见的ANSI编...

osg模型操作之位置变换节点(直接设置想要的效果)

位置变化节点:osg::PositionAttitudeTransform   由osg::PositionAttitudeTransform : osg::Transform : osg::Group : osg::Node : osg::Object : osg::Referenced 的继承关系。 常用主要成员函数:   void  setPosit...