コンテキスト

Qwikは、propsのドリルダウン問題を解決するコンテキストAPIを提供しており、Reactの関数型`useContext()`と非常によく似ています。 実際、QwikのコンテキストAPIは、さまざまなコンポーネントにデータを伝えるための最も効率的な方法であり、オーバーヘッドを削減し、コード生成量を減らし、Qwikが未使用のデータをより効果的にツリーシェイクできるようにします。

QwikのコンテキストAPIは、`@builder.io/qwik`からインポートできる3つのメソッドで構成されています。

import { type Signal, component$, useSignal } from '@builder.io/qwik';
import {
  useContext,
  useContextProvider,
  createContextId,
} from '@builder.io/qwik';
 
export const ThemeContext = createContextId<Signal<string>>(
  'docs.theme-context'
);
 
export default component$(() => {
  const theme = useSignal('dark');
  useContextProvider(ThemeContext, theme);
  return (
    <>
      <button
        onClick$={() =>
          (theme.value = theme.value == 'dark' ? 'light' : 'dark')
        }
      >
        Flip
      </button>
      <Child />
    </>
  );
});
 
const Child = component$(() => {
  const theme = useContext(ThemeContext);
  return <div>Theme is {theme.value}</div>;
});

上記の例では、`docs.theme-context`という名前の`ContextId`が作成され、`default`コンポーネントに`useSignal`を提供するために使用されています。 `Child`コンポーネントは、`useContext`メソッドを使用して`useSignal`を取得し、その値をレンダリングします。

`createContextId()`

このメソッドは、新しい`ContextId`を作成するために使用されます。

export interface GenericType {
  ...
}
 
export const QwikCityContext = createContextId<GenericType>(name: string): ContextId<GenericType>;

パラメータ

  • `name`:コンテキストの識別子として`createContextId`に与えられる一意の文字列です。 これは、複数のコンテキストがある場合の競合を回避します。 `io.builder.qwik.city`のような命名規則を使用することをお勧めします。

戻り値

`createContextId()`によって返される値は状態を保持しないことに注意してください。これは不変のIDオブジェクト、つまり`{ id: 'io.builder.qwik.city' }`です。 これは、アドレスや識別子のように、コンテキストの名前とタイプを記述するためにのみ使用されます。 状態を保持しないため、シングルトンとして初期化し、共有モジュールからエクスポートできます。

`useContextProvider()`

このメソッドは、`ContextId`をコンテキストのキー識別子として使用して、特定のコンポーネントとその子孫のコンテキストを作成するために使用されます。

src/components/Parent.tsx
import { component$, useStore, useContextProvider } from '@builder.io/qwik';
 
export const Parent = component$(() => {
 
  const qwikCityObject = useStore<GenericType>({
    ...
  });
 
  useContextProvider(QwikCityContext, qwikCityObject);
  useContextProvider(PlainArrayContext, [1, 2, 3])
  useContextProvider(AppNameContext, "My Qwik App")
 
  return (
    <Children />
  );
});

パラメータ

  • `ContextId`:以前に作成されたコンテキストを提供する必要があり、2番目のパラメータとして提供されるデータの識別子として機能します。

  • `data`:Qwikの`useSignal`、`useStore`、配列、オブジェクトなど、任意のデータ型を提供できます。

注意事項

  • 提供された値は、レンダリングツリー全体でグローバルに使用できるわけではなく、ツリー内の子孫コンポーネントに対してのみ使用できます。
  • サーバーサイドレンダリング(SSR)中にコンテキストが使用されない場合、シリアライズされません。SSR中に使用されていない場合でも、クライアントでコンテキストを使用できるようにするには、親コンポーネントで`useContext()`を呼び出す必要があります。 これにより、強制的にシリアライズされます。

`useContext()`

このメソッドは、親コンポーネントによって**提供**される`Context`の値を取得するために使用されます。

src/components/Children.tsx
import { component$, useContext } from '@builder.io/qwik';
 
export const Children = component$(() => {
  const qwikCityObject = useContext(QwikCityContext);
  const plainArray = useContext(PlainArrayContext);
  const appName = useContext(AppNameContext);
 
  return (
    <div>Child components can use any of the provided values, such as {appName}</div>
  );
});

貢献者

このドキュメントの改善にご協力いただいたすべての貢献者に感謝します!

  • manucorporat
  • RATIU5
  • nnelgxorz
  • adamdbradley
  • the-r3aper7
  • cunzaizhuyi
  • forresst
  • kerbelp
  • shairez
  • mhevery
  • AnthonyPAlicea
  • steve8708
  • mrhoodz
  • Jemsco