react+Antd 表单清空的坑和排错填坑

翻遍了整个度娘硬是找不到靠谱的解决方法,自行解决后分享一下。

页面效果:

 

开发登录校验界面的整体代码,因为主打后端,所以基本结构有点混乱,有不足之处还望指点。

目录

登录表单页面的完整代码:login.js

一段段逻辑讲一下

下面是排错参考文章和一些资料:


登录表单页面的完整代码:login.js

import React,{Component} from 'react';
import { Button, Checkbox, Form, Input } from 'antd';

class LoginTo extends Component {

    FormRef = React.createRef();
    // namepaths = ['username','password'];

    onFinish = (values) => {
        console.log('Success:', values);
    };

    onFinishFailed = (errorInfo) => {
      this.FormRef.current.resetFields();
      console.log('Failed:', errorInfo);
    };

    //校验不通过清空表单输入框中的输入内容
    handleSubmit = () => {
        console.log(this);
        this.FormRef.current.resetFields();
    }

    render(){
        return (
            <Form
            ref={this.FormRef}
              name="basic"
              labelCol={{
                span: 8,
              }}
              wrapperCol={{
                span: 16,
              }}
              //设置初始化值
              initialValues={{
                'username': '',
                'password': '',
                'remember': true
              }}
              onFinish={this.onFinish}
              onFinishFailed={this.onFinishFailed}
              autoComplete="off"
              //设置整个<Form>元素的位置
              style={{
                width: 1200,
                border: 75,
                padding: 34,
                margin: 200
              }}
            >
              <Form.Item
                label="Username"
                name="username"
                //设置校验规则
                rules={[
                    {required: true, message: 'Please input your username!'},
                    {pattern: /^[\u4E00-\u9FA5A-Za-z0-9]+$/, message: '不支持特殊字符或空格!'},
                    { max: 20, message: '用户名最长不超过20位,请正确输入' }
                ]}
              >
                <Input placeholder='please input your username.' style={{width: 250, height: 40}}/>
              </Form.Item>
        
              <Form.Item
                label="Password"
                name="password"
                //设置校验规则,一旦匹配不上立即报错
                rules={[
                  {
                    required: true,
                    message: 'Please input your password!',
                  },
                  {pattern: /^[\u4E00-\u9FA5A-Za-z0-9]+$/, message: '不支持特殊字符或空格!'}
                ]}
              >
                <Input.Password placeholder='please input your password.' style={{width: 250, height: 40}}/>
              </Form.Item>
        
              <Form.Item
                name="remember"
                valuePropName="checked"
                wrapperCol={{
                  offset: 8,
                  span: 16,
                }}
              >
                <Checkbox>Remember me</Checkbox>
              </Form.Item>
        
              <Form.Item
                wrapperCol={{
                  offset: 8,
                  span: 16,
                }}
              >
                <Button type="primary" htmlType="submit" onClick={this.handleSubmit}>
                  Submit
                </Button>
              </Form.Item>
            </Form>
          );
    };
}

export default LoginTo;

一段段逻辑讲一下

首先是设置校验规则,设置在Form.Item组件的rules属性,类型是Rules[]数组。校验时机由Form.Item组件中的validataFirst属性设置,不设置默认表单值改变时触发,校验规则就是rules属性。

pattern定义正则表达式,msg为错误提示信息。

              //用正则表达式进行匹配字段值来校验判定,不符合提示msg中的自定义信息
              //username的校验
              <Form.Item
                label="Username"
                name="username"
                //设置校验规则
                rules={[
                    {required: true, message: 'Please input your username!'},
                    {pattern: /^[\u4E00-\u9FA5A-Za-z0-9]+$/, message: '不支持特殊字符或空格!'},
                    { max: 20, message: '用户名最长不超过20位,请正确输入' }
                ]}
              >
                <Input placeholder='please input your username.' style={{width: 250, height: 40}}/>
              </Form.Item>

              //password的校验
              <Form.Item
                label="Password"
                name="password"
                //设置校验规则,一旦匹配不上立即报错
                rules={[
                  {
                    required: true,
                    message: 'Please input your password!',
                  },
                  {pattern: /^[\u4E00-\u9FA5A-Za-z0-9]+$/, message: '不支持特殊字符或空格!'}
                ]}
              >
                <Input.Password placeholder='please input your password.' style={{width: 250, height: 40}}/>
              </Form.Item>

