Android实现Ant Design 自定义表单组件

前端之家收集整理的这篇文章主要介绍了Android实现Ant Design 自定义表单组件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示方法(使用起来确实很爽),这时需要自己动手封装一些表单,同时我们还要保持方法可以继续是使用。

  组件的源码    https://github.com/haozhaohang/ant-design-expand-component

  下面看一下如何自己封装表单组件,这是一个最基础的表单使用例子:

  1. import React,{ PureComponent } from 'react'
  2. import { Button,Form,Input,Radio } from 'antd'
  3. import FormItem from 'components/FormItem'
  4. const RadioGroup = Radio.Group
  5. const options = [
  6. { label: '男',value: 1 },{ label: '女',value: 2 },]
  7. class Test extends PureComponent {
  8. handleSubmit = (e) => {
  9. e.preventDefault();
  10. const { form: { validateFields } } = this.props;
  11. validateFields((errors,values) => {
  12. if (errors) {
  13. return;
  14. }
  15. console.log(values)
  16. })
  17. }
  18. render() {
  19. const { form: { getFieldDecorator } } = this.props
  20. const nameDecorator = getFieldDecorator('name')
  21. const sexDecorator = getFieldDecorator('sex')
  22. return (
  23. <section>
  24. <Form layout="horizontal" onSubmit={this.handleSubmit}>
  25. <FormItem label="姓名">
  26. {nameDecorator(<Input />)}
  27. </FormItem>
  28. <FormItem label="年龄">
  29. {sexDecorator(<RadioGroup options={options} />)}
  30. </FormItem>
  31. <FormItem buttonsContainer>
  32. <Button type="primary" size="default" htmlType="submit">提交</Button>
  33. </FormItem>
  34. </Form>
  35. </section>
  36. );
  37. }
  38. }
  39. export default Form.create()(Test)

 现在需求需要我们实现多个姓名的提交,这时使用UI组件提供的表单便无法实现。

  下面我们可以封装一个InputArrary组件:

  1. import React,{ PureComponent } from 'react'
  2. import PropTypes from 'prop-types'
  3. import { Button,Icon,Input } from 'antd'
  4. import './index.scss'
  5. class InputArray extends PureComponent {
  6. constructor(props) {
  7. super(props)
  8. }
  9. handleChange = index => {
  10. const { value,onChange } = this.props
  11. const newValue = [...value]
  12. newValue[index] = target.value
  13. onChange(newValue)
  14. }
  15. handleDelete = e => {
  16. const target = e.currentTarget
  17. const index = target.parentNode.parentNode.firstChild.dataset.index
  18. const { value,onChange } = this.props
  19. const newValue = [...value]
  20. newValue.splice(Number(index),1)
  21. onChange(newValue)
  22. }
  23. handleAdd = () => {
  24. const { value,onChange } = this.props
  25. const newValue = [...value,'']
  26. onChange(newValue)
  27. }
  28. render() {
  29. const { value,...others } = this.props
  30. const closeBtn = <Icon type="close-circle" onClick={this.handleDelete} />
  31. return (
  32. <div className="input-array-component">
  33. {value.map((v,i) => {
  34. return (
  35. <div key={i}>
  36. <Input
  37. {...others}
  38. value={v}
  39. suffix={closeBtn}
  40. data-index={i}
  41. onChange={() => this.handleChange(i)}
  42. />
  43. </div>
  44. );
  45. })}
  46. <div>
  47. <Button type="dashed" icon="plus" onClick={this.handleAdd}>添加</Button>
  48. </div>
  49. </div>
  50. );
  51. }
  52. }
  53. InputArray.defaultProps = {
  54. value: []
  55. }
  56. export default InputArray

     这是我们就可以像引入Input组件一样引入InputArray组件实现了一组姓名的提交。

  1. <FormItem label="姓名">
  2. {nameDecorator(<InputArray />)}
  3. </FormItem

  组件主要使用的form提供getFieldDecorator方法,这个方法会向组件注入value参数,onChange方法,每次调用onChange方法都会去改变value,从而刷新整个组件。为什么会这样那,其实Ant Design 会在表单组件外层包裹一层组件,维护一个State值,每次onChange都是在改变外部state值,调用setState来刷新表单组件。

    Upload组件使用中也遇到一个坑,Upload组件action上传地址参数也是必填参数,每次上传都会直接上传到服务器,不能和其它表单的数据一起提交,这时候我们也必须从新封装一个上传组件,同时因为存在文件图片数据就不能使用json格式和后台进行交互,必须使用new FormData()的数据格式上传,也就是原生的表单的submit提交。 

  组件的源码    https://github.com/haozhaohang/ant-design-expand-component

以上所述是小编给大家介绍的Android实现Ant Design 自定义表单组件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持

猜你在找的Ant Design相关文章