焦点与输入
焦点决定键盘输入落到哪个组件。输入体系负责处理普通键入、中文组合输入、粘贴和文本编辑会话。
焦点管理
FocusManager 管理当前焦点对象。可输入或可键盘操作的组件需要正确注册和释放焦点能力。
常见可聚焦组件:
RenderTextBoxRenderTextAreaRenderComboBoxRenderDatePickerRenderTreeViewRenderDataGridRenderPlainTextEditorRenderMedicalRecordEditor
文本输入
文本输入通常通过隐藏输入承接浏览器输入能力,再由组件把输入结果应用到自己的模型。
需要特别处理:
- 中文 composition update。
- composition end。
- 粘贴。
- Enter、Escape、Tab。
- 光标位置同步。
- 选区替换输入。
中文输入
中文输入过程中,composition update 应能实时更新预编辑内容,但不能破坏最终提交逻辑。composition end 时再把最终文本提交到模型。
组件应避免把超大文本长时间保留在隐藏输入中。粘贴大文本时,应优先读取剪贴板事件数据,处理后清空输入承接元素。
焦点丢失
组件在失去焦点时通常需要:
- 结束编辑状态。
- 提交或取消临时值。
- 隐藏光标。
- 关闭不应继续存在的弹窗。
- 清理 composition 状态。
但不是所有 Enter 或 Escape 都应该导致 blur。是否失焦应由组件语义决定。
性能原则
- 光标闪烁只应触发必要重绘。
- 焦点切换不应触发布局全量刷新。
- 大文本编辑器不能每次输入都把全文同步到浏览器 textarea。
- 组合输入和粘贴路径要避免全量扫描大文档。