React: ComponentDidMount内の新しいコンテキストAPIにアクセスする方法はありたすか

䜜成日 2018幎03月18日  Â·  41コメント  Â·  ゜ヌス: facebook/react

私たちはreactmapbox glモゞュヌルを構築しおおり、今日はクロヌンずむンゞェクトの小道具を䜿甚しおいたす。

16.2.0コンテキストAPIの䜿甚を怜蚎しおいたしたが、16.3.0に新しいAPIがあるこずがわかりたしたが、コンテキストの詳现を読み取る方法が芋぀からないようです。
componentDidMountラむフサむクルマップの実装で䜿甚するのが理にかなっおいたす。

これを回避する方法はありたすか

最も参考になるコメント

ラむフサむクルメ゜ッドでコンテキストにアクセスしたり、コンテキストを呌び出したりする簡単な方法があるはずです。
はい、コンポヌネントを別のコンポヌネントでラップするこずで解決できたす。 しかし、解決策ずいうよりは回避策のように感じたす。

䜙分なラッパヌのように感じるこず新しいコンテキストを高速化する理由です。 ツリヌに明瀺的なラッパヌノヌドがない堎合、曎新が必芁なコンポヌネントをすばやく「芋぀ける」こずはできたせん。

ラむフサむクルでコンテキストにアクセスする必芁がある堎合は、それを小道具ずしお䜿甚しおください。

class Button extends React.Component {
  componentDidMount() {
    alert(this.props.theme);
  }

  render() {
    const { theme, children } = this.props;
    return (
      <button className={theme ? 'dark' : 'light'}>
        {children}
      </button>
    );
  }
}

export default React.forwardRef((props, ref) => (
  <ThemeContext.Consumer>
    {theme => <Button {...props} theme={theme} ref={ref} />}
  </ThemeContext.Consumer>
));

これは、 contextTypes定矩ずほが同じ行数です。

党おのコメント41件

これを機胜させようずしおいる䟋を远加したす //codesandbox.io/s/l20yn296w7

線集 https//github.com/reactjs/rfcs/blob/master/text/0002-new-version-of-context.md#class-based-apiのガむドラむンに埓っおください

これは、新しいAPIで実珟できる方法です。

class BaseMapElement extends React.Component {
  componentDidMount() {
    console.log(this.props.context);
  }

  render() {
    return null;
  }
}

const MapElement = () => (
  <Context.Consumer>
    {context =>
      <BaseMapElement context={context} />
    }
  </Context.Consumer>
)

では、 componentDidMount介しおアクセスする唯䞀の方法は、小道具にリダむレクトするこずですか

線集 componentDidMount

小道具に再構築する高次コンポヌネントは良いパタヌンですが、通垞は远加のコンポヌネントが必芁ない堎合は、次のようにコンポヌネントむンスタンスにコンテキスト倀を栌玍したす。 this.contextValue = value次にアクセスしたす。ラむフサむクルフック。 少し醜いですが、最適化ずしおより良い、その堎限りのパタヌンをオプトアりトしおいるので、䞀般的には倧䞈倫だず思いたす

私は同じゞレンマに盎面しおいたす。
ラむフサむクルメ゜ッドでコンテキストにアクセスしたり、コンテキストを呌び出したりする簡単な方法があるはずです。
ものを初期化したり、デヌタをチェックしおフェッチしたり、アンマりント時にクリヌンアップしたりする必芁があるかもしれたせん。
人々は珟圚、おそらく壊れおいる状況でそれを行っおいたす。
はい、コンポヌネントを別のコンポヌネントでラップするこずで解決できたす。 しかし、解決策ずいうよりは回避策のように感じたす。

次のようにコンポヌネントむンスタンスにコンテキスト倀を栌玍したすthis.contextValue = value次に、ラむフサむクルフックでそれにアクセスしたす

これは非同期モヌドでは安党ではないず確信しおいたす。 これをしないでください。 cc @acdlite

はい、コンポヌネントを別のコンポヌネントでラップするこずで解決できたす。 しかし、解決策ずいうよりは回避策のように感じたす。

私はそれに同意したす。 componentDidMountずcomponentWillUnmountを介しおネむティブにアクセスし、初期化/クリヌンアップできるようにするず䟿利です。

䞀般に、むンスタンス倉数を巧劙に䜿甚しお通垞のデヌタフロヌをだたすず、非同期で問題が発生したす。 しないでください。 むンスタンス倉数はタむマヌなどの特定のこずを行う唯䞀の方法であるため、今日は少し混乱しおいたす。 非同期をリリヌスする前に、より明確な掚奚事項を公開したす。そしおい぀の日か、むンスタンスにあたり䟝存しない新しいコンポヌネントAPIを入手する予定です。

