動くやつ
注意
実験的なAPIの話なので、今後以下に書いてあることが意味をなさなくなる可能性があります。
Context
コンポーネントに何かしらのデータを渡したい時は、通常props
を使います。しかし、特定のコンポーネントの子孫コンポーネントで共通して参照したいようなデータがある時は、子孫のコンポーネントにprops
を通じて延々とバケツリレーをしなければなりません。グローバルで参照できるストアのようなオブジェクトがある場合はそれを直接参照することもできますが、Viewのコンポーネントとしての独立性を高めようと思うと、React
と関係ないグローバルなオブジェクトへの依存は極力持たせたくないところです。
そこでcontext
です。
https://facebook.github.io/react/docs/context.html
context
は、Componentのツリーにおいて自分の子孫となるコンポーネントに自動的に渡されるデータです。
データはオブジェクト形式なので、コンポーネントからthis.context.userId
のようにアクセスすることができます。
childContextTypes
コンポーネントに渡したい値のタイプPropTypes
を使って定義します。文字列を渡したければPropTypes.string
、数値を渡したければPropTypes.number
となります。
getChildContext()
渡したいデータをオブジェクト形式でreturn
する関数です。関数内からはthis.props
を見れるので、自分自身に渡されたprops
の値に依存した値を返すことも可能です。
contextTypes
context
を使いたいコンポーネントで、自分が使いたい値を定義します。ここに定義がないと、参照しても値はundefined
となります。
値の上書き
ツリーの途中で、childContextTypes
とgetChildContext
があるコンポーネントがあると、それより子孫の位置にあるコンポーネントのcontext
は上書きマージされます。
コンポーネントAのchildContextTypes
が
{
theme: PropTypes.string,
userId: PropTypes.number
}
Aの子孫であるコンポーネントBのchildContextTypes
が
{
theme: PropTypes.string
}
Bの子孫であるコンポーネントCのcontextTypes
が
{
theme: PropTypes.string,
userId: PropTypes.number
}
の場合、コンポーネントCのcontext
は、theme
はコンポーネントBで定義された値、userId
はコンポーネントAで定義された値となリます。
まとめ
Context is an advanced and experimental feature. The API is likely to change in future releases.
将来変わりうる可能性があるので、ユーザへのインパクトが大きいところでは使わないほうが良いかもしれん。使いどころとしては、共通化されたUIコンポーネントにどんな
やどこで
といった情報を渡す、というのは一例でありそうです。