Reactではコンポーネントごとにstateを管理することになりますが、同じ値を複数のコンポーネントで使いたい時があります。
親要素と子要素
Reactのコンポーネントは、HTML要素と同じようにタグでラップすることができます。ラップされた要素は子要素とよばれ、childrenとして親要素に渡されます。ここで、親要素で管理している値や関数をpropsとして子要素に渡すことができるんですが、コンポーネントを細分化すると、孫要素やひ孫要素、兄弟要素など、要素が複雑になり、親の管理する値や関数を使いたいコンポーネント全てにpropsを渡さなければいけません。
ここで登場するのがuseContextというhookです。
createContextとuseContext
親→子→孫という流れでpropsを渡していくことを「propsのバケツリレー」というそうです。それを防ぐために、どのコンポーネントからも呼び出せる値を作成するのがcreateContextで、コンポーネント側で呼び出すのに使うのがuseContextです。
const SomeContext = createContext(defaultValue);
const Example = () => {
return (
<SomeContext.Provider value={value}>
<Child />
</SomeContext.Provider>
}
const Child = () => {
const some = useContext(SomeContext);
return (
<div>{some}</div>
);
}
こんな感じです。(コンポーネントを別ファイルに分けるときは、SomeContextをインポートする必要があります)
createContextで作られたProviderでラップされた全ての子要素で、contextを使用できます。値を変更したい場合はuseStateで設定した値を用いればOK。ただ、useReducerで値と更新用関数を設定する方がいいと思います。(useReducerについては、また今度まとめてみようと思います。
コメント