tl; dr小道具の間接参照を䜿甚したす。 そしお、䜙分なコンポヌネントに぀いおはあたり心配しないでください。

これは非同期モヌドでは安党ではないず確信しおいたす。 これをしないでください。

これはどのようにそしおどのように安党ではないでしょうか 非同期モヌドに぀いおのこのすべおの話では、「安党でない」ずはどういう意味かははっきりしおいたせん。 それは、行動が䞍合理で予枬䞍可胜なブギヌマンのように感じ始めおいたす。これは、単玔で理解しやすいデヌタフロヌモデルで䞀般的に奜たれおいるシステムで、人々を倚くの保蚌で満たすこずはありたせん。 コンポヌネントが再び魔法のオブゞェクトである0.13以前の土地に戻ったような気がしたす。

「別のコンポヌネントを远加するだけ」ず蚀うのも簡単ですが、それはしばしば面倒であり、独自のカテゎリのバグず課題をもたらしたす。 私は、人々が「安党」であるために、reactAPIを介しお抜象化を発明しなければならないような気がし始めたせん。

申し蚳ありたせん^䞊蚘がむラむラ/怒りに聞こえる堎合、私はそのトヌンを意図しおいたせんでした phhhhoooneで

それは怒っおいるように聞こえたしたが、私はあなたの䞻匵を理解し、それがどのように/なぜ安党でないのかに぀いおあなたの質問を共有したす

行動が䞍合理で予枬䞍可胜なブギヌマンのように感じ始めおいたす

申し蚳ありたせんが、私たちは1か月以䞊、具䜓的な提案を含むガむダンスに取り組んでいたす。 それらを収集しおブログ投皿ずしお公開する時間を䞎えおください。 たた、実際のアルファを䜿甚せずに議論するこずも困難です。これも私たちが懞呜に取り組んできたものです。

したがっお、䜕も蚀わないか、うたく機胜しないこずに぀いお事前に譊告する必芁がありたす。 私たちは譊告の偎で誀りを犯したすが、私たちはあなたにずっおそれをより困難にしおいるように芋えるこずがわかりたす。 コヌドが出お、それで遊ぶこずができれば、私たちが䜕を意味するのかがわかり、それがより理にかなっおいるず確信しおいたす。

これはどのようにそしおどのように安党ではないでしょうか

私の話を芋る機䌚はありたしたか なぜこれを行っおいるの

あなたが話を芋たず仮定しお、これはこの特定のケヌスに぀いおのより具䜓的な説明です。 デモで瀺したようにレンダリングを「䞀時停止」できるようにするには、Reactがい぀でも、堎合によっおはさたざたな小道具を䜿甚しおrender()を呌び出すこずができる必芁がありたす。 たずえば、 this.propsずthis.stateを新しい画面ロヌド䞭の小道具に蚭定する堎合は、 render呌び出したすが、叀いthis.propsたた、珟圚のバヌゞョンのツリヌでのむンタラクションに応答しおレンダリングする堎合はthis.state たずえば、新しい画面の読み蟌み䞭に䜕かを抌す堎合。

非同期では、経隓則は次のずおりです。 componentDidMount 、 componentDidUpdate 、 componentWillUnmountなどのラむフサむクルずrefコヌルバックのみが、察応する小道具ず状態を䜿甚しお、明確に定矩された時点で実行されたす。画面に衚瀺されおいるものに。 幞いなこずに、この図にうたく適合しないラむフサむクルは他にもいく぀かあり、それらのより良い代替案を玹介しおいたす getDerivedPropsFromState 、 getSnapshotBeforeUpdate 。 これは段階的な移行になりたす。 繰り返しになりたすが、それはすべおブログ投皿に含たれる予定です。

今、この問題の根本に。 非同期モヌドでは、 Reactはrenderメ゜ッドをい぀どの順序で呌び出すかに぀いお保蚌したせん。 これは、Reactがそもそも保蚌するこずのなかったものです。たたたた、毎回同じ順序でした。 フィヌルドをrender保存しおから、ラむフサむクルで読み取るこずは「安党」ではありたせん。Reactがrenderず呌ばれるずきに、さたざたな小道具䞭断されたツリヌなどでフィヌルドを保存する可胜性があるためです。ただ準備ができおいたせん。

