Есть и другие способы достичь этого, но я вижу, что 2 в пределах досягаемости
1. Сохраните newCoop
в структуре, необходимой для вызова POST
this.state = {
newCoop: {
name: '',
type: {
name: ''
}
}
}
Измените значение, которое вы даете типу ввода
<Input inputType={'text'}
title= {'Type'}
name= {'type'}
value={this.state.newCoop.type.name}
placeholder = {'Enter cooperative type'}
handleChange = {this.handleInput}
/>
, и настройте this.handleInput
для обработки этого случая:
- вам может потребоваться написать специальную
handleTypeNameChange
функцию - изменить
this.handleInput
так, чтобы она могла справиться с этим случаем
Это зависит в вашей функции this.handleInput
- можете ли вы поделиться ею?
name
, который вы вводите для ввода, является атрибутом html name
. Не уверен, что вы используете его в handleInput
.
2. Оставьте форму как ручку изменения формы данных в this.handleFormSubmit
this.handleFormSubmit = () => {
const postData = {
name: this.state.newCoop.name,
type: {
name: this.state.newCoop.type
}
}
// POST postData
}
Опять же, это зависит от вашего handleFormSubmit
кода.
Надеюсь, это поможет!
Подробнее о варианте 1:
Мне нравится этот подход. @heisenberg предложил решение для этого, но оно не очень хорошо масштабируется - оно работает, но добавление еще нескольких полей превратит этот код в нечто сложное для чтения и обслуживания.
Вы можете: * использовать путь к значению состояния, которое вы хотите обновить, для имени входа * в handleInput
вы обновите значение состояния, расположенное по пути, указанному name
Вы можете написать handleInput
следующим образом:
import { set } from "lodash";
[...]
handleInput = e => {
let value = e.target.value;
let name = e.target.name;
const newCoop = set(this.state.newCoop, name, value);
this.setState({ newCoop });
};
Я использовал для этого loda sh s set . Есть и другие способы сделать это - вы даже можете написать это сами, если вам действительно не нужны дополнительные зависимости.
Для того, чтобы это работало для newCoop.type.name
, вам необходимо настроить имя входа
<input
...
name={"type.name"} // <- use the path to the value you want to change
value={this.state.newCoop.type.name}
...
/>
Здесь - это Codesandbox с рабочим примером. Для простоты я использовал обычный input
, а не компонент.