然后是输入框的默认显示palceholder属性,显示效果是虚化的字体提示。同样见以上代码。

接着就是bug的罪恶来源了。。先说说需求

提交表单校验失败后清空表单项

查看antd的官方文档,找到有可以直接使用的方法

 配合Form组件的initialValues属性使用:

            <Form
            ref={this.FormRef}
              name="basic"
              labelCol={{
                span: 8,
              }}
              wrapperCol={{
                span: 16,
              }}
              //设置初始化值
              initialValues={{
                'username': '',
                'password': '',
                'remember': true //设置remember me功能,默认勾选。
              }}
              onFinish={this.onFinish}
              onFinishFailed={this.onFinishFailed}
              autoComplete="off"
              //设置整个<Form>元素的位置
              style={{
                width: 1200,
                border: 75,
                padding: 34,
                margin: 200
              }}
            >

需要注意的是Form组件中的initialValues属性和Form.Item子组件中的initialValue属性会有冲突,不能一同设置,会报错Warning: Form already set 'initialValues' with path 'xxx'. Field can not overwrite it. 警告,因为initialValue 和 initialValues 不推荐共用的。

然后是设置提交后校验失败回滚表单项的功能。这里触发事件放在button组件的onClick属性上。而resetFields方法无法在组件中调用,需要抽取出来,代码如下:

//button组件
 <Form.Item
   wrapperCol={{
    offset: 8,
    span: 16,
    }}
   >
 <Button type="primary" htmlType="submit" onClick={this.handleSubmit}>
   Submit
 </Button>
 </Form.Item>

 //handleSubmit方法
 //校验不通过清空表单输入框中的输入内容
 handleSubmit = () => {
    console.log(this);
    this.FormRef.current.resetFields();
 }

这里handleSubmit方法中用到了FormRef,那么肯定在上文是有设置的。

 FormRef = React.createRef();

这样完整的登录校验表单页面就能够实现了。


下面是排错参考文章和一些资料:

学到不错的的排错方法 

关于initialValues使用:antd的Form组件实例 表单 Form - Ant Design (antgroup.com) 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
React中,清空表单可以通过Antd的Form组件提供的`resetFields`方法来实现。具体步骤如下: 1. 在表单的父组件中引入`Form`组件,并将表单的所有控件都用`Form.Item`包裹起来,每个`Form.Item`需要设置`name`属性,这个属性值需要与`getFieldDecorator`方法中的`id`参数保持一致。 ```jsx import { Form, Input, Button } from 'antd'; class MyForm extends React.Component { render() { const { getFieldDecorator } = this.props.form; return ( <Form> <Form.Item label="用户名" name="username"> {getFieldDecorator('username')(<Input />)} </Form.Item> <Form.Item label="密码" name="password"> {getFieldDecorator('password')(<Input.Password />)} </Form.Item> <Form.Item> <Button type="primary" onClick={this.handleSubmit}>提交</Button> <Button onClick={this.handleReset}>重置</Button> </Form.Item> </Form> ); } } ``` 2. 在表单的父组件中定义`handleSubmit`和`handleReset`方法。`handleSubmit`方法用于提交表单,`handleReset`方法用于清空表单。 ```jsx class MyForm extends React.Component { handleSubmit = e => { e.preventDefault(); this.props.form.validateFields((err, values) => { if (!err) { console.log('Received values of form: ', values); } }); }; handleReset = () => { this.props.form.resetFields(); }; render() { //... } } ``` 3. 在表单的父组件中将`MyForm`组件包裹在`Form.create`函数中,生成一个新的高阶组件,并将其导出。 ```jsx const WrappedMyForm = Form.create({ name: 'my_form' })(MyForm); export default WrappedMyForm; ``` 这样,当用户点击表单中的“重置”按钮时,表单中的所有控件都会被清空。如果想要清空表单中的某一个控件,可以通过`setFieldsValue`方法来清空,具体可见前面的回答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值