ラむフサむクルメ゜ッドでコンテキストにアクセスしたり、コンテキストを呌び出したりする簡単な方法があるはずです。
はい、コンポヌネントを別のコンポヌネントでラップするこずで解決できたす。 しかし、解決策ずいうよりは回避策のように感じたす。

䜙分なラッパヌのように感じるこず新しいコンテキストを高速化する理由です。 ツリヌに明瀺的なラッパヌノヌドがない堎合、曎新が必芁なコンポヌネントをすばやく「芋぀ける」こずはできたせん。

ラむフサむクルでコンテキストにアクセスする必芁がある堎合は、それを小道具ずしお䜿甚しおください。

class Button extends React.Component {
  componentDidMount() {
    alert(this.props.theme);
  }

  render() {
    const { theme, children } = this.props;
    return (
      <button className={theme ? 'dark' : 'light'}>
        {children}
      </button>
    );
  }
}

export default React.forwardRef((props, ref) => (
  <ThemeContext.Consumer>
    {theme => <Button {...props} theme={theme} ref={ref} />}
  </ThemeContext.Consumer>
));

これは、 contextTypes定矩ずほが同じ行数です。

はい、コンポヌネントを別のコンポヌネントでラップするこずで解決できたす。 しかし、解決策ずいうよりは回避策のように感じたす。

子関数/レンダリングプロップアプロヌチは新しいコンテキストの_公匏API_であるずダンが蚀ったこずを2番目にしたかったので、それを䜿甚しお、Reactに高速であるこずを心配させおください。 そうなる

これはどのようにそしおどのように安党ではないでしょうか

ドラフトのStrictModeドキュメントは、むンスタンスの倉曎これは単なる別のタむプの副䜜甚ですが非同期モヌドで危険である理由のいく぀かにも觊れおいたす。

ここで提案されおいるガむドラむンに埓った実隓的なブランチがありたす。 誰かがそれが理にかなっおいるかどうかを確認するために芋るこずができたすか https://github.com/commodityvectors/react-mapbox-gl/pull/11

私はこのラむブラリに粟通しおいないので、人々がそのコンポヌネントでrefを利甚したこずがあるかどうかはわかりたせんが、利甚した堎合、そのPRのwithContextミックスむンは新しいforwardRef API 。

意味がある。 参照しおいただきありがずうございたす。 ずりあえずこの問題を解決したす。

私は同じこずを達成できるかどうかを確認しようずしおいたので、この問題に遭遇したした。

したがっお、これらすべおから収集できるこずから、 Context.Consumerを䜿甚するコンポヌネントでは、子レンダリング関数の倖郚でAPIにアクセスするこずはできたせん。 私はこれを少し簡単にするために働くかもしれない䜕かを思い぀いたこれが䜕らかの理由で良い習慣でないならば、いく぀かのフィヌドバックを本圓に感謝するだろう

const MapElement = (props) => (
  <Context.Consumer>
    {context =>
      <RunOnLifecycle
        runOnMount={() => { /*use context*/ }}
        runOnUnMount={() => { /*use context*/ }}
        runOnUpdate={(prevProps) => { /*use context - compare prevProps with props */ }}
        { ...props }
      />
    }
  </Context.Consumer>
)

そしお、そのヘルパヌコンポヌネント<RunOnLifecycle/> 

export interface IPropsRunOnLifecycle {
  runOnMount?: () => void;
  runOnUpdate?: (prevProps: object) => void;
  runOnUnMount?: () => void;
  children?: JSX.Element | ReactNode;
  [prop: string]: any;
}

export class RunOnLifecycle extends React.Component<IPropsRunOnLifecycle> {
  componentDidUpdate(prevProps, prevState, snapshot) {
    if (this.props.runOnUpdate != null) {
      this.props.runOnUpdate(prevProps);
    }
  }

  componentDidMount() {
    if (this.props.runOnMount != null) {
      this.props.runOnMount();
    }
  }

  componentWillUnmount() {
    if (this.props.runOnUnMount != null) {
      this.props.runOnUnMount();
    }
  }

  render() { return this.props.children || null; }
}

これが将来の頭痛の皮になるのではないかず考えおいたす。 倚少のハックではありたすが、それでもかなり暙準的なReactのように感じたす。

そのアプロヌチを悪い考えにするかもしれないいく぀かの埮劙な違いがありたす。 たずえば、 MapElementがrunOnMountコヌルバックが実行されたずきに

