Form 组件:仅提供样式与事件,会生成一个form元素
form 对象:处理数据验证、生成、获取
Form.Item 表单项:它仅对它的直接子元素生效

Form用的是栅格化

Form

  1. createOptions(){
  2. const options = [];
  3. for(let i = 1980; i <= 2012; i++){
  4. options.push(<Select.Option key={i} value={i}>{i}年</Select.option>);
  5. }
  6. }
  7. handleSubmit = (e) => {
  8. e.preventDefault();
  9. console.log(this.props.form.getFieldsValue());
  10. this.props.form.validateField((err, values) => {
  11. if(err!==null){
  12. //验证通过
  13. console.log(values);
  14. }else{
  15. console.log(err);
  16. }
  17. });
  18. }
  19. render(){
  20. const { getFieldDecorator } = this.props.form;
  21. return (
  22. <Form
  23. labelCol={{span: 2}}//这个是每个表单项的label的宽度
  24. wrapperCol={{span: 10}}//这个是总长
  25. >
  26. <Form.Item label="账号">
  27. { getFieldDecorator('loginId', {
  28. rules: [
  29. {
  30. required: true,
  31. message: '账号必须填写'
  32. },
  33. ],
  34. })(<Input />) }
  35. </Form.Item>
  36. <Form.Item label="密码">
  37. { getFieldDecorator('loginPwd', {
  38. rules: [
  39. {
  40. required: true,
  41. message: '密码必须填写'
  42. },
  43. ],
  44. })(<Input.Password />) }
  45. </Form.Item>
  46. <Form.Item label="性别">
  47. { getFieldDecorator('sex')(
  48. <Radio.Group>
  49. <Radio.Button value={0}>男</Radio.button>
  50. <Radio.Button value={1}>女</Radio.button>
  51. </Radio.Group>
  52. ) }
  53. </Form.Item>
  54. <Form.Item label="班长">
  55. { getFieldDecorator('isMonitor', {
  56. valuePropName: 'checked',
  57. initialValue: false,//默认值
  58. })(<Switch />) }
  59. </Form.Item>
  60. <Form.Item label="出生年份">
  61. { getFieldDecorator('birth', {
  62. valuePropName: 'checked',
  63. })(
  64. this.createOptions()
  65. ) }
  66. </Form.Item>
  67. <Form.Item label="手机号">
  68. { getFieldDecorator('phone', {
  69. rules: [
  70. {
  71. required: true,
  72. message: '请填写手机号'
  73. },
  74. {
  75. pattern: /1\d{10}/, message: '手机号格式不正确',
  76. }
  77. ],
  78. })(<Input />) }
  79. </Form.Item>
  80. <Form.Item label="住址">
  81. { getFieldDecorator('address')(<Input />) }
  82. </Form.Item>
  83. <Form.Item label="邮箱">
  84. { getFieldDecorator('email', {
  85. rules: [
  86. {
  87. required: true,
  88. message: '请填写邮箱'
  89. },
  90. {
  91. pattern: /\w+@\w+(\.\w+){1,2}/,
  92. message: '邮箱格式不正确',
  93. }
  94. ],
  95. })(<Input />) }
  96. </Form.Item>
  97. <Form.Item wrapperCol={{offset: 2}}>
  98. <Button htmlType='submit' type='primary'>
  99. 提交
  100. </Button>
  101. </Form.Item>
  102. </Form>
  103. );
  104. }
  105. function getFieldConfig(obj){
  106. const result = {};
  107. for(const prop in obj){
  108. result[prop] = From.createFormField({
  109. value: obj[prop]
  110. });
  111. }
  112. return result;
  113. }
  114. const HOC = Form.create({
  115. //把父组件的属性映射到表单项上
  116. mapPropsToFileds: props => ({
  117. sex: Form.createFormField({
  118. value: 0,
  119. }),//不能直接写0, 1 变量啥的; 但是这么写又比较麻烦,所以可以写个函数,统一生成,getFieldConfig
  120. isMonitor: Form.createFormField({
  121. value: false,
  122. })
  123. }),
  124. });
  125. export default HOC(StudentForm);

Form上的事件:

onSubmit:
侦听 htmlType为 submit 的button,又因为form表单元素提交默认会刷新页面,所以需要先阻止默认事件
在handleSubmit内部先写:e.preventDefault();

form 对象

如何得到这个form对象?


  1. 通过 Form.create(配置对象); 得到一个高阶组件(HOC),该HOC会将form对象作为属性prop,注入到传递过来的组件中。 export default HOC(要传进来的关于Form的组件);
    1. 传给create的配置对象,就可以配置整个表单里的数据及一些属性
  2. const { getFieldDecorator } = this.props.form;//当调用解构出来的函数时,就会返回一个HOC
    1. getFieldDecorator(‘填写标识—要受控的表单子项的属性名’)(< Input />)
    2. this.props.form.getFieldsValue(); 可以得到关联着这个表单数据对象了,{ loginId: ‘xxxx’, }
    3. getFieldDecorator根据传入组件的 value 属性,使其受控,所以如果是 checked等 就会报错!
    4. 可以传入第二个参数,是配置对象,里面的valuePropName就可更改依赖的受控属性。rules数组就是校验规则相关的
  3. Form.createFormField({ value: xxxx }); 创建表单项数据
  4. this.props.form.getFieldsValue((err, values) => {}); 在这里就会进行校验
  5. this.props.form.setFields(表单项数据—由createFormField创建的); 就可以设置表单数据

    Form.Item

    它仅对它的直接子元素生效

图片上传

请求地址:http://101.132.72.36:5100/api/upload
请求方式:post
请求调试工具:postman
表单格式:form-data
表单域名称(就是key):imagefile

服务器返回结果:

  1. 没错误:{ “path”: ‘访问路径’ } json格式
  2. 有错误:{ “error”: ‘错误信息 }