antd中使用Form控件和Upload控件对图片上传并进行验证

在进行form提交时需要对Upload控件进行校验,若没有上传图片则进行校验,提示:请上传图片;否则,不进行校验。
使用Form控件绑定Upload上传控件,使用form的api:getFieldDecorator进行数据的双向绑定,并使用rules规则校验。

Upload控件详解

import React, { PureComponent } from 'react';
import { Row, Col, Form, Upload, Modal } from 'antd';
import { connect } from 'dva';
import { local } from '@/utils/utils';
const token = local.fetch('token');
const FormItem = Form.Item;

@connect(state => {
  return {
    list: state.list
  };
})
@Form.create()
export default class Contract extends PureComponent {
	state = {
	    previewVisible: false,
	    fileList: [],
	    previewImage: ''
	};
	handlePreviewImg = file => {
		this.setState({
			previewImage: file.url || file.thumbUrl,
			previewVisible: true,
		});
	};
	handleCancelImg = () => {
		this.setState({ previewVisible: false });
	}
	render() {
		const {
			visible,
			form: { getFieldDecorator, setFieldsValue }
		} = this.props;
		const {
			previewImage,
			fileList,
			previewVisible
		} = this.state;

		const propsUploadType = {
			name: 'files',                //发到后台的文件参数名
			action: '/oraflfile/upload',  //上传的地址
			accept: '.png,.jpg,.jpeg',	  //接受上传的文件类型
			method: 'post',               //上传请求的 http method,默认post
			listType: 'picture-card',     //上传列表的内建样式
			headers: {                    //设置上传的请求头部,IE10 以上有效
				Authorization: `Bearer ${token}`,
			},
			data: {},          //上传所需额外参数或返回上传额外参数的方法
			onChange(info){    //上传文件改变时的状态
				const { 
					file,     //当前操作的文件对象。
				 	fileList, //当前的文件列表
				 	even      //上传中的服务端响应内容,包含了上传进度等信息,高级浏览器支持
				 } = info;
				this.setState({ fileList }, () => {
					this.setState({ fileList: [...this.state.fileList] });
				});
				if (file.status === 'done') {
					message.success(`${file.name}文件上传成功`);
					setFieldsValue({ 'uploadImage': file.name });  //设置上传一张图片后就不进行校验
				}
				if (file.status === 'error') {
					message.error(`${file.name}文件上传失败`);
				}
			}
		};
		const uploadButton = (
			<div>
				<Icon type='plus' />
				<div>上传</div>
			</div>
		);
		return (
			<Form hideRequiredMark labelAlign='right'>
				<Row gutter={{ md: 4, lg: 12, xl: 24 }}>
					<Col md={24} sm={24}>
						<FormItem label={'上传图片'}>
							{getFieldDecorator('uploadImage', {
								rules: [
									{
										required: true,
										message: '请上传图片'
									}
								]
							})(
								<>
									<Upload
										{...propsUploadType}
										fileList={fileList}                //已经上传的文件列表(受控)
										onPreview={this.handlePreviewImg}  //点击文件链接或预览图标时的回调
									>
										{fileList.length > 2 ? null : uploadButton}
									</Upload>
									<Modal
										visible={previewVisible}
										footer={null}
										onCancel={this.handleCancelImg}
									>
										<img alt='example' style={{ width: '100%' }} src={previewImage} />
									</Modal>
								</>
							)}
						</FormItem>
					</Col>
				</Row>
			</Form>
		)
	}
}
Ant Design是一个非常流行的UI框架,其提供了许多非常方便的组件来构建UI界面。其包括FormUpload组件,下面是它们的使用方法。 ## Form Form组件用于创建表单,可以非常方便地实现表单的数据绑定、验证和提交等功能。 ```javascript import { Form, Input, Button } from 'antd'; const layout = { labelCol: { span: 8 }, wrapperCol: { span: 16 }, }; const tailLayout = { wrapperCol: { offset: 8, span: 16 }, }; const Demo = () => { const onFinish = (values) => { console.log('Success:', values); }; const onFinishFailed = (errorInfo) => { console.log('Failed:', errorInfo); }; return ( <Form {...layout} name="basic" initialValues={{ remember: true }} onFinish={onFinish} onFinishFailed={onFinishFailed} > <Form.Item label="Username" name="username" rules={[{ required: true, message: 'Please input your username!' }]} > <Input /> </Form.Item> <Form.Item label="Password" name="password" rules={[{ required: true, message: 'Please input your password!' }]} > <Input.Password /> </Form.Item> <Form.Item {...tailLayout}> <Button type="primary" htmlType="submit"> Submit </Button> </Form.Item> </Form> ); }; ``` ## Upload Upload组件用于实现文件上传功能。它支持单文件上传、多文件上传、拖拽上传等功能。 ```javascript import { Upload, message } from 'antd'; import { InboxOutlined } from '@ant-design/icons'; const { Dragger } = Upload; const Demo = () => { const props = { name: 'file', multiple: true, action: 'https://www.mocky.io/v2/5cc8019d300000980a055e76', onChange(info) { const { status } = info.file; if (status !== 'uploading') { console.log(info.file, info.fileList); } if (status === 'done') { message.success(`${info.file.name} file uploaded successfully.`); } else if (status === 'error') { message.error(`${info.file.name} file upload failed.`); } }, }; return ( <div> <Dragger {...props}> <p className="ant-upload-drag-icon"> <InboxOutlined /> </p> <p className="ant-upload-text">Click or drag file to this area to upload</p> <p className="ant-upload-hint">Support for a single or bulk upload.</p> </Dragger> </div> ); }; ``` 上面是FormUpload组件的简单使用方法,你可以根据自己的需求对它们进行更详细的配置和使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值