コンテキスト
React
において、親コンポーネントから子コンポーネントにデータを渡す場合、props
オブジェクトを使用してデータを渡す.ただし、データが必要なサブコンポーネントの数が多い場合は、同じコードを繰り返し入力する必要があります.重複構造がある場合、中間コンポーネントは、データを必要とせずにサブコンポーネントにデータを渡す義務があります.
この場合,コンテキスト(Context)を用いることで処理効率を向上させることができる.
コンテキストが必要です。
必要なコンテキストから簡単な例を次に示します.
App
コンポーネントでは、props
オブジェクトを使用してユーザ情報がサブコンポーネントに伝達され、UserViewer
コンポーネントでこのデータを使用してレンダリングされる簡単な例である.UserWrap
要素はユーザ情報を必要としないので、props
をサブ要素に戻すことが分かる.
データを使用する構成部品が下にある場合、中間の構成部品は意味なくデータのみを伝達し、構成部品ツリーが複雑であるほど問題が大きくなります.
では、コンテキスト修正コードを使用する前に、API
からどのように使用するかを確認します.
コンテキストAPI
React.createContext(defaultValue)
ex) const ColorContext = React.createContext('red')
コンテキストオブジェクトを作成する方法.
生成されたコンテキストオブジェクトは、データの変更および検出に使用できるProvider
コンポーネントおよびConsumer
コンポーネントを有する.
パラメータとして渡されるdefaultValue
の場合、サブスクリプションコンテキストのコンポーネントに適切なProvider
が見つからない場合、デフォルトではこの値が使用されます.
Context.Provider
ex) <ColorContext.Provider value="blue" >
...ManyComponent
</ColorContext.Provider>
<Context.Priveder>
コンポーネントは、コンテキストを購読しているサブコンポーネントのコンテキストの変化を通知するコンポーネントである.value prop
を使用して渡されたデータは、コンテキストを購読するすべてのコンポーネントに対してグローバルデータである.
したがって、伝達可能な要素の数に制限されずに伝達することができる.
Class.contextType
ex)class AnyClass extends React.Component {
render() {
return <h1>Color is {this.context}</h1>
}
}
AnyClass.contextType = ColorContext;
クラス構成部品のProvider
パーセントを使用して、構成部品をコンテキストに購読できます.
一致するコンテキストのうち最も近いcontextType
のProvider
を優先的に転送し、value prop
を使用して要素内部にデータをインポートする.
欠点は、クラスコンポーネントにのみアクセスでき、this.context
はパーセントを使用して1つのコンテキストしか購読できないことです.
Context.Consumer
ex)class AnyClass extends React.Component {
render() {
return (
<ColorContext.Consumer>
{color => <h1>Color is {color}</h1>}
</ColorContext.Consumer>
);
}
}
上記のcontextType
と同様に、これはコンテキストを購読する方法の1つです.
違いは、Class.contextType
コンポーネントが関数コンポーネントでコンテキストを購読し、1つのコンポーネントで複数のコンテキストを購読することを可能にすることである.
次に、Context.Consumer
要素のサブアイテムは関数形式でなければならないことに注意してください.
整理する
上記のContext.Consumer
およびClass.contextType
を使用してコンテキストを購読する構成部品は、Context.Consumer
と呼ばれ、consumer
にあるすべての子Provider
は、親構成部品が再レンダリングされるかどうかにかかわらず、consumer
のProvider
で変更されると、value prop
度が再レンダリングされます.
これにより、コンテキストを必要としない構成部品が更新されず、パフォーマンスの最適化が実現されます.
また、コンテキストを使用するとコンポーネントの再利用性が低下するため、コンテキストを使用するたびに、コンポーネントを合成することでこの問題を解決できるかどうかをまず考慮します.
ここでは基本的なコンテキストAPIの使用方法です.では、コンテキストを直接使用しましょう.
既存のコードの変更
上で使用したコードをコンテキストを使用するコードとして再記述します.
使用コンテキストとは異なり、consumer
コンポーネントはデータを一切伝達せず、UserWrap
コンポーネントおよびUserViewer
コンポーネントを使用してProvider
コンポーネントからConsumer
コンポーネントに直接データを伝達することが分かる.
次に、ネストされたコンテキストとstateドラッグ&ドロップを使用して、より複雑な例を作成します.
UserContext.js
コンテキストオブジェクトを外部のモジュールにエクスポートします.
index.js
App
のファイルになります.UserViewer
に変更されたentry point
関数は、state
要素のchangeUserName()
に変換され、setUserContext.Provider
からvalue prop
に変換されたstate.name
が重畳され、value prop
にデータが伝達される.UserContext.Provider
要素のすべてのサブ要素は、consumer
を介してUserWrap
のconsumer
にアクセスできるようになった.
User.js
App
要素において、state
のUserForm
はsetUserContext
のsetter
方法であり、App
のchangeUserName()
はUserContext
のname
方法である.
整理後、App
のstate.name
ユニットが変更されると、イベントハンドラUserForm
が呼び出され、親コンポーネントinput
のsetter
が変更される.
これにより、App
のstate
が変化し、UserContext.Provider
の構成部品が再レンダリングされ、value prop
によって渡されたconsumer
の値を使用して再レンダリングされます.
では、正常に動作しているかどうか見てみましょう.
意図通りに行動するのが見えます.
コンテキストの使用上の注意点 UserContext.Consumer
素子のname
と従来のContext.Provider
との差異を参照に比較した.
したがって、下図に示すように、value prop
で新しいオブジェクトを作成して渡すと、以前のオブジェクトと区別がないと思っていても、参照値が異なるためにvalue
が変化し、サブアセンブリに不要なレンダリングが生じたと考えられます.class MyComponent extends React.Component {
render() {
return (
<Context.Provider value={{ name : 'default' }}>
...ManyComponent
</Context.Provider>
);
}
}
これを回避するために、オブジェクトをvalue prop
に渡す場合は、次のvalue
を使用してオブジェクトの参照値を渡します.class MyComponent extends React.Component {
consturctor(props) {
super(props);
this.state = {
user : { name : 'default' }
};
}
render() {
return (
<Context.Provider value={this.state.user}>
...ManyComponent
</Context.Provider>
);
}
}
参考資料
Context - Reacthttps://ko.reactjs.org/docs/context.html
Reference
この問題について(コンテキスト), 我々は、より多くの情報をここで見つけました
https://velog.io/@jaeung5169/컨텍스트Context
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
React.createContext(defaultValue)
ex)
const ColorContext = React.createContext('red')
コンテキストオブジェクトを作成する方法.生成されたコンテキストオブジェクトは、データの変更および検出に使用できる
Provider
コンポーネントおよびConsumer
コンポーネントを有する.パラメータとして渡される
defaultValue
の場合、サブスクリプションコンテキストのコンポーネントに適切なProvider
が見つからない場合、デフォルトではこの値が使用されます.Context.Provider
ex)
<ColorContext.Provider value="blue" >
...ManyComponent
</ColorContext.Provider>
<Context.Priveder>
コンポーネントは、コンテキストを購読しているサブコンポーネントのコンテキストの変化を通知するコンポーネントである.value prop
を使用して渡されたデータは、コンテキストを購読するすべてのコンポーネントに対してグローバルデータである.したがって、伝達可能な要素の数に制限されずに伝達することができる.
Class.contextType
ex)
class AnyClass extends React.Component {
render() {
return <h1>Color is {this.context}</h1>
}
}
AnyClass.contextType = ColorContext;
クラス構成部品のProvider
パーセントを使用して、構成部品をコンテキストに購読できます.一致するコンテキストのうち最も近い
contextType
のProvider
を優先的に転送し、value prop
を使用して要素内部にデータをインポートする.欠点は、クラスコンポーネントにのみアクセスでき、
this.context
はパーセントを使用して1つのコンテキストしか購読できないことです.Context.Consumer
ex)
class AnyClass extends React.Component {
render() {
return (
<ColorContext.Consumer>
{color => <h1>Color is {color}</h1>}
</ColorContext.Consumer>
);
}
}
上記のcontextType
と同様に、これはコンテキストを購読する方法の1つです.違いは、
Class.contextType
コンポーネントが関数コンポーネントでコンテキストを購読し、1つのコンポーネントで複数のコンテキストを購読することを可能にすることである.次に、
Context.Consumer
要素のサブアイテムは関数形式でなければならないことに注意してください.整理する
上記の
Context.Consumer
およびClass.contextType
を使用してコンテキストを購読する構成部品は、Context.Consumer
と呼ばれ、consumer
にあるすべての子Provider
は、親構成部品が再レンダリングされるかどうかにかかわらず、consumer
のProvider
で変更されると、value prop
度が再レンダリングされます.これにより、コンテキストを必要としない構成部品が更新されず、パフォーマンスの最適化が実現されます.
また、コンテキストを使用するとコンポーネントの再利用性が低下するため、コンテキストを使用するたびに、コンポーネントを合成することでこの問題を解決できるかどうかをまず考慮します.
ここでは基本的なコンテキストAPIの使用方法です.では、コンテキストを直接使用しましょう.
既存のコードの変更
上で使用したコードをコンテキストを使用するコードとして再記述します.
使用コンテキストとは異なり、consumer
コンポーネントはデータを一切伝達せず、UserWrap
コンポーネントおよびUserViewer
コンポーネントを使用してProvider
コンポーネントからConsumer
コンポーネントに直接データを伝達することが分かる.
次に、ネストされたコンテキストとstateドラッグ&ドロップを使用して、より複雑な例を作成します.
UserContext.js
コンテキストオブジェクトを外部のモジュールにエクスポートします.
index.js
App
のファイルになります.UserViewer
に変更されたentry point
関数は、state
要素のchangeUserName()
に変換され、setUserContext.Provider
からvalue prop
に変換されたstate.name
が重畳され、value prop
にデータが伝達される.UserContext.Provider
要素のすべてのサブ要素は、consumer
を介してUserWrap
のconsumer
にアクセスできるようになった.
User.js
App
要素において、state
のUserForm
はsetUserContext
のsetter
方法であり、App
のchangeUserName()
はUserContext
のname
方法である.
整理後、App
のstate.name
ユニットが変更されると、イベントハンドラUserForm
が呼び出され、親コンポーネントinput
のsetter
が変更される.
これにより、App
のstate
が変化し、UserContext.Provider
の構成部品が再レンダリングされ、value prop
によって渡されたconsumer
の値を使用して再レンダリングされます.
では、正常に動作しているかどうか見てみましょう.
意図通りに行動するのが見えます.
コンテキストの使用上の注意点 UserContext.Consumer
素子のname
と従来のContext.Provider
との差異を参照に比較した.
したがって、下図に示すように、value prop
で新しいオブジェクトを作成して渡すと、以前のオブジェクトと区別がないと思っていても、参照値が異なるためにvalue
が変化し、サブアセンブリに不要なレンダリングが生じたと考えられます.class MyComponent extends React.Component {
render() {
return (
<Context.Provider value={{ name : 'default' }}>
...ManyComponent
</Context.Provider>
);
}
}
これを回避するために、オブジェクトをvalue prop
に渡す場合は、次のvalue
を使用してオブジェクトの参照値を渡します.class MyComponent extends React.Component {
consturctor(props) {
super(props);
this.state = {
user : { name : 'default' }
};
}
render() {
return (
<Context.Provider value={this.state.user}>
...ManyComponent
</Context.Provider>
);
}
}
参考資料
Context - Reacthttps://ko.reactjs.org/docs/context.html
Reference
この問題について(コンテキスト), 我々は、より多くの情報をここで見つけました
https://velog.io/@jaeung5169/컨텍스트Context
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
UserContext.Consumer
素子のname
と従来のContext.Provider
との差異を参照に比較した.したがって、下図に示すように、
value prop
で新しいオブジェクトを作成して渡すと、以前のオブジェクトと区別がないと思っていても、参照値が異なるためにvalue
が変化し、サブアセンブリに不要なレンダリングが生じたと考えられます.class MyComponent extends React.Component {
render() {
return (
<Context.Provider value={{ name : 'default' }}>
...ManyComponent
</Context.Provider>
);
}
}
これを回避するために、オブジェクトをvalue prop
に渡す場合は、次のvalue
を使用してオブジェクトの参照値を渡します.class MyComponent extends React.Component {
consturctor(props) {
super(props);
this.state = {
user : { name : 'default' }
};
}
render() {
return (
<Context.Provider value={this.state.user}>
...ManyComponent
</Context.Provider>
);
}
}
参考資料Context - Reacthttps://ko.reactjs.org/docs/context.html
Reference
この問題について(コンテキスト), 我々は、より多くの情報をここで見つけました https://velog.io/@jaeung5169/컨텍스트Contextテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol