我在反应中有以下代码。
在ParentComponent
中,我根据是否满足某些条件来渲染第一或第二面板。假设FirstPanel
被渲染。
在FirstPanel
内,我能够进行一些交互操作以更新面板,并且我需要将焦点转到第一个面板中的第一个元素(又称第一个div元素)
我怎样才能做到这一点?我尝试使用this.props.setRef.focus()
,但不起作用。
ParentComponent
setCurrentPanel(panel) {
this.currentPanel = panel;
}
render() {
if (this.state.showFirstPanel)
return <FirstPanel setRef={this.setCurrentPanel} />;
if (this.state.showSecondPanel)
return <SecondPanel setRef={this.setCurrentPanel} />;
return undefined;
}
FirstPanel
componentDidUpdate() {
// put focus on component FirstPanel again
}
render() {
return <div role="tabpanel" tabIndex="0" ref={this.props.setRef}>
{children}
</div>
}
答案 0 :(得分:0)
根据您的ParentComponent
实现,当状态更改时,FirstPanel
将卸载,然后SecondPanel
装载。
再次切换时,SecondPanel
卸载,FirstPanel
装载。
要实现目标,只需在componentDidUpdate
和componentDidMount
生命周期中进行焦点操作即可。
此外,如果ParentComponent
对currentPanel
不起作用,则可以在每个Panel组件中creatRef
。目前,您的setRef
只是一个函数,而不是包含对dom元素的引用的Ref对象。
答案 1 :(得分:0)
使用useRef和useEffect可以做到这一点:
import React , {useRef, useEffect, useState} from 'react';
const MyComponent = () => {
const [valueThatWillChange, setValueWillChange] = useState(null);
const ref = useRef(null);
useEffect(() => {
ref.current.focus();
}, [valueThatWillChange]);
return (
<div>
<input type="text" ref={ref} />
<input type="text" onBlur={e => setValueThatWillChange(e.target.value)} />
</div>
);
};
每次光标从第二个输入移出时,他将返回第一个输入