Form 组件:仅提供样式与事件,会生成一个form元素
form 对象:处理数据验证、生成、获取
Form.Item 表单项:它仅对它的直接子元素生效
Form
createOptions(){const options = [];for(let i = 1980; i <= 2012; i++){options.push(<Select.Option key={i} value={i}>{i}年</Select.option>);}}handleSubmit = (e) => {e.preventDefault();console.log(this.props.form.getFieldsValue());this.props.form.validateField((err, values) => {if(err!==null){//验证通过console.log(values);}else{console.log(err);}});}render(){const { getFieldDecorator } = this.props.form;return (<FormlabelCol={{span: 2}}//这个是每个表单项的label的宽度wrapperCol={{span: 10}}//这个是总长><Form.Item label="账号">{ getFieldDecorator('loginId', {rules: [{required: true,message: '账号必须填写'},],})(<Input />) }</Form.Item><Form.Item label="密码">{ getFieldDecorator('loginPwd', {rules: [{required: true,message: '密码必须填写'},],})(<Input.Password />) }</Form.Item><Form.Item label="性别">{ getFieldDecorator('sex')(<Radio.Group><Radio.Button value={0}>男</Radio.button><Radio.Button value={1}>女</Radio.button></Radio.Group>) }</Form.Item><Form.Item label="班长">{ getFieldDecorator('isMonitor', {valuePropName: 'checked',initialValue: false,//默认值})(<Switch />) }</Form.Item><Form.Item label="出生年份">{ getFieldDecorator('birth', {valuePropName: 'checked',})(this.createOptions()) }</Form.Item><Form.Item label="手机号">{ getFieldDecorator('phone', {rules: [{required: true,message: '请填写手机号'},{pattern: /1\d{10}/, message: '手机号格式不正确',}],})(<Input />) }</Form.Item><Form.Item label="住址">{ getFieldDecorator('address')(<Input />) }</Form.Item><Form.Item label="邮箱">{ getFieldDecorator('email', {rules: [{required: true,message: '请填写邮箱'},{pattern: /\w+@\w+(\.\w+){1,2}/,message: '邮箱格式不正确',}],})(<Input />) }</Form.Item><Form.Item wrapperCol={{offset: 2}}><Button htmlType='submit' type='primary'>提交</Button></Form.Item></Form>);}function getFieldConfig(obj){const result = {};for(const prop in obj){result[prop] = From.createFormField({value: obj[prop]});}return result;}const HOC = Form.create({//把父组件的属性映射到表单项上mapPropsToFileds: props => ({sex: Form.createFormField({value: 0,}),//不能直接写0, 1 变量啥的; 但是这么写又比较麻烦,所以可以写个函数,统一生成,getFieldConfigisMonitor: Form.createFormField({value: false,})}),});export default HOC(StudentForm);
Form上的事件:
onSubmit:
侦听 htmlType为 submit 的button,又因为form表单元素提交默认会刷新页面,所以需要先阻止默认事件
在handleSubmit内部先写:e.preventDefault();
form 对象
如何得到这个form对象?
- 通过 Form.create(配置对象); 得到一个高阶组件(HOC),该HOC会将form对象作为属性prop,注入到传递过来的组件中。 export default HOC(要传进来的关于Form的组件);
- 传给create的配置对象,就可以配置整个表单里的数据及一些属性
 
 - const { getFieldDecorator } = this.props.form;//当调用解构出来的函数时,就会返回一个HOC
- getFieldDecorator(‘填写标识—要受控的表单子项的属性名’)(< Input />)
 - this.props.form.getFieldsValue(); 可以得到关联着这个表单数据对象了,{ loginId: ‘xxxx’, }
 - getFieldDecorator根据传入组件的 value 属性,使其受控,所以如果是 checked等 就会报错!
 - 可以传入第二个参数,是配置对象,里面的valuePropName就可更改依赖的受控属性。rules数组就是校验规则相关的
 
 - Form.createFormField({ value: xxxx }); 创建表单项数据
 - this.props.form.getFieldsValue((err, values) => {}); 在这里就会进行校验
 - this.props.form.setFields(表单项数据—由createFormField创建的); 就可以设置表单数据
Form.Item
它仅对它的直接子元素生效 
图片上传
请求地址:http://101.132.72.36:5100/api/upload
请求方式:post
请求调试工具:postman
表单格式:form-data
表单域名称(就是key):imagefile
服务器返回结果:
- 没错误:{ “path”: ‘访问路径’ } json格式
 - 有错误:{ “error”: ‘错误信息 }
 
