Проблема связана с мутацией объекта состояния. Вы изменяете input_value
и сохраняете его обратно в состояние вместо возврата новой ссылки на объект.
Состояние обновления
set_input_value(input_value);
против set_input_value({ ...input_value, [name]: value });
Это распространяется в существующем состоянии и устанавливает пару ключ-значение для входных данных, которые были обновлены.
Если синтаксис распространения незнаком, обычно принято копировать объект состояния в новый объект. , Хуки useState
могут также использовать функциональные обновления , и если вы проверите ссылку, вы увидите заметку о том, что useState
не сливается с обновлениями состояния, как его аналог на основе класса, this.setState()
:
Примечание
В отличие от метода setState
, найденного в компонентах класса, useState
не объединяет объекты обновления автоматически. Вы можете повторить это поведение, комбинируя форму средства обновления функций с синтаксисом распространения объекта:
setState(prevState => { // Object.assign would also work
return {...prevState, ...updatedValues};
});
Теперь вы можете заметить, что наше решение не является функциональным обновлением, но синтаксис распространения работает аналогично. Причина, по которой мы можем выполнить стандартное обновление, заключается в том, что ваше состояние состоит из 3 независимых переменных, и при каждом обновлении вы копируете их все, а затем просто заменяете любую из них.
Функциональные обновления в основном используются, когда следующее значение состояния зависит от текущего значения состояния, подобно тому, как примеры счетчиков реагируют на любовь.
Я должен отметить, что функциональные обновления - это соглашение о реакции, в то время как распространение синтаксис является частью javascript выражений и операторов .
Очистка входов
Ваша первая попытка верна для состояния очистки, так долго при привязке значения состояния к каждому входу.
const [input_value, set_input_value] = useState({
input1: "",
input2: "",
input3: ""
});
const inputs_handler = e => {
let name = e.target.name;
let value = e.target.value;
set_input_value({ ...input_value, [name]: value });
};
const clear_input_values = () => {
set_input_value({
input1: "",
input2: "",
input3: ""
});
};
return (
<div className="App">
<h1>Hello CodeSandbox</h1>
<h2>Start editing to see some magic happen!</h2>
<div>
<input
onChange={inputs_handler}
type="text"
name="input1"
value={input_value.input1}
/>
<input
onChange={inputs_handler}
type="text"
name="input2"
value={input_value.input2}
/>
<input
onChange={inputs_handler}
type="text"
name="input3"
value={input_value.input3}
/>
<input onClick={clear_input_values} type="submit" />
</div>
</div>
);