😄代わりに、これにHOCアプロヌチを䜿甚するこずをお勧めしたす
https://reactjs.org/docs/context.html#sumption -context-with-a-hoc

この皮のこずにHOCを䜿甚するこずの唯䞀の本圓の欠点は、 forwardRef APIによっお軜枛されおいたす。
https://reactjs.org/docs/react-api.html#reactforwardref

私たちは、reactドキュメントや人々がここで蚀ったこずのようなアプロヌチを取りたした。 これたでのずころうたく機胜しおいたす。

https://github.com/commodityvectors/react-mapbox-gl/blob/master/src/Map.js#L63

そのアプロヌチを悪い考えにするかもしれないいく぀かの埮劙な違いがありたす。 たずえば、MapElementが参照を䜿甚するクラスコンポヌネントである堎合、runOnMountコヌルバックが実行されたずきに参照はただ蚭定されおいたせん。

フィヌドバック@bvaughnをありがずう。 珟時点では、コンテキストツリヌ内にマりントされおいるものに応じお、UIに物事を远加/削陀する䞀皮の状態プロキシコンポヌネントずしお玔粋に䜿甚しおいたす。 ポヌタルのようなものですが、Reactコンポヌネントツリヌ内にありたす。 したがっお、実際に子をレンダリングしたり、参照を凊理したりするこずはたったくありたせん。

refず盞互䜜甚する䜕かをする必芁がある堎合は芚えおおいおください。

こんにちは、みなさん、

ラむフサむクルメ゜ッドのコンテキストデヌタが必芁です。 そのため、最初のいく぀かのコメントを確認した埌、HOCアプロヌチに埓い、コンテキストデヌタを小道具ずしお枡したした。
すべおが期埅どおりに機胜しおいたす。 しかし今、私はコンポヌネントの単䜓テストケヌスを曞きたいのですが、それができたせん。

このシナリオのテストケヌスを䜜成する方法を誰かに教えおいただければ幞いです。

私は酵玠、酵玠アダプタヌ反応16、およびゞェストを䜿甚しおいたすが、䜿甚に問題がありたす。

@AmnArora

私が働いおいる䌚瀟では、次のこずを行っおいたすこれはコンセンサスではない可胜性がありたす。「裞の」コンポヌネントも゚クスポヌトしおから、テストにむンポヌトし、手動で小道具に合栌したす。

䟋えば

// MyComponent.js
export class MyComponent extends Component { /* ... */ }
export default HOC()(MyComponent)

// MyComponent.spec.js
import { MyComponent } from '...'

// OtherComponents.js
import MyComponent from '...'

たた、この議論に加えお、同じ問題が発生し、耇数のコンテキストを消費するこのhttps://www.npmjs.com/package/react-context-consumer-hocを䜜成したした。

すべおが期埅どおりに機胜しおいたす。 しかし今、私はコンポヌネントの単䜓テストケヌスを曞きたいのですが、それができたせん。

@AmnAroraなぜナニットテストを曞くこずができないのですか 䜕を詊したしたか どのような゚ラヌが発生しおいたすか

@pgarciacamouたず、迅速な返信に感謝したす。 さお、りェブ䞊で䜕も芋぀からず、ここにク゚リを投皿した埌。 私はあなたが蚀ったのず同じ解決策を思い぀いた。

テストケヌスは珟圚機胜しおいたすが、これは回避策のようです。 https://www.npmjs.com/package/react-context-consumer-hocを芋お、チヌムず話し合い

ありがずう。 100

@bvaughn以前、状態管理にreduxを䜿甚しおいたずき、コンポヌネントを浅くコピヌし、diveメ゜ッドずinstanceメ゜ッドを䜿甚しおコンポヌネントのむンスタンスを取埗したした。

ただし、コンテキストAPIを䜿甚する堎合、これらのメ゜ッドはいずれも䜿甚できたせんでした。

そしお、これらの方法のいずれも䜿甚しおいなかったずき、次の゚ラヌが発生しおいたした _タグ12の䞍明なノヌド_

ガッチャ。

これらは䞡方ずも、䜿甚しおいるEnzymeのバヌゞョンが新しいコンテキストAPIを適切にサポヌトしおいないずいう問題のように聞こえたす。 それは残念です。

reduxずunistore 倚くのコヌド汚染/䜙分な可動郚分imoに倧きな嫌悪感を芚え、ネストされたコンポヌネントが単䞀のグロヌバル状態にアクセスできるようにする次のセットアップに぀ながりたした。 グロヌバル状態であっおはならない他のすべお぀たり、テキスト入力倀、トグル倀は、ネストされた各コンポヌネントのロヌカル状態内に栌玍されたす。

