Hack Frontend Community

Что такое Prop Drilling и как его избежать

Prop Drilling — это ситуация, когда данные (пропсы) передаются через несколько уровней вложенных компонентов, даже если промежуточные компоненты их не используют напрямую.

Пример:

function App() {
  const user = { name: "Иван" };
  return <Parent user={user} />;
}

function Parent({ user }) {
  return <Child user={user} />;
}

function Child({ user }) {
  return <p>Привет, {user.name}!</p>;
}

Здесь Child использует user, но он передаётся через Parent, который сам его не использует — это и есть Prop Drilling.

Почему это может быть проблемой?

  • Загрязнение компонентов — промежуточные компоненты получают ненужные пропсы
  • Сложность сопровождения — при изменении данных нужно править много компонентов
  • Уменьшение повторного использования — компоненты привязываются к пропсам, которые им не нужны
  • Вероятность багов — при изменении структуры сложно отследить, где используются пропсы

Как избежать Prop Drilling?

React Context API

Контекст позволяет передавать данные на любой уровень вложенности, минуя промежуточные компоненты.

const UserContext = createContext(null);

function App() {
  const user = { name: "Иван" };

  return (
    <UserContext.Provider value={user}>
      <Parent />
    </UserContext.Provider>
  );
}

function Parent() {
  return <Child />;
}

function Child() {
  const user = useContext(UserContext);
  return <p>Привет, {user.name}!</p>;
}

Глобальное состояние (Zustand, Redux, Jotai, Recoil)

Подходит для более сложных приложений, где данных много и они нужны в разных частях.

// Zustand пример
const useUserStore = create((set) => ({
  user: { name: "Иван" },
}));

function Child() {
  const user = useUserStore((state) => state.user);
  return <p>Привет, {user.name}!</p>;
}

Композиция (render props, slots, hooks)

Иногда пропсы можно передать не напрямую, а с помощью функций или кастомных хуков, которые инкапсулируют логику.

Когда допустимо Prop Drilling:

Если передаёте 1-2 уровня глубины — это нормально. Используйте контекст или глобальное состояние только если это действительно нужно.

Вывод

  • Prop Drilling — избыточная передача пропсов по цепочке компонентов
  • Проблема появляется при глубокой вложенности
  • Избежать можно с помощью Context API, глобального состояния или композиции