вопрос
Найден при выполнении проекта antd, используйтеForm.create()(xxx)
в созданном модулеForm
Доступно до отправки формыthis.props.form.validateFieldsAndScroll()
Чтобы определить, прошла ли проверка успешно,this.props.form
То есть весь модуль страницыForm
, то если на странице несколькоForm
, затем используйтеthis.props.form.validateFieldsAndScroll()
Оценка результата проверки для всей страницыForm
судить, а не по одномуForm
Судя по результатам проверки, проблема здесь, какForm
выносить суждения?
Решение
- Ручная проверка путем добавления элементов формы
change
Мониторинг событий, получение значений элементов формы и ручная проверка — это метод, но он идет вразрез с идеей реактивного дизайна. - Отделите форму как компонент. Страница передает значения, требуемые компонентом формы, через свойства и поддерживает соответствующую логику внутри компонента формы. Это также рекомендуемый метод в этой статье.
Реализация кейса
Подкомпонент формы:
import React, { Component } from 'react';
import {Button, Form, Input, Select} from 'antd';
const FormItem = Form.Item;
class Forms extends Component{
getItemsValue = ()=>{
const val= this.props.form.getFieldsValue(); // 获取from表单的值
return val;
}
render(){
const formItemLayout = {
labelCol: {
xs: { span: 24 },
sm: { span: 8 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 },
},
};
const { form, initValue1, initValue2, initValueList } = this.props;
const { getFieldDecorator } = form; // 校验控件
return(
<Form style={{backgroundColor: '#fff', padding: '20px'}}>
<FormItem
{...formItemLayout}
label={`相关数量`}
>
{getFieldDecorator(`amount`,{
rules: [{
message: '必填字段!',
required: true
}],
initialValue: initValue1 ? initValue1 : undefined
})(
<Input placeholder="请输入"/>
)}
</FormItem>
<FormItem
{...formItemLayout}
label={`选择相关名称`}
>
{getFieldDecorator(`name`,{
rules: [{
message: '必填字段!',
required: false
}],
initialValue: initValue2 ? initValue2 : undefined
})(
<Select
placeholder="请选择"
onChange={this.handleSelectChange}
>
{
initValueList && initValueList.map((x, i) => (
<Option value={x.Id} key={i}>{x.name}</Option>
))
}
</Select>
)}
</FormItem>
</Form>
)
}
}
export default Form.create()(Forms); //创建form实例
Дочерний компонент формы, получает исходные данные от родительского компонента, в компонентеgetItemsValue
Пользовательский метод возвращает значение формы и должен вызываться в родительском компоненте.
Родительский компонент:
import React, { Component } from 'react';
import { Modal, Button } from 'antd';
import Forms from './Forms'
export default class Modals extends Component {
constructor(props) {
super(props);
this.state = {
visible: false,
initValue1: 0,
initValue2: 'myName',
initValueList: ["李云龙", "李荣基", "李达"]
};
}
handleClick = () => {
this.setState({
visible: true
})
};
handleCreate = () => {
let values = this.formRef.getItemsValue();
// 获取到子组件form的值,做进一步操作
this.setState({
visible: false
})
};
render() {
return (
<section>
<Modal
visible={this.state.visible}
title="编辑"
onOk={this.handleCreate}
onCancel={() => {
this.setState({ visible: false });
}}
okText="保存"
cancelText="取消"
>
<Forms
initValue1={initValue1}
initValue2={initValue2}
initValueList={initValueList}
wrappedComponentRef={(form) => this.formRef = form}
/>
</Modal>
<Button onClick={()=>{ this.handleClick }}>点击弹框</Button>
</section>
);
}
}
Здесь главное использоватьwrappedComponentRef
собственность получить этоForm
Ссылка просто понимается как получение экземпляра формы дочернего компонента, поэтому его можно найти вhandleCreate
через функциюthis.formRef.getItemsValue()
Вызовите метод подкомпонента, чтобы получить возвращаемое значение формы. На данный момент вышеуказанная проблема решена.
оwrappedComponentRef
Смотрите описание дляи описание официального сайта.