如何在ReactJS的渲染函数中检测类似以下输入元素当前是否处于焦点状态?
<input type="text" style={searchBoxStyle} placeholder="Search"></input>
如何在ReactJS的渲染函数中检测类似以下输入元素当前是否处于焦点状态?
<input type="text" style={searchBoxStyle} placeholder="Search"></input>
只要输入节点已经挂载并且有引用,您可以检查document.activeElement
:
const searchInput = React.useRef(null)
if (document.activeElement === searchInput.current) {
// do something
}
return <input type="text" ref={searchInput} />
另一种方法是在输入框内添加事件监听器来监听focus
和blur
事件:
const [focused, setFocused] = React.useState(false)
const onFocus = () => setFocused(true)
const onBlur = () => setFocused(false)
return <input type="text" onFocus={onFocus} onBlur={onBlur} />
请注意,每次节点聚焦或失焦时都会调用重新渲染(但这正是您想要的,对吗?)我从David给出的答案开始,他描述了两种方法,它们都对我有效,但我对两者都有疑虑:
第一种情况使用findDOMNode
,这有一些缺点:最起码它的使用是不被鼓励的,并且很容易实现成反模式;此外,它也可能使代码变慢,通过绕过虚拟DOM并直接与DOM交互。
在第二个选项中,仅为查找答案创建和管理组件状态似乎太费力了,容易失去同步,并可能导致组件不必要地重新渲染。
因此,在尝试更深入地探讨该问题后,我想出了以下解决方案:
if (this.props.id === document.activeElement.id) {
// your code goes here
}
对David回答的评论同样适用:
不应该在
render
方法中这样做,因为输入节点可能还没有挂载。使用像componentDidUpdate
或componentDidMount
这样的生命周期方法。
优点:
要求:
id
属性(大多数情况下应该是这样的)使用钩子:
首先创建并初始化您的参考文献
const yourElement = useRef(null)
然后,您使用刚创建的引用为元素打标签:
<div ref={yourElement}>Im an DOM node</div>
然后,您可以使用此逻辑来比较document.activeElement
文档属性是否等于您所引用的DOM节点。
yourElement.current === document.activeElement
import React, {useState} from "react";
const [isMyInputFocused, setIsMyInputFocused] = useState(false);
onBlur={() => setIsMyInputFocused(false)}
onFocus={() => setIsMyInputFocused(true)}
isMyInputFocused
。import React from "react";
export default function App() {
const ref = React.createRef(null);
const handleMouseOut = (currentRef) => {
if (document.activeElement === currentRef) {
console.log("Yesss");
}
};
return (
<div className="App">
<input
type="text"
ref={ref}
onMouseOut={() => handleMouseOut(ref.current)}
/>
</div>
);
}
onFocus
(React 17)或onBlur
(React 16)来实现这些内容在焦点时所需的功能。***根据@Abhishek E H的回答进行调整,如果您使用onMouseOut会有一点延迟,但使用onFocus完全没有问题。 感谢您的启发。
import React from "react";
export default function App() {
const ref = React.createRef(null);
const handleMouseOut = (currentRef) => {
if (document.activeElement === currentRef) {
console.log("Yess");
}
};
return (
<div className="App">
<input
type="text"
ref={ref}
onFocus={() => handleMouseOut(ref.current)}
/>
</div>
); }