https://github.com/davalapar/session-context

こんにちは、

この問題は解決されたしたか

3぀のコンポヌネントがあるシナリオがありたす。 クリ゚ヌタヌ、ディスプレむ、セル。
Cellには、CreatorずDisplayの䞡方で䜿甚されるレンダリングロゞックがありたす。

珟圚、アむテムが䜜成されおいるか、衚瀺する必芁がある堎合は、ステヌタスを枡す必芁がありたす。 さたざたな堎所でセルを䜿甚したので、ステヌタスを小道具ずしお個別に枡す必芁がありたす。 そのため、ステヌタスにコンテキストを䜿甚したかったのですが、問題は、ディスプレむコンポヌネントがマりントされおいる堎合にのみコンテキストを倉曎したいずいうこずです。 これはReactの珟圚のバヌゞョンです。 私はReact 16.7を䜿甚しおいたす

React 16.6では、クラスに新しいcontextType APIが远加され、 componentDidMount新しいコンテキストを簡単に読み取るこずができるこずに泚意しおください。

https://reactjs.org/docs/context.html#classcontexttype

ええ、コンポヌネントで単䞀のコンテキストを䜿甚するだけでよい堎合は、 contextTypeが䟿利なオプションです。

React 16.6では、クラスに新しいcontextType APIが远加され、 componentDidMount新しいコンテキストを簡単に読み取るこずができるこずに泚意しおください。

そうではありたせん。 単䞀のコンテキストタむプで十分な堎合でも、Class.contextTypeは継承を䞭断したす。 HOCに぀いおも同じこずが蚀えたす。

コンポヌネント間でコヌドを再利甚するために、継承よりもコンポゞションを掚奚するこずに぀いお、ドキュメントでかなり明確にしおいたす。 それを超えお、私はあなたが蚀っおいるこずを本圓に理解しおいたせん。

contextType APIは、間違いなくcomponentDidMountコンテキスト倀に簡単にアクセスできるようにしたすこれがこのスレッドの目的です。

継承よりもコンポゞションを掚奚するこずに぀いお、ドキュメントでかなり明確にしおいたす...

広すぎる...

私が今苊劎しおいるのは、実装をサポヌトするために必芁な䞀連の共通機胜を備えたコンポヌネントのファミリヌがあるずいうこずです。 コンテキストビットを陀いお、すべおが継承によっお完党にモデル化されおいたす。

このような状況でのみコンテキストを混乱させるように思われるこずを考えるず、コンテキストAPIはかなりむラむラしたす。

...これがこのスレッドの内容です...

はい、このコメントは少し話題から倖れおいたす。

Context ClassでcontextTypeを倉曎するず、reduxストアが壊れたす/

React 16.6は、componentDidMountで新しいコンテキストを簡単に読み取るこずができるクラス甚の新しいcontextTypeAPIを远加したこずに泚意しおください。

ええ、コンポヌネントで単䞀のコンテキストを䜿甚するだけでよい堎合は、contextTypeが䟿利なオプションです。

MyCoolComponent.contextTypeに割り圓おる前にコンテキストを䜜成する方法はありたせんか

私が読んだのは、今のずころ、次のこずができるコンポヌネントが必芁な堎合です。

a耇数のコンテキストを消費する
b render以倖のメ゜ッドでそれらのコンテキストからのものを䜿甚する

これは、ラッパヌがコンテキストを消費し、子に小道具を枡すずいう説明されたパタヌンに固執しおいるこずを意味したす

理想的な状況は、このようなものを曞いお、䞡方の䞖界を最倧限に掻甚できるこずだず思いたす぀たり、クラス党䜓で耇数のコンテキストを利甚できたす。

MyCoolComponent.contextType =  composeContexts(OneContext, TwoContext, RedContext, BlueContext)

これを行う方法はありたすか

これはrenderメ゜ッドでは機胜したすが、他のメ゜ッドでは機胜したせん。

ちょっず、そこ。
クラスコンポヌネントのコンストラクタヌで新しいコンテキストAPIを䜿甚する可胜性はありたすか

プロゞェクトをv15.xからv16.xに移行しおいたす。タスクの1぀は、新しいコンテキストAPIを䜿甚するこずです。
私たちのプロゞェクトでは、css-modules + isomorphic-style-loaderを䜿甚したす。埌者は、コンポヌネントのスタむルシヌトをDOMに挿入するためのいく぀かのAPIを公開したす。

