React16—— Context API
2869 ワード
背景紹介
以下のコンポーネント構造があり、DコンポーネントのみがAコンポーネント内のデータを使用すると仮定すると、propsを多くの層に渡す必要があり、書くのが煩雑であるだけでなく、真ん中に挟まれたコンポーネントに不要なpropsを導入する必要がある.
Context APIはこのような問題を解決するのに役立ち、多くの流行フレームワーク(例えばredux、mobxなど)が使用されています.しかしReact 16.3.0までは公式にはお勧めしていません.この記事では、旧版Contextを使用すると発生する問題と解決策について説明します.
しかしReact 16.3.0はより効率的で安定したContext APIを発表した.
Context API
Context APIは主に以下の部分から構成される. React.createContext:ProviderとConsumerという2つの属性を持つコンポーネント を含むContextオブジェクトを作成します. Providerコンポーネント:context値を使用する必要があるサブコンポーネントにvalueプロパティを受け入れ、valueプロパティの値は任意のJSのデータ型 であってもよい Consumer ≪コンポーネント|Components|emdw≫:Providerコンポーネントの内部の任意のレベルで使用できます.サブ要素は、Providerコンポーネントが提供するvalueに等しいパラメータであり、戻り値はReactノードの関数 です.
簡単な栗を挙げます. Class.contextType:作成したContextオブジェクトをclassのcontextTypeプロパティに割り当てることで、classコンポーネント内でthis.contextを使用してContext(関数コンポーネントではサポートされていません)を使用し、上記の例のappコンポーネントを変更できます:
またはbabelプラグインを使用してstaticを使用してcontextTypeを初期化します.
注:Providerコンポーネントのvalue値がオブジェクトの場合、Providerが再レンダリングされるたびに、valueプロパティが常に新しいオブジェクトに割り当てられているため、下のすべてのconsumersコンポーネントが再レンダリングされます.valueの値をstateに上げることで、このような状況を防ぐことができます.
コードの例:https://github.com/MirrorHuang/react16-demo
参照先:https://reactjs.org/
以下のコンポーネント構造があり、DコンポーネントのみがAコンポーネント内のデータを使用すると仮定すると、propsを多くの層に渡す必要があり、書くのが煩雑であるだけでなく、真ん中に挟まれたコンポーネントに不要なpropsを導入する必要がある.
Context APIはこのような問題を解決するのに役立ち、多くの流行フレームワーク(例えばredux、mobxなど)が使用されています.しかしReact 16.3.0までは公式にはお勧めしていません.この記事では、旧版Contextを使用すると発生する問題と解決策について説明します.
しかしReact 16.3.0はより効率的で安定したContext APIを発表した.
Context API
Context APIは主に以下の部分から構成される.
const MyContext = React.createContext(defaultValue);
{value => /* context */}
簡単な栗を挙げます.
// context.js
import { createContext } from 'react';
const defaultVal = 'defaultVal'
export default createContext(defaultVal);
// app component
import MyContext from './context';
class App extends React.Component {
render() {
return (
Context
);
}
}
// tab component
const Tab = () => (
);
// list component
import MyContext from './context';
const List = props => (
{
value => (
{value}
)
}
);
class App extends React.Component {
render() {
return (
Context
);
}
}
App.contextType = MyContext;
またはbabelプラグインを使用してstaticを使用してcontextTypeを初期化します.
class App extends React.Component {
// use babel plugins
static contextType = MyContext;
render() {
return (
Context
);
}
}
注:Providerコンポーネントのvalue値がオブジェクトの場合、Providerが再レンダリングされるたびに、valueプロパティが常に新しいオブジェクトに割り当てられているため、下のすべてのconsumersコンポーネントが再レンダリングされます.valueの値をstateに上げることで、このような状況を防ぐことができます.
コードの例:https://github.com/MirrorHuang/react16-demo
参照先:https://reactjs.org/