Що таке prop drilling і як його уникнути
Prop Drilling — це ситуація, коли дані (пропси) передаються через кілька рівнів вкладених компонентів, навіть якщо проміжні компоненти не використовують їх безпосередньо.
Приклад:
function App() {
const user = { name: "John" };
return <Parent user={user} />;
}
function Parent({ user }) {
return <Child user={user} />;
}
function Child({ user }) {
return <p>Hello, {user.name}!</p>;
}Тут Child використовує user, але він передається через Parent, який сам його не використовує — це є Prop Drilling.
Чому це може бути проблемою?
- Забруднення компонентів — проміжні компоненти отримують непотрібні пропси
- Складність обслуговування — при зміні даних потрібно виправляти багато компонентів
- Знижена повторна використуваність — компоненти прив'язані до пропсів, які їм не потрібні
- Імовірність помилок — при зміні структури важко відстежити, де використовуються пропси
Як уникнути Prop Drilling?
React Context API
Контекст дозволяє передавати дані на будь-який рівень вкладеності, обходячи проміжні компоненти.
const UserContext = createContext(null);
function App() {
const user = { name: "John" };
return (
<UserContext.Provider value={user}>
<Parent />
</UserContext.Provider>
);
}
function Parent() {
return <Child />;
}
function Child() {
const user = useContext(UserContext);
return <p>Hello, {user.name}!</p>;
}Глобальний стан (Zustand, Redux, Jotai, Recoil)
Підходить для більш складних додатків з великою кількістю даних, які потрібні в різних частинах.
// Приклад Zustand
const useUserStore = create((set) => ({
user: { name: "John" },
}));
function Child() {
const user = useUserStore((state) => state.user);
return <p>Hello, {user.name}!</p>;
}Композиція (render props, slots, hooks)
Іноді пропси можуть передаватися не безпосередньо, а за допомогою функцій або кастомних хуків, які інкапсулюють логіку.
Коли Prop Drilling є прийнятним:
Якщо передавати на 1-2 рівні вглиб — це нормально. Використовуйте контекст або глобальний стан тільки якщо це дійсно потрібно.
Висновок
- Prop Drilling — надмірна передача пропсів через ланцюг компонентів
- Проблема виникає при глибокій вкладеності
- Можна уникнути за допомогою Context API, глобального стану або композиції
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.