V15では、これらのAPIを叀いコンテキストAPIに配眮し、各コンポヌネントが次のような方法で取埗できるようにしたす。

    class MyComp extends Component {
        static contextTypes = {
                insertCss: PropTypes.func
           }
         ....
         componentWillMount () {
                // insert a style tag for this component
               this.removeCss = this.context.insertCss(myStyles)
         }
    }

V15では、これをcomponentWillMountに配眮できたす。 これにより、レンダリング前にコンポヌネントのスタむルが正しくなりたす。

ただし、V16では、componentWillMountは安党ではないずマヌクされおおり、将来的には非掚奚になりたす。
したがっお、圓面の考えは、context.insertCss呌び出しをコンポヌネントのコンストラクタヌに入れるこずです。

しかし、文曞から芋るず、

contextTypesがコンポヌネント内で定矩されおいる堎合、次のラむフサむクルメ゜ッドは远加のパラメヌタヌであるコンテキストオブゞェクトを受け取りたす。

コンストラクタヌ小道具、コンテキスト

この䜿甚法2番目のパラメヌタヌずしおコンテキストを䜿甚も非掚奚になりたす。

MyComp.contextType = StyleContextを割り圓おお、新しいコンテキストAPIを詊したした
それでも、this.contextがコンストラクタヌで未定矩であるこずがわかりたした。

    class MyComp extends Component {
        static contextType = StyleContext

         constructor (props) {
             super(props)
             console.log(this.context) // undefined
         }

    }

コンストラクタヌでコンテキストを䜿甚する方法に関する実甚的なガむドはありたすか

䜕かアドバむス

ちょっず、そこ。
クラスコンポヌネントのコンストラクタヌで新しいコンテキストAPIを䜿甚する可胜性はありたすか

プロゞェクトをv15.xからv16.xに移行しおいたす。タスクの1぀は、新しいコンテキストAPIを䜿甚するこずです。
私たちのプロゞェクトでは、css-modules + isomorphic-style-loaderを䜿甚したす。埌者は、コンポヌネントのスタむルシヌトをDOMに挿入するためのいく぀かのAPIを公開したす。

V15では、これらのAPIを叀いコンテキストAPIに配眮し、各コンポヌネントが次のような方法で取埗できるようにしたす。

    class MyComp extends Component {
        static contextTypes = {
                insertCss: PropTypes.func
           }
         ....
         componentWillMount () {
                // insert a style tag for this component
               this.removeCss = this.context.insertCss(myStyles)
         }
    }

V15では、これをcomponentWillMountに配眮できたす。 これにより、レンダリング前にコンポヌネントのスタむルが正しくなりたす。

ただし、V16では、componentWillMountは安党ではないずマヌクされおおり、将来的には非掚奚になりたす。
したがっお、圓面の考えは、context.insertCss呌び出しをコンポヌネントのコンストラクタヌに入れるこずです。

しかし、文曞から芋るず、

contextTypesがコンポヌネント内で定矩されおいる堎合、次のラむフサむクルメ゜ッドは远加のパラメヌタヌであるコンテキストオブゞェクトを受け取りたす。

コンストラクタヌ小道具、コンテキスト

この䜿甚法2番目のパラメヌタヌずしおコンテキストを䜿甚も非掚奚になりたす。

MyComp.contextType = StyleContextを割り圓おお、新しいコンテキストAPIを詊したした
それでも、this.contextがコンストラクタヌで未定矩であるこずがわかりたした。

    class MyComp extends Component {
        static contextType = StyleContext

         constructor (props) {
             super(props)
             console.log(this.context) // undefined
         }

    }

コンストラクタヌでコンテキストを䜿甚する方法に関する実甚的なガむドはありたすか

䜕かアドバむス

contextTypeを䜿甚する代わりに、このようにするこずができたす

class MyComponent extends React.Component {
   render(){
       const {
         //props including context props
       } = this.props;
       return(<View />);
   }
};

const withContext = () => (
  <MyContext.Consumer>
    { (contextProps) => (<MyComponent {...contextProps}/>)}
  </MyContext.Consumer>
);

export default withContext;

私のようにレンダリング関数の倖でそれを䜿甚するのに苊劎しおいる人は、サブコンポヌネントで以䞋を䜿甚しおください。

useContext

䟋えば

const context = useContext(yourContext)

MainComponent.Subcomponent = () => {
 const context = useContext(context)

  useEffect(()=> {
    console.log(context)
  })
}
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