Одна из философий реакции состоит в том, что государство неизменно. Ie, вы не изменяете свойства существующего объекта состояния, а вместо этого создаете новый объект состояния. Это позволяет реагировать, чтобы сказать, что состояние изменилось простой проверкой ===
до и после.
Эта строка кода изменяет существующий объект формы, а затем передает его в setForm:
setForm(Object.assign(form, {[e.target.name]: e.target.value}));
Таким образом, реакция сравнивает объект до setForm
и после, и видит, что они тот же объект. Поэтому делается вывод, что ничего не изменилось, и поэтому компонент не рендерится.
Вместо этого вам нужно сделать копию объекта и внести изменения в копию. Если вы привыкли к Object.assign, это может быть достигнуто путем помещения пустого объекта в качестве первого аргумента Object.assign:
setForm(Object.assign({}, form, {[e.target.name]: e.target.value}));
В качестве альтернативы, синтаксис распространения является удобным способом сделать поверхностный копия объекта:
setForm({
...form,
[e.target.name]: e.target.value
})