zoukankan      html  css  js  c++  java
  • React利用Antd的Form组件实现表单功能(转载)

    一、构造组件

    1、表单一定会包含表单域,表单域可以是输入控件,标准表单域,标签,下拉菜单,文本域等。

    这里先引用了封装的表单域 <Form.Item />

    2、使用Form.create处理后的表单具有自动收集数据并校验的功能,但如果不需要这个功能,或者默认的行为无法满足业务需求,可以选择不使用Form.create并自行处理数据

    经过Form.create()包装过的组件会自带this.props.form属性,this.props.form提供了很多API来处理数据,如getFieldDecorator——用于和表单进行双向绑定等,详细参加Antd官方文档:点击此处查看

    先展示表单样式:

    import React from 'react';
    import {Form, Table, Button, Select, Input, DatePicker} from 'antd';

    const FormItem = Form.Item;
    const Option = Select.Option;
    const {RangePicker} = DatePicker;//获取日期选择控件中的日期范围控件

    class UserManage extends React.Component {
    render() {
    const columns = [
    {
    title: '联系人',
    dataIndex: 'userName',
    key: 'userName',
    }, {
    title: '手机号',
    dataIndex: 'mobile',
    key: 'mobile',
    }, {
    title: '公司名称',
    dataIndex: 'companyName',
    key: 'companyName',
    }, {
    title: '最近活跃时间',
    dataIndex: 'lastOnlineTime',
    key: 'lastOnlineTime',
    }, {
    title: '禁言状态',
    dataIndex: 'status',
    key: 'status',
    },
    ];

    return (
    <div>
    <Form layout="inline" style={{marginBottom: '10px'}}>
    <FormItem label="最近活跃时间">
    <RangePicker style={{ '255px'}}/>
    </FormItem>
    <FormItem label="用户">
    <Input type="text" placeholder="公司名称、手机号" style={{ '155px'}}/>
    </FormItem>
    <FormItem label="禁言状态">
    <Select defaultValue="全部" style={{ '155px'}}>
    <Option value="全部">全部</Option>
    <Option value="是">是</Option>
    <Option value="否">否</Option>
    </Select>
    </FormItem>
    <Button type="primary" style={{marginTop: '3px', marginRight: '3px'}}>查询</Button>
    <Button style={{marginTop: '3px'}}>重置</Button>
    </Form>
    <Table
    columns={columns}
    />
    </div>
    )
    }
    }

    export default Form.create()(UserManage)


    colums是Table组件的API,columns和Column组件使用相同的API:

    dataIndex:列数据在数据项中对应的 key,支持a.b.c的嵌套写法

    key:React 需要的 key,如果已经设置了唯一的dataIndex,可以忽略这个属性

    二、使用getFieldDecorator(id, options) 进行表单交互

    1、现在的问题就是如何获取各种查询条件的数据,所以先改写render()里面的代码,getFieldDecorator用于和表单进行双向绑定:

    ...
    render(){
    const {form} = this.props;
    const {getFieldDecorator} = form;
    ...
    return (
    <div>
    <Form onSubmit={this.handleQuery} layout="inline" style={{marginBottom: '10px'}}>
    <FormItem label="最近活跃时间">
    {getFieldDecorator('lastOnlineTime')(<RangePicker style={{ '255px'}}/>)}
    </FormItem>
    <FormItem label="用户">
    {getFieldDecorator('userQueryLike')(<Input type="text" placeholder="公司名称或手机号" style={{ '155px'}}/>)}
    </FormItem>
    <FormItem label="禁言状态">
    {getFieldDecorator('status', {initialValue: "全部"})(
    <Select style={{ '155px'}}>
    <Option value="0">全部</Option>
    <Option value="1">是</Option>
    <Option value="2">否</Option>
    </Select>)}
    </FormItem>
    <Button type="primary" htmlType="submit" style={{marginTop: '3px', marginRight: '3px'}}>查询</Button>
    <Button style={{marginTop: '3px'}}>重置</Button>
    </Form>
    <Table
    columns={columns} /*dataSource={(从model取得的数据)}*/
    />
    </div>
    )
    }
    ...


    参数 说明 类型 默认值
    id 必填输入控件唯一标志。支持嵌套式的写法。 string  
    options.getValueFromEvent 可以把 onChange 的参数(如 event)转化为控件的值 function(..args) reference
    options.initialValue 子节点的初始值,类型、可选值均由子节点决定(注意:由于内部校验时使用 === 判断是否变化,建议使用变量缓存所需设置的值而非直接使用字面量))    
    options.normalize 转换默认的 value 给控件 function(value, prevValue, allValues): any -
    options.rules 校验规则,详细参考Antd官方文档 object[]  
    options.trigger 收集子节点的值的时机 string 'onChange'
    options.validateFirst 当某一规则校验不通过时,是否停止剩下的规则的校验 boolean false
    options.validateTrigger 校验子节点值的时机 string|string[] 'onChange'
    options.valuePropName 子节点的值的属性,如 Switch 的是 'checked' string 'value'
    2、上面给了表单一个onSubmit事件,当表单提交时执行handleQuery方法:

    ...
    class UserManage extends React.Component {
    //表单查询
    handleQuery = (e) => {
    if (e) e.preventDefault();
    const {dispatch, form} = this.props;
    form.validateFields((err, fieldsValue) => {
    if (err) return;
    //获取时间范围的值
    const rangeValue = fieldsValue['lastOnlineTime'];
    const userQueryLike = fieldsValue['userQueryLike'];
    //获取查询条件
    const values = {
    ...fieldsValue,
    "lastOnlineTime": (rangeValue && rangeValue.length > 1) ?
    ([rangeValue[0].format('YYYY-MM-DD'), rangeValue[1].format('YYYY-MM-DD')]) : null,
    "userQueryLike": userQueryLike ? userQueryLike.trim() : userQueryLike,
    };
    dispatch({
    type: "userManageModel/getUserList",
    payload: {
    values: values,
    }
    });

    });
    };
    ...
    }
    ...
    在此方法里又调用了form.validateFields校验并获取一组输入域的值与Error,入参fieldsValue就是从表单的FormItem里取到的值,然后使用fieldsValue['lastOnlineTime']这种形式,通过与之前写的getFieldDecorator('lastOnlineTime')产生映射,就获取了单个输入域的值。

    总结一下,使用React的Form实现表单功能,必须要使用Form.create(组件),使包装的组件带有this.props.form属性,才能调用form的getFieldDecorator和validateFields方法,getFieldDecorator中的id对应validateFields中的fieldsValue[''];而columns中的dateIndex对应的是从model取到数据json串的键名,这个要分清

  • 相关阅读:
    Python内置函数(33)——any
    Python内置函数(32)——all
    Mybatis相关SQL操作总结
    mybatis与oracle使用总结
    J2EE分布式服务基础之RPC
    J2EE企业级应用架构
    Dubbo模块介绍
    Dubbo简介
    Http之ContentType
    JSONP解决跨域方案
  • 原文地址:https://www.cnblogs.com/snowhite/p/12514328.html
Copyright © 2011-2022 走看看