【发布时间】:2021-09-09 11:28:45
【问题描述】:
试图理解状态更新 -UseState React 钩子。在文本区域的 onchange 事件中设置消息会立即重新呈现并能够看到更新的消息状态 (handleChangeMessage)。
但是在 on-Keypress 事件中更新状态时不会立即显示更新的消息文本 (handleKeyPressMessage)。
为什么 handleKeyPressMessage- 不呈现最新的值,但 handleChangeMessage 呢? 这里的讽刺是,handleKeyPress 中的日志语句在 onchange 事件之前首先执行。
代码沙盒链接:https://codesandbox.io/s/usestate-01-forked-lvyio?file=/src/index.js
import React, { useState } from "react";
import ReactDOM from "react-dom";
import "./styles.css";
const Message = () => {
const [handleChangeMessage, setHandleChangeMessage] = useState("");
const [sendButtonClass, setSendButtonClass] = useState("send-disabled");
const [handleKeyPressMessage, setHandleKeyPressMessage] = useState("");
const handlechange = (e) => {
console.log("change");
setHandleChangeMessage(e.target.value);
};
const handleKeyPress = (e) => {
console.log("key");
setHandleKeyPressMessage(e.target.value);
if (handleChangeMessage == "") {
setSendButtonClass("send-disabled");
} else {
setSendButtonClass("send");
}
};
return (
<div>
<input
type="text"
value={handleChangeMessage}
placeholder="Enter a message"
onChange={handlechange}
onKeyPress={handleKeyPress}
/>
<button className={sendButtonClass}>Send</button>
<p>
"message updated via onChange event ======> : "
<strong>{handleChangeMessage}</strong>
<br />
"message updated via onKeyPress event =====> : "
<strong>{handleKeyPressMessage}</strong>
</p>
</div>
);
};
const rootElement = document.getElementById("root");
ReactDOM.render(<Message />, rootElement);
更新
这里的问题是在 onchange 事件(更新句柄更改消息)之前首先触发 keypress 事件。因此输入元素在 HandleKeyPress 事件中具有过时的值(e.target.value 即 handleChangemessage) 将 keypress 事件更改为 keyup 将解决此问题 阿布舍克建议
【问题讨论】:
标签: reactjs react-hooks use-state