面试题答案
一键面试实现思路
- ARIA 角色和属性:
- 对于动态更新的列表,使用
role="list"
来标识列表容器,列表项使用role="listitem"
。这样屏幕阅读器等辅助技术就能正确识别其结构。 - 当新数据到来增加列表项时,通过添加
aria - live
属性到列表容器来通知屏幕阅读器有新内容添加。aria - live
的值可以设为"polite"
(适用于不打断用户操作的更新)或"assertive"
(用于需要用户立即注意的更新)。例如:<ul role="list" aria - live="polite">...</ul>
。
- 对于动态更新的列表,使用
- 焦点管理:
- 如果列表更新后需要将焦点移动到新添加的项上,以确保用户能及时关注到。可以使用 React 的
useRef
来获取 DOM 元素引用,然后通过element.focus()
方法将焦点移到特定元素。例如,为新添加的列表项设置ref
,然后在数据更新后调用ref.current.focus()
。 - 同时,要确保焦点移动的操作不会干扰用户正常的浏览流程,比如在用户正在输入时避免意外的焦点转移。
- 如果列表更新后需要将焦点移动到新添加的项上,以确保用户能及时关注到。可以使用 React 的
- 语义化 HTML:
- 尽量使用语义化的 HTML 标签,如
<ul>
和<li>
来构建列表,而不是用<div>
模拟。这有助于辅助技术更好地理解页面结构。
- 尽量使用语义化的 HTML 标签,如
- 测试:
- 使用屏幕阅读器(如 JAWS、NVDA 等)进行实际测试,模拟不同用户场景,检查动态更新时无障碍访问是否正常。确保新内容能被正确宣布,焦点移动符合预期,以及页面整体结构在更新后依然可访问。
可能用到的技术点
- React Hooks:
useState
用于管理组件的状态,比如列表数据。当新数据到来时,通过setState
方法更新列表状态,触发组件重新渲染,从而展示新的列表项。useRef
用于获取 DOM 元素引用,以便进行焦点管理等操作。
- 事件处理:
- 监听用户交互事件,如按钮点击、输入框变化等,这些事件可能触发数据更新。例如,一个“添加”按钮的点击事件可以触发新数据的添加逻辑。
- 无障碍库:
- 一些第三方无障碍库,如
react - aria
,可以提供更便捷的方式来处理 ARIA 相关的功能,简化代码编写,同时确保最佳实践。
- 一些第三方无障碍库,如