Я думаю, что проблема в onChange и onClick - это два разных обработчика, вопрос в том, какой из них в идеале должен передавать значения в родительский компонент?
Существует два типа форм, которые мыиспользовать в стандартном дизайне пользовательского интерфейса.Первый - это когда любое изменение на входе сохраняет изменения.Во-вторых, когда после внесения изменений в элементы формы вы нажимаете кнопку отправки, а затем изменения сохраняются.
Поскольку вы внедрили второй тип, ваш onChange
должен иметь дело с управлением состоянием TextArea и вашимonClick
должен иметь дело с отправкой.Так что ваш код в порядке.
У меня возникла дилемма относительно того, где должно жить состояние моей формы.
Это зависит ... В вашем случае вы толькоимеют одну форму и два элемента формы, ни один из которых не может использоваться повторно.Таким образом, эти неконтролируемые формы хорошо работают для вас.Однако, если вы хотите иметь компонент Form, который можно использовать повторно, или если вы хотите иметь форму с 15 полями в ней, вы не захотите писать отдельный обработчик onChange для каждого из них.Для этого вы хотели бы создать контролируемый компонент формы, который может обрабатывать все эти вещи для вас.Вот пример того, как это будет выглядеть.
export default class Form extends React.Component {
constructor(props) {
super(props);
this.state = {
values: {}
};
}
@boundMethod
handleSubmit(event) {
event.preventDefault();
this.props.submit(this.state.values);
}
@boundMethod
handleChange(event) {
const { name, value } = event.target;
const newValues = Object.assign(
{ ...this.state.values },
{ [name]: value }
);
this.setState({
values: newValues
});
}
public render() {
const { values } = this.state;
return (
<form onSubmit={this.handleSubmit} noValidate={true}>
<div>
{React.Children.map(
this.props.children,
child => (
{React.cloneElement(child, {
value: values[child.props.name],
onChange: this.handleChange
})}
)
)}
<div>
<button type="submit">
Submit
</button>
</div>
</div>
</form>
);
}
}
Тогда вы сможете использовать этот класс Form следующим образом:
<Form
submit={values => {
/* work with values */
}}
>
<input type="hidden" name="name" />
<input type="hidden" name="rating" />
</Form>;