react context学習
reactデータ転送ではpropsによるデータ転送が一般的ですが、ページ全体のすべてのコンポーネントで使用する必要があるコンテンツもあります.この場合、propsを使用して1層1層転送すると煩雑になります.この問題をどのように解決するかreactは
React.createContext
メソッドの最初のパラメータは、
Context.Provider
Class.contextType
これはcontextコンテンツを購読する方法であり、クラスの
もう1つのcontextを購読する方法は
context
コンテキストを提供してこの問題を解決します.react-reduxを使用してreact内のコンポーネント間のデータ転送を行う場合、contextは基本的に使用されません.React.createContext
const MyContext = React.createContext(defaultValue);
contextオブジェクトを作成し、react renderがcontextのコンポーネントを購読したときにProviderからcontextの値を読み込みます.メソッドの最初のパラメータは、
defaultValue
パラメータであり、コンポーネントツリーにProvider
コンポーネントが提供されていない場合にのみ使用されます.これは、undefinedをProvider値として渡すと、consumerコンポーネントがdefaultValueを使用することはありません.Context.Provider
各Contextオブジェクトには、Provider value
のプロパティが含まれています.このvalueプロパティは、contextの子孫コンポーネントを直接取得することができます(サブスクリプションには2つの方法があります).これにより、propsが深層コンポーネントに伝達される問題を回避し、contextのコンポーネントをサブスクリプションすることができます.contextの値が変化するとコンポーネントが自動的に再renderされますClass.contextType
これはcontextコンテンツを購読する方法であり、クラスの
static contextType
が以前に作成されたcontext
オブジェクトに設定され、現在のコンポーネントの各ライフサイクルでthis.context
を使用してコンテキストにアクセスするclass MyClass extends React.Component {
componentDidMount() {
let value = this.context;
/* perform a side-effect at mount using the value of MyContext */
}
componentDidUpdate() {
let value = this.context;
/* ... */
}
componentWillUnmount() {
let value = this.context;
/* ... */
}
render() {
let value = this.context;
/* render something based on the value of MyContext */
}
}
MyClass.contextType = MyContext;
public class fields syntax
を使用してもご利用いただけますclass MyClass extends React.Component {
static contextType = MyContext;
render() {
let value = this.context;
/* render something based on the value */
}
}
Context.Consumer もう1つのcontextを購読する方法は
Comsumer
コンポーネントを使用し、Consumerコンポーネントのサブコンポーネントは関数であり、この関数の最初のパラメータはcontextの値であり、関数の戻り値はreactのelementでなければならない.
{value => /* render something based on the context value */}
公式ドキュメント自分で書いたdemo