When siblings need to share state, lift it to their common parent.
Before (broken):
SearchInput (has query)
SearchResults (needs query)
After (lifted):
SearchContainer (has query)
├── SearchInput (receives query, onChange)
└── SearchResults (receives query)
When to lift:
- Sibling components need the same data
- Changes in one should reflect in another
When to stop lifting: If you're passing props through many levels, consider context or global state instead.