reactjs - (React) 组件更新时如何将焦点放在第一个元素上?
问题描述
我在反应中有以下代码。在ParentComponent
中,我根据是否满足某些条件来渲染第一个或第二个面板。假设FirstPanel
是渲染的。在里面FirstPanel
,我可以进行一些交互来更新面板,我需要将焦点转到第一个面板中的第一个元素(也就是第一个 div 元素)我该怎么做?我尝试使用this.props.setRef.focus()
但它不起作用。
父组件
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;
}
第一面板
componentDidUpdate() {
// put focus on component FirstPanel again
}
render() {
return <div role="tabpanel" tabIndex="0" ref={this.props.setRef}>
{children}
</div>
}
解决方案
根据您的ParentComponent
实现,当状态更改时,FirstPanel
将卸载,然后SecondPanel
安装。
当您再次切换时,SecondPanel
卸载和FirstPanel
安装。
要实现您所追求的,只需在生命周期componentDidUpdate
和componentDidMount
生命周期中进行焦点操作。
此外,如果您ParentComponent
不打算使用currentPanel
,您可以creatRef
在每个 Panel 组件中。您setRef
目前只是一个函数,而不是包含对 dom 元素的引用的 Ref 对象。
推荐阅读
- android - 如何修复“UnsupportedOperationException:AdapterView 不支持 addView(View, LayoutParams)”
- python - python中heapq.merge的时间复杂度是多少?
- android - 如何在本机反应中在文本输入中显示选定的日期和时间
- c# - 从 .Net 中的 Npgqsql 迁移到 .Net Core 1.1 的建议
- vue.js - 为什么当布尔值更改时 v-if 不显示标题?
- html - 如何使“适合内容”跨浏览器工作?
- c# - 如何选择多个文件 C# UWP?
- dialogflow-es - Botium 对话流代理无法正确识别
- vue.js - 为什么 vue CSS 优先级规则不起作用?
- php - 如何设置 wordpress the_title 的最大长度?