I have a question about the useState hook. We all know that the useState setter method is not reflecting a change immediately. For example,
const App = () => {
const [name, setName] = React.useState("");
return (
<React.Fragment>
<form onSubmit={(e) => {
e.preventDefault();
setName("submit");
console.log("onSubmit:",name)
}}
className="form">
<div>
<input type="text" />
</div>
<button type="submit">add </button>
</form>
</React.Fragment>
);
};
ReactDOM.render(<App />,document.getElementById("root"))
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>
When one inputs some words and clicks ADD, nothing presents after "onSubmit:" in the console. The reason is that the setter setName() is not reflecting a change immediately. However, if the setter method is implemented in the onChange property, the change can be applied immediately by setName(). For example, if we move setName() from onSubmit to onChange in the input element.
const App = () => {
const [name, setName] = React.useState("");
return (
<React.Fragment>
<form onSubmit={(e) => {
e.preventDefault();
console.log("onSubmit:",name)
}}
className="form">
<div>
<input
type="text"
onChange={(e) => {
setName(e.target.value);
}}
/>
</div>
<button type="submit">add </button>
</form>
</React.Fragment>
);
};
ReactDOM.render(<App />,document.getElementById("root"))
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>
console.log() is going to print out some words we input after "onSubmit:". Is it true that setter method is going to be immediately applied in the onChange property? Or do I misunderstand some details about React useState setter method? I reviewed several qeustions about React useState setter from Stackoverflow. They seem not to be directly related to my problem. Thanks a lot.