PassFront
  1. PassFront
  2. База знаний
  3. Компоненты

Как передавать что-либо между компонентами на одном уровне?

Компоненты

Компоненты одного уровня (соседи) не связаны напрямую — данные передаются через общего родителя или через внешние источники.

Подъём состояния (основной способ)

Состояние переносится к ближайшему общему родителю: один сосед меняет его колбэком, другой читает через props.

const Page = () => {
  const [selectedId, setSelectedId] = useState(null);
  return (
    <>
      <List onSelect={setSelectedId} />   {/* пишет */}
      <Details id={selectedId} />         {/* читает */}
    </>
  );
};

Выбирать по умолчанию: явно, дёшево, отлаживается по дереву.

Context

Если общий родитель далеко и данные «окружающие» (тема, пользователь), их кладут в Provider, соседи читают useContext. Помнить: изменение value рендерит всех потребителей.

Внешний стор

Zustand/Redux/MobX: соседи подписываются селекторами на нужные куски. Выбирать при частых обновлениях и многих потребителях.

Серверный кеш

Если «что-либо» — данные с сервера, оба соседа делают useQuery с одним queryKey: один запрос, общий кеш, синхронное обновление.

URL

Выбранный элемент, фильтры, страница отлично живут в query-параметрах: соседи читают useSearchParams. Бонус — состояние переживает перезагрузку и шарится ссылкой.

Чего не делать

Дёргать ref соседа, обмениваться через глобальный EventEmitter, вызывать чужой setState — обход однонаправленного потока, отладка становится невозможной.

Коротко для собеседования

Через общего родителя (подъём состояния: колбэк вверх, props вниз) — базовый способ. Далее по ситуации: Context для редких сквозных данных, стор с селекторами для частых, React Query для серверных, URL для навигационного состояния. Прямые связи между соседями — антипаттерн.

Другие вопросы раздела