Skip to content

Контекст

Простыми словами

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

Контекст передаёт значения вниз по дереву, не протаскивая их через каждый пропс. В Continuum он живёт на дереве владения: provide пишет в текущего владельца, use ищет вверх по предкам.

tsx
import { createContext, provide, use } from "@continuum-js/dom";

const Theme = createContext("light"); // значение по умолчанию

function App() {
  provide(Theme, "dark"); // запись в текущего владельца
  return <Toolbar />;
}

function Toolbar() {
  const theme = use(Theme); // ближайшее предоставленное значение
  return <div class={theme}>…</div>;
}

Обёртки <Provider> нет — предоставление это оператор, а не структура. provide внутри поддерева dyn/Show/Each ограничен этим поддеревом и исчезает вместе с ним.

Реактивный контекст

Само значение контекста — обычное (ищется один раз, при построении). Для меняющегося значения кладите в контекст State:

tsx
const Theme = createContext<State<string>>(constant("light"));

function App() {
  const theme = state("dark");
  provide(Theme, theme);
  return <Toolbar />;
}

function Toolbar() {
  return <div class={use(Theme)}>…</div>; // живая привязка
}

«Ре-рендера по смене контекста» не существует и не нужно: потребители привязываются к State один раз.

Практическое правило

use читает контекст места, где он вызван — зовите его в теле компонента (при построении), а не в обработчиках событий или асинхронных колбэках.

Роутер построен ровно на этом механизме: <Outlet> и useParams() читают RouterContext с цепочкой совпадений и текущей глубиной — см. Роутинг.


Незнакомый термин? Вся терминология этой документации объяснена в глоссарии.