setState() 反应后无法按 ctrl Z
我在 中有一个文本通过使用 useState() 获得值“first”。
const [text, setText] = React.useState("");
const setStateOnClick = () => {
setText("second");
};
const onchangeText = (e) => {
const value = e.target.value;
setText(value);
};
return (
<div>
<input value={text} onChange={(e) => onchangeText(e)} />
<button onClick={setStateOnClick}>set new state</button>
</div>
);
开始,在<输入>中是:“第一个”
在我设置文本之后。
我无法“ctrl Z”来取回开始文本的值(“第一个”)。
我尝试通过“onChange()”捕获该值并将其放入堆栈中,但它会保存每个字母,因此性能会降低。
有没有办法保存“ctrl Z”的状态?谢谢。
解决了。
export default function StateTextFields() {
const [text, setText] = React.useState("");
const [textArr, setTextArr] = React.useState([]);
const typingTimeoutRef = React.useRef(null);
const setStateOnClick = () => {
setText("second state");
};
const setStateUndo = () => {
if (textArr.length > 0) {
const NewArr = [...textArr];
setText(NewArr[NewArr.length - 1]);
NewArr.pop();
setTextArr(NewArr);
}
};
const onchangeText = (e) => {
const value = e.target.value;
setText(value);
if (typingTimeoutRef.current) {
clearTimeout(typingTimeoutRef.current);
}
typingTimeoutRef.current = setTimeout(() => {
const NewArr = [...textArr];
NewArr.push(value);
setTextArr(NewArr);
}, 300);
};
return (
<div>
<input value={text} onChange={(e) => onchangeText(e)} />
<button onClick={setStateOnClick}>second</button>
<button onClick={setStateUndo}>Undo</button>
</div>
);
}
I have a text in <input> have value "first" by using useState().
const [text, setText] = React.useState("");
const setStateOnClick = () => {
setText("second");
};
const onchangeText = (e) => {
const value = e.target.value;
setText(value);
};
return (
<div>
<input value={text} onChange={(e) => onchangeText(e)} />
<button onClick={setStateOnClick}>set new state</button>
</div>
);
Begin, in <input> is: "first"
After I setText.
I can't "ctrl Z" to take back value("first") of begin text.
I try to catch the value by "onChange()" and put it in a stack, but it save every letters so performance will be decreased.
Is there a way to save the state of "ctrl Z" ? Thank you.
SOVLED.
export default function StateTextFields() {
const [text, setText] = React.useState("");
const [textArr, setTextArr] = React.useState([]);
const typingTimeoutRef = React.useRef(null);
const setStateOnClick = () => {
setText("second state");
};
const setStateUndo = () => {
if (textArr.length > 0) {
const NewArr = [...textArr];
setText(NewArr[NewArr.length - 1]);
NewArr.pop();
setTextArr(NewArr);
}
};
const onchangeText = (e) => {
const value = e.target.value;
setText(value);
if (typingTimeoutRef.current) {
clearTimeout(typingTimeoutRef.current);
}
typingTimeoutRef.current = setTimeout(() => {
const NewArr = [...textArr];
NewArr.push(value);
setTextArr(NewArr);
}, 300);
};
return (
<div>
<input value={text} onChange={(e) => onchangeText(e)} />
<button onClick={setStateOnClick}>second</button>
<button onClick={setStateUndo}>Undo</button>
</div>
);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
下面提供的是一个工作示例,它显示 Ctrl+Z 可用于撤消输入中键入的文本(除非单击按钮)。
代码片段
编辑
根据更新的问题,添加了一个新按钮“撤消”。
pastItems
中。pastItems
中有条目时,“撤消”
按钮将启用,并允许用户逐一调用值,直到没有值为止。Provided below is a working-example which shows that Ctrl+Z may be used to undo text typed in the input (unless the button is clicked).
Code Snippet
EDIT
Based on updated question, a new button "Undo" has been added.
pastItems
.pastItems
the"Undo"
button is enabled and allows user to recall values one-by-one till no values remain.