id: advanced-topics-managing-focus
title: 管理焦点
在React组件中,管理文本输入焦点可能是一项棘手的任务。
浏览器的focus/blur API势在必行,因此纯粹通过render()
声明方式设置或删除焦点会感到尴尬和不正确,并且需要尝试挑战性地控制焦点状态
考虑到这一点,在Facebook我们经常选择在包装文本输入的组件上公开focus()
方法。
这打破了声明式范例,但也简化了工程师成功管理其应用程序内的焦点行为所需的工作。
Editor
组件遵循此模式,因此该组件上有一个public(公开的) focus()
方法。
这样,您就可以在更高级别的组件中使用ref来在需要时直接在组件上调用focus()
。
组件中的事件侦听器将观察焦点更改,并按预期方式通过onChange
传播它们,因此状态和DOM将正确保持同步。
转换容器点击以使编辑器聚焦
您的更高级别的组件很可能会将Editor
组件包装在某种类型的容器中,也许可以通过填充使其样式化以匹配您的应用程序。
默认情况下,如果用户在尝试让编辑器在此容器内聚焦,但却在渲染的编辑器之外点击,则该编辑器将不会触发click事件。
因此,建议您在容器组件上使用单击侦听器,并使用上述的focus()
方法将焦点应用于编辑器。
例如,纯文本编辑器示例使用此模式。