#javascript #reactjs #typescript
Вопрос:
У меня есть функция, которая получает ввод в виде имени входного файла и значения этого поля ввода в виде
function handleChange(e:React.ChangeEvent<HTMLInputElement>):void{
const { name, value } = e.target;
const key = name
let newArr = [...form];
newArr.map(item => {
return {...form , [key]: value}
});
setForm(newArr)
}
Структура представления по умолчанию выглядит следующим образом:
const form = [{
"Name":"Nagesh",
"Email":"abc@gmail.com",
"Address" : {
"House_Number":"123",
"Street_Name":"something",
"City":"example",
},
"Phone_Number":"567899090"
}]
Теперь после нажатия на onChange
событие я получаю имя поля ввода и значение текущего поля ввода для handleChange
функции. Проблема newArr
в том, что старое значение не обновляется новым значением и состояние не обновляется новыми значениями.
Например, если я передам значение в name
качестве имени поля ввода «Имя», а его значение — «Нагеш Катна», оно получит значения, но не обновит файл newArr. [{"Name": "Nagesh Katna"}]
Если я console.log(newArr)
. Массив остается со значениями по умолчанию. Я использую интерфейс TypeScript и semantic-UI в качестве интерфейса.
Я определил интерфейс с той же структурой для формы и использования состояний таким образом
const defaultView: Values[] = []
const [form, setForm]: [Values[], (fetch: Values[]) => void] = useState(defaultView);
Пожалуйста, спасите мои выходные.
Ответ №1:
Вы создаете здесь новый массив, неглубокую копию form
:
let newArr = [...form];
И вы сопоставляете его, чтобы создать здесь еще один новый массив:
newArr.map(item => {
return {...form , [key]: value}
});
Но вы никогда не используете результат .map
. Вам нужно присвоить его переменной и передать ее setForm
.
Кроме того, это, { ...form
вероятно, опечатка — вы имели в виду { ...item
?
const newForm = newArr.map(item => {
return {...item , [key]: value}
});
setForm(newForm);
Более кратко:
setForm(
form.map(item => ({
...item,
[name]: value
}))
);
Комментарии:
1. Спасибо вам за ваш быстрый ответ. Нет, здесь нет опечатки. Я пробовал так много разных вещей, но ни одна из них не сработала, поэтому я просто вставил последнее, что попробовал. Я даю возможность попробовать ваше решение.
2. Это похоже на опечатку, так как это не имеет смысла —
form
это массив, а не объект, поэтому разбрасыватьform
массив в объект для возврата бессмысленно.3. Ваше решение действительно сработало. Как я уже сказал, я перепробовал так много вещей, что потерял представление о том, что я сделал. Я понимаю, насколько бессмысленно было использовать эту форму.