Обычно я создаю одну форму для обработки как добавления, так и обновления. Вы должны создать свою форму таким образом, чтобы принимать набор данных по умолчанию и, если это предусмотрено, просто загрузить их в соответствующее поле управления.
Мои controls
реквизиты для этой формы выглядят так:
const controls = [
{
key: 'supa-dupa-key',
type: 'text',
label: 'whatever',
required: true,
alertText: 'Not today...',
disabled: false,
defaultValue: ''
}
];
Я использую это для заполнения моей общей формы локального состояния, если вы хотите использовать форму для добавления чего-либо, просто передайте элементы управления без defaultValue
и если вы хотите использовать форму для обновления, просто заполните элементы defaultValue
свойство:
fillUp = controls => ({
...controls.reduce((o, { key, defaultValue, type }) => ({
...o,
[key]: {
value: defaultValue || '',
isValid: false,
isInvalid: false
}
}), {})
});
Каждое поле управления получит value
и onChange
в зависимости от управляющего ключа:
value={this.state[key]}
onChange={e => this.handleChange(e.target.value, key)}
Кроме того, я использую динамический рендеринг элементов управления для рендеринга каждого элемента управления из реквизита элементов управления.
Примерно так (создайте столько шрифтов, сколько хотите):
renderTextControl = control => (
<Form.Group key={control.key} controlId={control.key}>
<Form.Label className="mb-1 text-muted">
{control.label}{control.required && ' *'}
</Form.Label>
<Form.Control
disabled={this.props.inProgress || control.disabled || false}
required={control.required || false}
type={type}
size="sm"
isValid={this.state[control.key].isValid}
isInvalid={this.state[control.key].isInvalid}
value={this.state[control.key].value}
onChange={this.handleChange(control.key, control.type)}
/>
{control.alertText &&
<Form.Control.Feedback type="invalid">
{control.alertText}
</Form.Control.Feedback>
}
</Form.Group>
);
Надеюсь, это поможет вам, и вы сможете адаптировать это к вашим потребностям.