## Summary
Keyboard navigation in Element Plus's El-Tree component failed because **native tree accessibility features were bypassed** through improper focus management and use of nonexistent APIs (`expandNode`/`collapseNode`). This caused **keyboard interactions to break**, forcing manual reimplementation attempts that conflicted with internal component behavior.
## Root Cause
- **Missing native El-Tree focus handling**: Wrapping `` in a custom focusable `` **overrode the component's built-in keyboard management**.
- **Use of unsupported methods**: Attempting to call `expandNode()`/`collapseNode()` which **don't exist in Element Plus API**, leading to runtime failures.
- **Node expansion/collapse handled incorrectly**: Descendant nodes were pre-rendered, causing **conflict with Vue's reactive DOM updates**.
- **Focus leakage**: Checkbox inputs were **autofocused** separately from the tree navigation, creating dual focus points.
## Why This Happens in Real Systems
- **Third-party component opacity**: Engineers assume components manage accessibility intrinsically, but **keyboard behavior isn't always enabled by default**.
- **Version discrepancies**: Docs/demos use latest versions, while **production installations lag**, hiding breaking changes.
- **Accessibility as an afterthought**: Keyboard support is often tacked on late via patches instead of being core.
- **Vanishing method traps**: Framework-specific APIs (e.g., Vue 2 Options API → Vue 3 Composition API) leave **undocumented method graves**.
## Real-World Impact
- **Blocked assistive technology users**: Screen readers/keyboard-only navigation becomes unusable.
- **Unchecked regressions**: Component appears functional during mouse testing but **fails accessibility audits**.
- **Increased debugging time**: Engineers waste cycles reverse-engineering library internals.
- **Fragile state management**: Manual DOM focus/text-content tracking creates race conditions.
## Example or Code (if necessary and relevant)
```javascript
// CORRECTED KEYBOARD HANDLER USING OFFICIAL APIs
onKeydown(e) {
const tree = this.$refs.treeRef;
const currentNode = tree.getCurrentNode();
if (e.key === 'ArrowRight' && currentNode) {
tree.updateKeyChildren(currentNode.id, !tree.getNode(currentNode.id).expanded);
} else if (e.key === 'ArrowLeft' && currentNode) {
tree.updateKeyChildren(currentNode.id, false);
}
}
How Senior Engineers Fix It
- Audit component APIs: Verifyнего available methods through
console.log(treeRef) instead of relying solely on docs.
- Leverage built-in focus control: Remove wrapper
<div> and pass focusable={true} to <el-tree>. If wrapping is necessary, use ref forwarding.
- Use official expansion methods: Replace
expandNode() with treeRef.store.nodesMap[nodeKey].expand() and equivalent collapse logic.
- Decouple focus from checkboxes: Disable automatic focusing on inputs via El-Tree’s
focus-on-click={false} prop.
- Implement tree virtualization: For large datasets, use
use-memo for visible nodes to prevent rendering penalties.
Why Juniors Miss It
- Documentation tunnel vision: Assuming demo code works verbatim without version checks or API audits.
- Missing framework internals: Unaware that Vue 3 components auto-register focus handlers on root elements.
- Over-reliance on stack snippets: Copy-pasting code without verifying method existence in current dependencies.
- Accessibility blind spots: Focusing on visual functionality first, treating keyboard support as secondary.
- Debugging surface area neglect: Not inspecting component internals via
$refs during development.