【发布时间】:2020-09-02 13:34:57
【问题描述】:
https://codesandbox.io/s/react-textarea-callback-on-blur-yoh8n?file=/src/App.tsx
在 React 中有一个 textarea 我想实现两个基本用例:
- 当用户按下“Escape”时,移除焦点并重置某些状态
- 当用户在文本区域外点击并失去焦点时执行回调 (
saveToDatabase) (=>onBlur)
<textarea
ref={areaRef}
value={input}
onChange={handleChange}
onKeyDown={handleKeyDown}
onBlur={handleBlur}
/>
对于第一个用例,我在目标上调用blur():
const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {
if (e.key === "Escape") {
console.log("Escape clicked");
setInput(inputForReset);
e.currentTarget.blur();
}
};
..但这也调用了onBlur 处理程序,我实际上想将其用于第二个用例。我试图通过 ref 确定事件调用者是否是 textarea 本身,但这不起作用:
const handleBlur = (e: React.FocusEvent<HTMLTextAreaElement>) => {
console.log("blur");
/**
* Only save to database when losing focus through clicking
* outside of the text area, not for every blur event.
*/
if (areaRef.current && !areaRef.current.contains(e.currentTarget as Node)) {
saveToDatabase();
}
};
换句话说:当用户在 textarea 完成编辑时,我想将某些内容保存到数据库中,但我不知道如何区分我以编程方式触发的 blur 事件和原生 blur 事件当您在节点外部单击时 textarea 使用的。
【问题讨论】:
-
你可以将它聚焦在其他任何地方,而不是调用模糊事件,可能在父级或任何地方
-
@Sim 我不这么认为,因为聚焦其他节点会在之前聚焦之前调用 textarea 的
onBlur处理程序:codesandbox.io/s/…
标签: javascript reactjs typescript dom-events