TriggerRuntimeProvider
Стабильный · с 0.1.0
React context-провайдер, инжектящий кастомный Runtime в дерево. Каждый вызов useEvent, useCondition, useAction и useInspectHistory внутри провайдера использует этот рантайм вместо глобального синглтона.
Используй его, когда нужна настоящая изоляция: параллельные тесты, микрофронтенды в одной вкладке, мульти-тенантные приложения, где у каждого тенанта свой граф триггеров.
import { TriggerRuntimeProvider } from '@triggery/react';
Сигнатура
Заголовок раздела «Сигнатура»function TriggerRuntimeProvider(props: TriggerRuntimeProviderProps): JSX.Element;
type TriggerRuntimeProviderProps = {
readonly runtime: Runtime;
readonly children: ReactNode;
};| Проп | Тип | Обязательный | Описание |
|---|---|---|---|
runtime | Runtime | да | Рантайм, который должны использовать потомки. |
children | ReactNode | да | Поддерево, получающее рантайм. |
Примеры
Заголовок раздела «Примеры»Один рантайм на корне приложения
Заголовок раздела «Один рантайм на корне приложения»import { createRuntime } from '@triggery/core';
import { TriggerRuntimeProvider } from '@triggery/react';
import { StrictMode } from 'react';
import { createRoot } from 'react-dom/client';
import { App } from './App';
const runtime = createRuntime();
createRoot(document.getElementById('root')!).render(
<StrictMode>
<TriggerRuntimeProvider runtime={runtime}>
<App />
</TriggerRuntimeProvider>
</StrictMode>,
);Изоляция на тест (Testing Library)
Заголовок раздела «Изоляция на тест (Testing Library)»import { createRuntime } from '@triggery/core';
import { TriggerRuntimeProvider } from '@triggery/react';
import { render } from '@testing-library/react';
import type { ReactNode } from 'react';
function renderWithRuntime(ui: ReactNode) {
const runtime = createRuntime();
const result = render(
<TriggerRuntimeProvider runtime={runtime}>{ui}</TriggerRuntimeProvider>,
);
return { ...result, runtime };
}Микрофронтенды по тенантам
Заголовок раздела «Микрофронтенды по тенантам»import { createRuntime, type Runtime } from '@triggery/core';
import { TriggerRuntimeProvider } from '@triggery/react';
import { useMemo, type ReactNode } from 'react';
const cache = new Map<string, Runtime>();
function getRuntime(tenantId: string) {
let rt = cache.get(tenantId);
if (!rt) {
rt = createRuntime();
cache.set(tenantId, rt);
}
return rt;
}
export function TenantBoundary({ tenantId, children }: { tenantId: string; children: ReactNode }) {
const runtime = useMemo(() => getRuntime(tenantId), [tenantId]);
return <TriggerRuntimeProvider runtime={runtime}>{children}</TriggerRuntimeProvider>;
}Вложенные провайдеры
Заголовок раздела «Вложенные провайдеры»Побеждает внутренний:
import { createRuntime } from '@triggery/core';
import { TriggerRuntimeProvider } from '@triggery/react';
import type { ReactNode } from 'react';
const outer = createRuntime();
const inner = createRuntime();
function App({ children }: { children: ReactNode }) {
return (
<TriggerRuntimeProvider runtime={outer}>
{/* Uses outer */}
<TriggerRuntimeProvider runtime={inner}>
{/* Uses inner */}
{children}
</TriggerRuntimeProvider>
</TriggerRuntimeProvider>
);
}Замечания
Заголовок раздела «Замечания»См. также
Заголовок раздела «См. также» TriggerScope Более лёгкое внутрирантаймовое разбиение по scope id.
createRuntime Сконструируй рантайм, который сюда передаёшь.
getDefaultRuntime Фоллбэк, используемый, когда провайдера нет.
Руководство по рантайму Дефолтный vs изолированный vs скоупированный — когда какой.