Первое обновление:
Правильные параметры для сгенерированных входов:
let inner = arr.input.map((inputs, index) => (
<li key={index} >
<label>{inputs.inputLabel}</label>
<input
id={index}
name={inputs.id}
// value={inputs.inputValue}
type={inputs.inputType}
onChange={this.handleChangeInp}
/>
</li>
))
Таким образом, у нас будет id
и name
, доступных в событии, но структура глубокого состояния вынуждает нас написать вот что:
handleChangeInp = e => {
const id = e.target.id;
console.log(`the id is ${id}`);
const index = Number(e.target.id);
// deep state update
const newInputArr = this.state.inputData.inputArr.map((ing, i) => {
console.log(i, e.target.name);
return (i == index) ? e.target.value : ing;
});
const newInputData = {...this.state.inputData, inputArr: newInputArr}
this.setState({ inputData: newInputData }, ()=>{console.log(this.state.inputData)})
}
Это 'работает' ... , но у этого метода обновления состояния есть 2 проблемы / недостатки :
значения хранятся в массиве по индексу - у нас есть только пары индекс-значение;
вторая проблема более серьезна - он хранит только первое значение! Для использования карты («поиск») мы должны инициализировать массив для каждого индекса - в противном случае он не хранит значения.
Мой совет -используйте объект (карту) для хранения значений:
this.state = {
inputData: {
id: '',
inputArr: {}
}
};
и обработчик, подобный этому:
handleChangeInp = e => {
const {name, value} = e.target;
console.log(name, value);
// deep state update
const newInputArr = {...this.state.inputData.inputArr,[name]:value};
const newInputData = {...this.state.inputData, inputArr: newInputArr}
this.setState({ inputData: newInputData }, ()=>{console.log(this.state.inputData)})
}
Таким образом, у нас есть пары id-значение и только для «затронутых» полей.
Работающий пример .
Конечно значение для входных данных может быть прочитано из состояния (если определено):
value={this.state.inputData.inputArr[inputs.id]
? this.state.inputData.inputArr[inputs.id] : ''}
// or
value={this.state.inputData.inputArr[inputs.id]===undefined ? ''
: this.state.inputData.inputArr[inputs.id] }
// f.e. when we're using type conversions
// and numerical value `0` could be used as valid input