Link IDs and ARIA Attributes Across Templates

DEX475 - Component Accessibility

📄 第 222 页 🎬 视频课程

课程章节介绍

今天我们来聊一个在实际开发中经常会遇到的小问题,就是跨模板的ID和ARIA链接,在影子多姆里怎么处理。 你可以把影子多姆想象成一个独立的小宇宙,每个组件都有自己的影子树。在这个小宇宙里面,ID就像门牌号,是唯一的,组件内部用起来完全没问题。比如你在同一个模板里,给一个输入框设个 id="email",另一个标签用 aria-labelledby="email" 来关联它,这很正常,完全可行。 但是问题来了:如果这两个元素分别属于不同的组件,也就是在不同的模板里,它们就各住在自己的影子树里,门牌号都只在自己的小宇宙里有效。所以,你从组件 A 的影子树里想用 aria-labelledby 引用组件 B 里的 id,原生影子多姆会直接把它拦住,找不到对方。因为每个影子树都有自己的 ID 命名空间,它不允许跨过自己的边界去引用的。 那怎么解决呢?老师教你一个实用的办法:用轻型多姆。轻型多姆的意思就是,把这些需要互相引用的元素,放到同一个“阳光”下——让它们都成为同一个影子多姆容器的轻型子节点。这样一来,它们虽然来自不同组件,但共享同一个影子根,ID 就可以互相看见了。比如你把引用元素和被引用元素通过 slot 或者直接放在同一个容器的轻型多姆里,那么一个组件的 aria-labelledby 就可以顺利指向另一个组件的 id。 当然,如果你们团队的架构硬性要求只能用影子多姆,不想混合轻型多姆,那也有替代方案。要么把这些相关元素干脆放在同一个组件内部,别跨组件了;要么更灵活一点,通过 API 把 ARIA 的标签字符串传过去,而不是依赖跨组件的 ID 引用。这样就能绕开影子多姆的限制。 换句话说,就是遇到跨组件关联辅助功能属性时,优先考虑把元素放到同一个“光”下,或者用属性传递的方式来解决。这样既简单又符合标准。 好,我们总结一下要点:影子多姆让 ID 私有化,所以直接跨组件用 aria-labelledby 会失效;轻型多姆可以打破隔离,让不同组件的元素共享 ID 空间;或者把元素合并到同一组件,或者用 API 传标签字符串来代替跨组件引用。你记住了吗?

关键词

LWC Lightning Web Components Salesforce