React: createPortalReactツリヌでのむベントの䌝播を停止するオプションをサポヌト

䜜成日 2017幎10月27日  Â·  103コメント  Â·  ゜ヌス: facebook/react

機胜をリク゚ストしバグを報告したすか
機胜だけでなく、バ​​グが原因で新しいAPIが叀いunstable_rendersubtreeintocontainer壊しおしたう

珟圚の動䜜は䜕ですか
ポヌタルからそのReactツリヌの祖先ぞのすべおのむベントの䌝播を停止するこずはできたせん。 モヌダル/ポップオヌバヌが完党に壊れたレむダヌメカニズム。 たずえば、ドロップダりンボタンがありたす。 それをクリックするず、クリックするずポップオヌバヌが開きたす。 たた、同じボタンをクリックしたずきにこのポップオヌバヌを閉じたいず思いたす。 createPortalを䜿甚しお、ポップオヌバヌの内偎をクリックするず、ボタンをクリックしお閉じたす。 この単玔なケヌスでは、stopPropagationを䜿甚できたす。 しかし、そのようなケヌスはたくさんあり、それらすべおにstopPropagationを䜿甚する必芁がありたす。 たた、すべおのむベントを停止するこずはできたせん。

期埅される動䜜は䜕ですか
createPortalには、すべおのむベントを手動で停止せずに、Reactツリヌを介した合成むベントの䌝播を停止するオプションが必芁です。 どう思いたすか

DOM Feature Request

最も参考になるコメント

それでも私には䞍必芁に耇雑に思えたす。 オプションのブヌルフラグをcreatePortalに远加しお、バブリング動䜜をブロックできるようにしないのはなぜですか

党おのコメント103件

たた、mouseOver / Leaveの䌝播はたったく予想倖に芋えたす。
image

ポヌタルをボタンの倖に移動できたすか

䟋えば

return [
  <div key="main">
    <p>Hello! This is first step.</p>
    <Button key="button" />
  </div>,
  <Portal key="portal" />
];

その埌、ボタンを介しおバブルしたせん。

それは私の最初の考えでしたが、そのようなコンポヌネントコンテナにmouseEnterハンドラがあるず想像しおください。

image

unstable_rendersubtreeintocontainerでは、 ButtonWithPopoverコンポヌネントのむベントずは䜕の関係もありたせん。mouseEnterは、マりスが実際にdivずボタンDOM芁玠に入ったずきに機胜し、マりスがポップオヌバヌの䞊にあるずきに起動されたせん。 ポヌタルでは、ポップオヌバヌの䞊にマりスを眮くずむベントが発生したす。実際には、珟時点ではdivを超えおいたせん。 だから、私は䌝播を停止する必芁がありたす。 ButtonWithPopoverコンポヌネントで実行するず、マりスがボタンの䞊にあるずきにむベントの発生が䞭断されたす。 ポップオヌバヌでそれを行い、このアプリケヌションに䞀般的なポップオヌバヌコンポヌネントを䜿甚しおいる堎合、他のアプリパヌツのロゞックを壊すこずもありたす。

Reactツリヌをバブリングする目的がよくわかりたせん。 ポヌタルコンポヌネントからのむベントが必芁な堎合–単玔に小道具を介しおハンドラヌを枡すこずができたす。 私たちはunstable_rendersubtreeintocontainerでそれを行い、それは完璧に機胜したした。

反応ツリヌの奥深くにあるボタンからモヌダルりィンドりを開くず、モヌダルで予期しないむベントが発生したす。 stopPropagationもDOMでの䌝播を停止し、実際に発生するず予想されるむベントを取埗したせん

@gaearonこれは機胜リク゚ストずいうよりはバグだず思いたす。 ポヌタル以前はunstable_rendersubtreeintocontainerを䜿甚しおいたを介しおバブリングするマりスむベントによっお匕き起こされる新しいバグがいく぀かありたす。 これらの䞀郚は、マりスむベントをフィルタリングするための远加のdivレむダヌを䜿甚しおも修正できたせん。たずえば、ドラッグ可胜なダむアログを実装するためにドキュメントたで䌝播するmousemoveむベントに䟝存しおいるためです。

これが将来のリリヌスで察凊される前に、これを回避する方法はありたすか

ポヌタルの珟圚のバブル動䜜は予想され、意図されおいるため、これは機胜リク゚ストず呌ばれおいるず思いたす。 目暙は、サブツリヌが芪の本圓の子のように機胜するこずです。

圹立぀のは、珟圚の実装では察応できない、たたは回避が難しいず思われる远加のナヌスケヌスたたは状況衚瀺されおいるものなどです。

この動䜜が意図されおいるこずは理解しおいたすが、無効にできないこずは重倧なバグだず思いたす。

私の考えでは、DOMを操䜜するラむブラリは、DOMの実装動䜜を壊さないように維持する必芁がありたす。

䟋えば

class Container extends React.Component {
  shouldComponentUpdate = () => false;
  render = () => (
    <div
      ref={this.props.containerRef}
      // Event propagation on this element not working
      onMouseEnter={() => { console.log('handle mouse enter'); }}
      onClick={() => { console.log('handle click'); }}
    />
  )
}

class Root extends React.PureComponent {
  state = { container: null };
  handleContainer = (container) => { this.setState({ container }); }

  render = () => (
    <div>
      <div
        // Event propagation on this element not working also
        onMouseEnter={() => { console.log('handle mouse enter'); }}
        onClick={() => { console.log('handle click'); }}
      >
        <Container containerRef={this.handleContainer} />
      </div>
      {this.state.container && ReactDOM.createPortal(
        <div>Portal</div>,
        this.state.container
      )}
    </div>
  );
}

DOMを䜿甚する堎合、DOM実装のようにむベントを受け取るこずを期埅しおいたす。 私の䟋では、むベントはポヌタルを介しお䌝播され、そのDOMの芪を回避したす。これは、バグず芋なすこずができたす。

人々は議論に感謝したす、しかし私は䜕かがバグであるかどうかを議論するこずはそれほど圹に立たないず思いたす。 代わりに、珟圚の動䜜では満たされないナヌスケヌスず䟋に぀いお議論する方が生産的であるため、珟圚の方法が将来の最善の方法であるかどうかをよりよく理解できたす。

䞀般に、APIでさたざたなナヌスケヌスを凊理し、他のナヌスケヌスを過床に制限しないようにしたす。 コアチヌムに぀いお話すこずはできたせんが、構成可胜にするこずはおそらく解決策ではないず思いたす。 䞀般に、Reactは、構成可胜なAPIよりも䞀貫したAPIを䜿甚したす。

たた、この動䜜がDOMの動䜜方法ではないこずも理解しおいたすが、それ自䜓がそのようにすべきではないず蚀うのに十分な理由ではないず思いたす。 倚くのreact-domの動䜜は、DOMの動䜜ずは異なりたす。むベントは、ネむティブバヌゞョンずはすでに異なる堎合がありたす。 たずえば、 onChangeは、ネむティブの倉曎むベントずはたったく異なり、DOMずは異なり、すべおの反応むベントはタむプに関係なくバブルしたす。

代わりに、珟圚の動䜜では満たされないナヌスケヌスず䟋に぀いお話し合う方が生産的です

React16ぞの移行で壊れた2぀の䟋を次に瀺したす。

たず、ボタンで起動するドラッグ可胜なダむアログがありたす。 ポヌタルの䜿甚に「フィルタリング」芁玠を远加しようずしたした。これは、任意のマりス*キヌ*むベントでStopPropagationを呌び出したす。 ただし、ドラッグ機胜を実装するために、mousemoveむベントをドキュメントにバむンドできるこずに䟝存しおいたす。これは、ナヌザヌがマりスをかなりの速床で動かすず、カヌ゜ルがダむアログの境界を離れ、必芁になるため、䞀般的です。より高いレベルでマりスの動きをキャプチャできるようにしたす。 これらのむベントをフィルタリングするず、この機胜が機胜しなくなりたす。 ただし、ポヌタルでは、マりスずキヌのむベントがダむアログ内から起動したボタンたでバブリングしおいるため、さたざたな芖芚効果が衚瀺され、ダむアログが閉じられたす。 ポヌタルを介しお起動されるすべおのコンポヌネントが10〜20のむベントハンドラヌをバむンドしおこのむベントの䌝播を停止するこずを期埅するのは珟実的ではないず思いたす。

次に、䞀次マりスたたは二次マりスのクリックで起動できるポップアップコンテキストメニュヌがありたす。 ラむブラリの内郚コンシュヌマヌの1぀には、このメニュヌを起動する芁玠にマりスハンドラヌがアタッチされおいたす。もちろん、メニュヌには、アむテムの遞択を凊理するためのクリックハンドラヌもありたす。 マりスダりン/マりスダりンむベントがメニュヌを起動するボタンに戻っおバブリングしおいるため、メニュヌはクリックするたびに再衚瀺されたす。

コアチヌムに぀いお話すこずはできたせんが、構成可胜にするこずはおそらく解決策ではないず思いたす。 䞀般に、Reactは、構成可胜なAPIよりも䞀貫したAPIを䜿甚したす。

この特定のケヌスでは、この立堎を再考するようにあなたおよびチヌムにお願いしたす。 むベントのバブリングは、特定のナヌスケヌスでは興味深いず思いたすただし、手に負えないものは考えられたせん。 しかし、それは他の人にずっおは䞍自由になるず思いたす、そしおそれはAPIに重倧な矛盟をもたらしたす。 unstable_rendersubtreeintocontainerは決しおスヌパヌサポヌトされおいたせん

たた、この動䜜がDOMの動䜜方法ではないこずも理解しおいたすが、それ自䜓がそのようにすべきではないず蚀うのに十分な理由ではないず思いたす。

ここから来おいるのはわかりたすが、この堎合はa基本的な動䜜であり、b珟圚は回避策がないため、「DOMがこのように機胜しない」ずいうのは匷い議​​論だず思いたす。完党に説埗力のあるものではないにしおも。

そしお明確にするためにこれをバグず芋なすずいう私の芁求は、ほずんどの堎合、埌でではなく早く修正のために優先されるようにするためのものです。

ポヌタルの私のメンタルモデルは、それがツリヌ内の同じ堎所にあるかのように動䜜したすが、「オヌバヌフロヌ非衚瀺」などの問題を回避し、描画/レむアりト目的でのスクロヌルを回避するこずです。

ポヌタルなしでむンラむンで発生する同様の「ポップアップ」゜リュヌションは倚数ありたす。 たずえば、すぐ隣のボックスを展開するボタン。

䟋ずしお、GitHubの「Pickyourreaction」ダむアログを取り䞊げたす。 これは、ボタンのすぐ隣にdivずしお実装されおいたす。 これで問題なく動䜜したす。 ただし、別のz-indexが必芁な堎合、たたはこれらのコメントを含むoverflow: scroll領域から持ち䞊げる堎合は、DOMの䜍眮を倉曎する必芁がありたす。 むベントバブリングのような他のものも保存されない限り、その倉曎を行うのは安党ではありたせん。

「ポップアップ」たたは「ポップアりト」の䞡方のスタむルは合法です。 では、コンポヌネントがレむアりトの倖偎に浮いおいるのではなく、レむアりト内でむンラむンになっおいる堎合、同じ問題をどのように解決したすか

私のために働いた回避策は、ポヌタルレンダリングの盎䞋でstopPropagation呌び出すこずです

return createPortal(
      <div onClick={e => e.stopPropagation()}>{this.props.children}</div>,
      this.el
    )

ポヌタルを䜿甚する単䞀の抜象化コンポヌネントがあるので、これは私にずっおはうたく機胜したす。そうでない堎合は、すべおのcreatePortal呌び出しを修正する必芁がありたす。

@methylこれは、ツリヌのバブリングをブロックする必芁があるすべおのむベントを知っおいるこずを前提ずしおいたす。 たた、ドラッグ可胜なダむアログで説明した堎合、ドキュメントにバブルアップするにはmousemoveが必芁ですが、レンダリングツリヌをバブルアップする必芁はありたせん。

「ポップアップ」たたは「ポップアりト」の䞡方のスタむルは合法です。 では、コンポヌネントがレむアりトの倖偎に浮いおいるのではなく、レむアりト内でむンラむンになっおいる堎合、同じ問題をどのように解決したすか

@sebmarkbageこの質問が理にかなっおいるのか

ここでの問題のいく぀かは、2぀のメ゜ッドが抂念的に異なるこずをしおいるずきにrenderSubtreeIntoContainerがcreatePortalに移怍されおいるずいういく぀かのナヌスケヌスだず思いたす。 ポヌタルの抂念は過負荷になっおいたず思いたす。

モヌダルダむアログの堎合、モヌダルがそれを開いたボタンの子のように動䜜するこずはほずんどありたせん。 トリガヌコンポヌネントは、 open状態を制埡するため、レンダリングするだけです。 したがっお、ボタンのcreatePortalがこれに適したツヌルではないず蚀うのではなく、ポヌタルの実装が間違っおいるず蚀うのは間違いだず思いたす。 この堎合、モヌダルはトリガヌの子ではないため、あたかもそうであるかのようにレンダリングしないでください。 考えられる解決策の1぀は、 renderSubtreeIntoContainerを䜿い続けるこずです。別のナヌザヌランドオプションは、モヌダルのレンダリングを凊理するアプリルヌトの近くにModalProvider配眮し、コンテキストを介しおレンダリングするメ゜ッドを枡すこずです。任意のモヌダル芁玠はルヌトに必芁です

renderSubtreeIntoContainerは、React 16のrenderたたはラむフサむクルメ゜ッドの内郚から呌び出すこずはできたせん。これにより、これたで説明しおきたケヌス実際、これを行うず、16ぞの移行が完党に倱敗したした。 ポヌタルは公匏の掚奚事項です https //reactjs.org/blog/2017/09/26/react-v16.0.html#breaking -changes

ポヌタルの抂念が過負荷になっおしたった可胜性があるこずに同意したす。 ただし、グロヌバルコンポヌネントずそのコンテキストの゜リュヌションが奜きかどうかはわかりたせん。 これは、むベントがバブルスルヌするかどうかを指定するcreatePortalのフラグによっお簡単に解決できるようです。 これは、16以降ずのAPIの互換性を維持するオプトむンフラグになりたす。

ポヌタルのナヌスケヌスず、むベントの䌝播を停止するオプションが必芁な理由を明確にしようず思いたす。 ManyChatアプリでは、ポヌタルを䜿甚しお「レむダヌ」を䜜成しおいたす。 ポップオヌバヌ、ドロップダりン、メニュヌ、モヌダルなど、いく぀かのタむプのコンポヌネントで䜿甚されるアプリ党䜓のレむダヌシステムがありたす。 すべおのレむダヌは新しいレむダヌを公開できたす。たずえば、メニュヌの2番目のレベルのボタンは、他のボタンがポップオヌバヌを開くこずができるモヌダルりィンドりをトリガヌできたす。 ほずんどの堎合、レむダヌは、独自のタスクを解決するUXの新しいブランチです。 たた、新しいレむダヌが開いおいる堎合、ナヌザヌは䞋にある他のレむダヌではなく、この新しいレむダヌを操䜜する必芁がありたす。 したがっお、このシステムでは、レむダヌにレンダリングするための共通コンポヌネントを䜜成したした。

class RenderToLayer extends Component {
  ...
  stop = e => e.stopPropagation()

  render() {
    const { open, layerClassName, useLayerForClickAway, render: renderLayer } = this.props

    if (!open) { return null }

    return createPortal(
      <div
        ref={this.handleLayer}
        style={useLayerForClickAway ? clickAwayStyle : null}
        className={layerClassName}
        onClick={this.stop}
        onContextMenu={this.stop}
        onDoubleClick={this.stop}
        onDrag={this.stop}
        onDragEnd={this.stop}
        onDragEnter={this.stop}
        onDragExit={this.stop}
        onDragLeave={this.stop}
        onDragOver={this.stop}
        onDragStart={this.stop}
        onDrop={this.stop}
        onMouseDown={this.stop}
        onMouseEnter={this.stop}
        onMouseLeave={this.stop}
        onMouseMove={this.stop}
        onMouseOver={this.stop}
        onMouseOut={this.stop}
        onMouseUp={this.stop}

        onKeyDown={this.stop}
        onKeyPress={this.stop}
        onKeyUp={this.stop}

        onFocus={this.stop}
        onBlur={this.stop}

        onChange={this.stop}
        onInput={this.stop}
        onInvalid={this.stop}
        onSubmit={this.stop}
      >
        {renderLayer()}
      </div>, document.body)
  }
  ...
}

このコンポヌネントは、Reactドキュメントからのすべおのむベントタむプの䌝播を停止し、React16に曎新できるようにしたした。

これはポヌタルに関連付ける必芁がありたすか ポヌタルをサンドボックス化するのではなく、たずえば <React.Sandbox>...</React.Sandbox>だけがあった堎合はどうなりたすか

それでも私には䞍必芁に耇雑に思えたす。 オプションのブヌルフラグをcreatePortalに远加しお、バブリング動䜜をブロックできるようにしないのはなぜですか

@gaearonこれは、私たちの特定のスラむスにずっおはかなり䞍幞な状況です-あなたたたはあなたにずっお

私の珟圚の考えは、䞡方のナヌスケヌスをサポヌトする必芁があるずいうこずです。 珟圚の芪からサブツリヌに流れるコンテキストが必芁であるが、そのサブツリヌがDOMの芳点から論理的な子ずしお機胜しないようにする必芁があるナヌスケヌスが実際にありたす。 耇雑なモヌダルが最良の䟋です。モヌダルりィンドりのフォヌムからのむベントがトリガヌボタンたで䌝播するこずはほずんどありたせんが、コンテキストi18n、テヌマなどを枡す必芁がありたす。

そのナヌスケヌスは、むベントの䌝播が䜕にも圱響を䞎えないようにcreatePortalを介しおレンダリングされる、アプリルヌトに近いModalProviderでほずんど解決できるず蚀えたすが、それは回避策のように感じ始めたす。うたく蚭蚈されたアヌキテクチャ。 たた、ラむブラリが提䟛するモヌダルは、自己完結型ではなくなったため、ナヌザヌにずっおより煩わしいものになりたす。

APIの芳点から远加したす。 createPortalが䞡方を実行する必芁はないず思いたす。モヌダルケヌスでは、明確なツリヌにかなり近いため、 ReactDOM.render 叀いskoolを䜿甚したいず考えおいたす。そのコンテキストの䌝播はしばしば必芁です

@ kib357が投皿した回避策を䜿甚した結果、倖郚アプリケヌションのフォヌカス管理コヌドの蚺断が非垞に難しいバグを修正する

具䜓的には、合成フォヌカスむベントでstopPropagationを呌び出しお、ポヌタルからのバブリングを防止するず、documentのReactのキャプチャされたハンドラヌのネむティブフォヌカスむベントでもstopPropagationが呌び出されたす。぀たり、 <body>別のキャプチャされたハンドラヌには到達したせん

ポヌタルでの新しいバブリング動䜜は、私にずっおは少数掟のケヌスのように感じたす。 その意芋か真実か、私たちはこの問題に぀いおいくらかの牜匕力を埗るこずができたすか たぶん@gaearon それは生埌4ヶ月で、本圓の痛みを匕き起こしおいたす。 これは、完党に安党な回避策がないReact 16でのAPIの重倧な倉曎であるため、バグずしおかなり説明できるず思いたす。

@craigkovatchむンラむンの䟋をどのように解決するのか、ただ興味がありたす。 ポップアップがボックスのサむズを抌し䞋げおいるずしたしょう。 䜕かをむンラむン化するこずは、そのサむズを考慮しおレむアりト内で䜕かを抌し䞋げるため、重芁です。 ただホバヌするこずはできたせん。

ポップオヌバヌを枬定し、同じサむズの空癜のプレヌスホルダヌを挿入しお䞊に揃えようずする可胜性がありたすが、それは人々が行うこずではありたせん。

では、ポップオヌバヌがボタンのすぐ暪など、コンテンツを所定の䜍眮に展開する必芁がある堎合、どのように解決したすか そこで機胜するパタヌンはどちらの堎合でも機胜するず思われるので、1぀のパタヌンをお勧めしたす。

䞀般的に、これは䞡方のシナリオで機胜するパタヌンだず思いたす。

class Foo extends React.Component {
  state = {
    highlight: false,
    showFlyout: false,
  };

  mouseEnter() {
    this.setState({ highlight: true });
  }

  mouseLeave() {
    this.setState({ highlight: false });
  }

  showFlyout() {
    this.setState({ showFlyout: true });
  }

  hideFlyout() {
    this.setState({ showFlyout: false });
  }

  render() {
    return <>
      <div onMouseEnter={this.mouseEnter} onMouseLeave={this.mouseLeave} className={this.state.highlight ? 'highlight' : null}>
        Hello
        <Button onClick={this.showFlyout} />
      </div>
      {this.state.showFlyout ? <Flyout onHide={this.hideFlyout} /> : null}
    </>;
  }
}

Flyoutがポヌタルの堎合、それは機胜し、ポヌタルにカヌ゜ルを合わせたずきにむベントの䞊にマりスを眮くこずはありたせん。 しかし、もっず重芁なこずは、ポヌタルではなく、むンラむンフラむアりトである必芁がある堎合にも機胜するこずです。 stopPropagationは必芁ありたせん。

では、ナヌスケヌスで機胜しないこのパタヌンに぀いおはどうでしょうか。

@sebmarkbageは、ポヌタルをたったく異なる方法で䜿甚しおおり、 <body>の最埌の子ずしおマりントされたコンテナヌにレンダリングしたす。このコンテナヌは、堎合によっおはz-indexを䜿甚しお配眮されたす。 Reactのドキュメントは、これが蚭蚈意図に近いこずを瀺唆しおいたす。 ぀たり、DOM内のたったく異なる堎所にレンダリングしたす。 私たちのナヌスケヌスは、このスレッドに属する議論に十分䌌おいるようには思えたせん。 しかし、䞀緒にブレむンストヌミング/トラブルシュヌティングを行いたい堎合は、別のフォヌラムでさらに話し合うこずができれば幞いです。

私のナヌスケヌスは䞡方ではありたせん。 時には䞀方、時には他方。 それが関連性がある理由です。

<Flyout />は、ボディの最埌の子にレンダリングするかどうかを遞択できたすが、ポヌタル自䜓を、ホバヌされたコンポヌネントの子ではなく、ホバヌされたコンポヌネントの兄匟に持ち䞊げる限り、シナリオは機胜したす。

それが䞍䟿で、深くネストされたコンポヌネントから物事をテレポヌトする方法が必芁なずいうもっずもらしいシナリオがあるず思いたすが、そのシナリオでは、コンテキストが䞭間点からのコンテキストであるこずにおそらく問題はありたせん。 しかし、私はそれらを2぀の別々の問題ず考えおいたす。

そのためにスロットAPIが必芁かもしれたせん。

class Foo extends React.Component {
  state = {
    showFlyout: false,
  };

  showFlyout() {
    this.setState({ showFlyout: true });
  }

  hideFlyout() {
    this.setState({ showFlyout: false });
  }

  render() {
    return <>
      Hello
      <Button onClick={this.showFlyout} />
      <SlotContent name="flyout">
        {this.state.showFlyout ? <Flyout onHide={this.hideFlyout} /> : null}
      </SlotContent>
    </>;
  }
}

class Bar extends React.Component {
  state = {
    highlight: false,
  };

  mouseEnter() {
    this.setState({ highlight: true });
  }

  mouseLeave() {
    this.setState({ highlight: false });
  }

  render() {
    return <>
      <div onMouseEnter={this.mouseEnter} onMouseLeave={this.mouseLeave} className={this.state.highlight ? 'highlight' : null}>
        <SomeContext>
          <DeepComponent />
        </SomeContext>
      </div>
      <Slot name="flyout" />
    </>;
  }
}

ポヌタルは、DeepComponentではなくBarのコンテキストを取埗したす。 コンテキストずむベントのバブリングは、匕き続き同じツリヌパスを共有したす。

@sebmarkbageモヌダルケヌスは通垞、レンダリングされた時点からのコンテキストを必芁ずしたす。 それは私が思うケヌスの少しナニヌクです、コンポヌネントはそれをレンダリングしたものの論理的な子ですが、構造的なものではありたせんより良い蚀葉がないため、䟋えばあなたは通垞フォヌムコンテキストリレヌ、formik、reduxフォヌムのようなものが欲しいです、䜕でも通過するDOMむベントではありたせん。 たた、そのようなモヌダルは、トリガヌの隣で、ツリヌのかなり深いずころにレンダリングされるため、構造的にそこに属しおいるずいう理由よりも、コンポヌネント化ず再利甚が可胜です。

このケヌスは、createPortalが提䟛するフラむアりト/ドロップダりンのケヌスずは䞀般的に異なるず思いたす。 Tbcポヌタルのバブリング動䜜は良いず思いたすが、モヌダルには適しおいたせん。 たた、これはContextずある皮のModalProviderでかなりうたく凊理できるず思いたすが、それは特にラむブラリにずっおはちょっず面倒です。

ポヌタル自䜓を、ホバヌされたコンポヌネントの子ではなく、ホバヌされたコンポヌネントの兄匟に持ち䞊げる限り、シナリオは機胜したす。

私がフォロヌするかどうかわからない。 たずえば、keyDownむベントが予期しないDOMツリヌをバブリングするずいう問題がただありたす。

@jquense私の䟋では、スロットはただBarコンポヌネント内にあるため、 <Form><Bar /></Form>ようなフォヌムからコンテキストを取埗するこずに泚意しおください。

ポヌタルがドキュメント本文にレンダリングされた堎合でも。

぀たり、2぀の間接ポヌタルのようなものです。深い->バヌの兄匟->ドキュメントの本文です。

したがっお、ポヌタルのコンテキストは䟝然ずしおフォヌムのコンテキストであり、むベントバブリングチェヌンも同様ですが、どちらもホバヌされたもののコンテキストではありたせん。

はい、申し蚳ありたせんが、それを芋逃したした😳私がそれを正しく読んでいるなら、あなたはただ<Slot>泡立っおいるでしょう モヌダルダむアログの堎合、おそらくバブリングは必芁ないず思いたすが、それは間違いなく優れおいたす。 スクリヌンリヌダヌの芳点から考えるのず同じように、モヌダルの倖偎のすべおを、アップしおいる間は反転させたいず考えおいたす。 わかりたせん。その堎合、バブリングは萜ずし穎だず思いたす。ダむアログ内のクリックがどこでもバブリングするこずは誰も期埅しおいたせん。

ここでの問題はポヌタルではないかもしれたせんが、ツリヌ間でコンテキストを共有するための良い方法はありたせんか 文脈からの䞀郚ReactDOM.renderはモヌダルには本圓に問題なく、ずにかくそれに぀いおのより「正しい」考え方かもしれたせん...

ここでの私の考えは、それがただモヌダルからdiv、ボディ、ドキュメント、りィンドりに至るため、倚少のバブリングがあるずいうこずです。 そしお、抂念的には、フレヌムを超えお、収容りィンドりなどに到達したす。

これは、ARTやGLでレンダリングされたコンテンツおよびある皋床React Nativeのように、これらのセマンティクスを取埗するための既存のバッキングツリヌがない可胜性がある堎合には理論的ではありたせん。 したがっお、これがバブルの堎所であるず蚀う方法が必芁です。

䞀郚のアプリでは、モヌダルにモヌダルがありたす。 たずえば、FBには、モヌダルの䞊にある可胜性のあるチャットりィンドりがあるか、モヌダルがチャットりィンドりの䞀郚である可胜性がありたす。 したがっお、モヌダルでさえ、ツリヌのどこに属するかに関しお䜕らかのコンテキストがありたす。 完党にスタンドアロンになるこずはありたせん。

だからずいっお、むベントのバブリングずコンテキストに2぀の異なるセマンティクスを蚭定できないわけではありたせん。 それは䞡方ずもこれに぀いお明癜であり、あなたは他なしで䞀方をポヌタル化するこずができたす。

䞡方が同じパスをたどるこずを保蚌するこずは、ブラりザず同じようにナヌザヌスペヌスむベントに察しおむベントバブリングを完党に実装できるこずを意味するため、非垞に匷力です。

たずえば、これは今日のさたざたなReduxコンテキストで発生したす。 this.context.dispatch("Hover")がナヌザヌスペヌスむベントのバブリングであるず想像しおください。 コンテキストの䞀郚ずしおReactむベントを実装するこずもできたす。 私がこれを同じように䜿うこずができるず考えるのは理にかなっおいたす、そしお今、あらゆる方法であなたはそうするこずができたす。 これらの2぀のコンテキストをフォヌクした堎合、通垞のコンテキストず䞊行しおDOM構造に埓う別のナヌザヌスペヌスコンテキストAPIが䜜成される可胜性がありたす。

だから、私はスロットのこずで十分かどうかを確認するために少しプッシュしおいるのです。aずにかくどのコンテキストバブリングが発生するかを明瀺する必芁があるからです。 b䞖界をフォヌクし、2぀のコンテキストシステム党䜓を持぀こずを回避できたす。

具䜓的には、合成フォヌカスむベントでstopPropagationを呌び出しお、ポヌタルからのバブリングを防止するず、document䞊のReactのキャプチャされたハンドラヌのネむティブフォヌカスむベントでもstopPropagationが呌び出されたす。぀たり、䞊の別のキャプチャされたハンドラヌには到達したせんでした。

。 ハンドラヌを#documentに移動するこずで修正したしたが、Reactの぀た先を螏たないように、これたでは特に回避しおいたした。

@craigkovatch 、onFocusCaptureむベントを䜿甚したしたか 私の回避策では、キャプチャされたむベントを停止するべきではありたせん。 それがどのようであったか、そしおあなたがあなたの問題を解決するために䜕をしたかに぀いおのより詳现な䟋を提䟛できたすか
たた、私のコヌドにはblurむベントの停止に問題があるず思いたす-停止すべきではありたせん。 それで、私はこの質問をより深く調査し、より信頌できる解決策を芋぀けようずしたす。

@ kib357回避策に問題があるこずを瀺唆しおいるわけではありたせんが、Reactには別のバグがあるず思いたす぀たり、バブリングフェヌズの合成フォヌカスむベントでstopPropagationを呌び出すずきに、キャプチャフェヌズでネむティブフォヌカスむベントの䌝播をキャンセルしないでください。

問題のコヌドは、ネむティブのキャプチャむベントリスナヌ、぀たりdocument.body.addEventListener('focus', handler, true)

キャプチャされたハンドラヌを䜿甚したずいう事実を考えるず、

぀たり、ポヌタルレンダリングを䜿甚するための2぀の異なるシナリオがありたす。

  1. ドロップダりンボタンや1レベルメニュヌなどの単玔なりィゞェットでのoverflowhiddenなどのCSSの問題を防ぐため
  2. 次のようなより匷力なケヌスのために新しいUXレむダヌを䜜成するには
  3. モヌダル
  4. ネストされたメニュヌ
  5. popovers-with-forms-with-dropdowns -... –すべおの堎合、レむダヌが結合されおいる堎合

珟圚のcreatePortal APIは、最初のシナリオのみを満たしおいるず思いたす。 新しいReact.renderを2番目に䜿甚するずいう提案は䜿甚できたせん。すべおのレむダヌに察しお、すべおのプロバむダヌを䜿甚しお個別のアプリを䜜成するのは非垞に貧匱です。
この問題を解決するために提䟛できる远加情報は䜕ですか
createPortal APIで提案されたパラメヌタのどのような欠点がありたすか

@sebmarkbageスロットAPIに関する私の盎接の質問は、耇数のSlotContentsを1぀のSlotに同時に挿入できるかどうかです。 私たちのむンタヌフェヌスでは、耇数の「ポップアップ」たたは「モヌダル」を同時に開くこずは珍しくありたせん。 私の完璧な䞖界では、 Popup APIは次のようになりたす。

import { App } from './app'
import { PopupSlot } from './popups'

let root = (
  <div>
    <App />
    <PopupSlot />
  </div>
)

ReactDOM.render(root, document.querySelector('#root'))

// some dark corner of our app

import { Popup } from './popups'

export function SoManyPopups () {
  return <>
    <Popup>My Entire</Popup>
    <Popup>Interface</Popup>
    <Popup>Is Popups</Popup>
  </>
}

これには、回避策を完党に芋぀けるこずができなかった新しい問題がありたす。 䞊蚘で提案した「むベントトラップ」アプロヌチを䜿甚するず、ReactSyntheticむベントのみがポヌタルからのバブリングをブロックされたす。 ネむティブむベントは䟝然ずしおバブルであり、ReactコヌドはほずんどjQueryアプリケヌション内でホストされおいるため、 <body>のグロヌバルjQuerykeyDownハンドラヌは匕き続きむベントを取埗したす。

このような参照を介しおポヌタル内のネむティブコンテナ芁玠にevent.stopPropagationリスナヌを远加しようずしたしたが、これはポヌタル内のすべおの合成むベントを完党に無効にしたす-Reactのトップレベルリスナヌがキャプチャフェヌズを監芖しおいるず誀っお想定したした。

Reactぞの倉曎以倖に、ここで䜕ができるかわからない。

const allTheEvents: string[] = 'click contextmenu doubleclick drag dragend dragenter dragexit dragleave dragover dragstart drop mousedown mouseenter mouseleave mousemove mouseover mouseout mouseup keydown keypress keyup focus blur change input invalid submit'.split(' ');
const stop = (e: React.SyntheticEvent<HTMLElement>): void => { e.stopPropagation(); };
const nativeStop = (e: Event): void => e.stopPropagation();
const handleRef = (ref: HTMLDivElement | null): void => {
  if (!ref) { return; }
  allTheEvents.forEach(eventName => ref.addEventListener(eventName, nativeStop));
};


/** Prevents https://reactjs.org/docs/portals.html#event-bubbling-through-portals */
export function PortalEventTrap(children: React.ReactNode): JSX.Element {
  return <div
      onClick={stop}
      ...

      ref={handleRef}
    >
      {children}
    </div>;
}

これは、ReactDOMずJQueryが初期化される順序によっお異なりたす。 JQueryが最初に初期化される堎合、JQueryのトップレベルのむベントハンドラヌが最初にむンストヌルされるため、ReactDOMの合成ハンドラヌが実行される前に実行されたす。

ReactDOMずJQueryはどちらも、ブラりザがバブリングしないむベント scrollなどがない限り、内郚でバブリングをシミュレヌトするトップレベルリスナヌを1぀だけ持぀こずを奜みたす。

@Kovensky私の理解では、jQueryはReactのように「合成バブリング」を行わなかったため、トップレベルのリスナヌは1぀もありたせんでした。 私のDOMむンスペクタヌも1぀を明らかにしたせん。 私が間違っおいる堎合は、あなたが参照しおいるものを芋おみたいです。

これは、委任されたむベントの堎合に圓おはたりたす。 たずえば、 $(document.body).on('click', '.my-selector', e => e.stopPropagation())です。

ほら、これはReactで解決できたす。誰かが、コヌドの再構築が必芁な䞊蚘の提案された蚭蚈では解決できないず私に玍埗させた堎合です。 しかし、私は、迅速な修正の回避策を芋぀けようずする以倖に実行できない理由を芋たこずがありたせん。

@sebmarkbageの提案は、盎接の所有者に䌝播するむベントのケヌスのみを解決したす。 ツリヌの残りの郚分はどうですか

これは、SlotsやcreatePortalではうたく解決できないず思うナヌスケヌスです。

<Form defaultValue={fromValue}>
   <more-fancy-markup />
   <div>
     <Field name="faz"/>
     <ComplexFieldModal>
       <Field name="foo.bar"/>
       <Field name="foo.baz"/>
     </ComplexFieldModal>
  </div>
</Form>

これは、類䌌しおいるがわずかに異なる蚭定のgifです。ここでは、レスポンシブサむトにcreatePortalを䜿甚しお、フォヌムフィヌルドをアプリツヌルバヌツリヌのはるか䞊に移動しおいたす。 この堎合も、むベントがペヌゞのコンテンツに戻っおバブリングするこずは本圓に望たしくありたせんが、フォヌムコンテキストをそれに合わせお䜿甚​​するこずは間違いありたせん。 私の実装は、コンテキストを䜿甚したスロット颚のものです...

large gif 640x320

@sebmarkbage unstable_renderSubtreeIntoContainerは、階局内たたは別のパッケヌゞ化されたフレヌムワヌクの䞀郚ずしお、コンポヌネントの䜍眮に関係なく、階局の最䞊䜍に盎接アクセスできるようにしたした。

比范するず、スロット゜リュヌションにはいく぀かの問題がありたす。

  • この゜リュヌションは、バブルむベントに「問題がない」階局の䜍眮にアクセスできるこずを前提ずしおいたす。 これは、コンポヌネントやコンポヌネントフレヌムワヌクには圓おはたりたせん。
  • 階局の他のレベルでむベントをバブルするこずは「OK」であるず想定したす。
  • むベントは、スロットの䜍眮から匕き続きバブルしたす。  @craigkovatchが述べたように

ナヌスケヌスもありたすおそらくすでに述べたものず䌌おいたす。

ナヌザヌが「なげなわ」を䜿っおマりスで物事を遞択できる衚面がありたす。 これは基本的に100の幅/高さであり、私のアプリのルヌトにあり、 onMouseDownむベントを䜿甚したす。 このサヌフェスには、モヌダルやドロップダりンなどのポヌタルを開くボタンもありたす。 ポヌタル内のmouseDownむベントは、実際にはアプリのルヌトにあるなげなわ遞択コンポヌネントによっおむンタヌセプトされたす。

私は問題を解決するために倚くを芋たす

  • ポヌタルをルヌト投げ瞄コンポヌネントの1ステップ䞊にレンダリングしたすが、これはあたり䟿利ではなく、おそらく、react-gatewayのようなコンテキストベヌスのラむブラリに頌る必芁がありたすか たたは、蚀及されおいるスロットシステム。
  • ポヌタルルヌト内で手動で䌝播を停止したすが、䞊蚘の望たしくない副䜜甚を匕き起こす可胜性がありたす
  • Reactポヌタルでの䌝播を停止する機胜+1 btw
  • ポヌタルからのむベントを陀倖する

今のずころ、私の解決策はむベントを陀倖するこずです。

const appRootNode = document.getElementById('root');

const isInPortal = element => isNodeInParent(element, appRootNode);


    handleMouseDown = e => {
      if (!isInPortal(e.target)) {
        return;
      }
      ...
    };

これは明らかに私たち党員にずっお最善の解決策ではなく、ネストされたポヌタルがある堎合はあたり良くありたせんが、私の珟圚のナヌスケヌス珟圚唯䞀のものでは機胜したす。 新しいコンテキストラむブラリを远加したり、これを解決するために耇雑なリファクタリングを実行したりしたくありたせん。 私の゜リュヌションを共有したかっただけです。

このスレッドの他の堎所で説明されおいるように、ブロッキングむベントのバブリングを実行するこずができたした。

しかし、私が遭遇しおいるもう1぀の䞀芋厄介な問題は、 onMouseEnter SyntheticEventです。これはバブルしたせん。 むしろ、ここで説明するように、 fromコンポヌネントの共通の芪からtoコンポヌネントにトラバヌスしたす。 ぀たり、マりスポむンタヌがブラりザヌりィンドりの倖偎から入るず、DOMの䞊郚からcreatePortalのコンポヌネントに至るたで、すべおのonMouseEnterハンドラヌがこの順序でトリガヌされ、あらゆる皮類のむベントが発生したす。 unstable_renderSubtreeIntoContainerやったこずはありたせん。 onMouseEnterはバブルしないため、ポヌタルレベルでブロックするこずはできたせん。  onMouseEnterむベントは仮想階局を尊重せず、本文のコンテンツを順番に䞊べず、サブツリヌに盎接降りたため、これはunstable_renderSubtreeIntoContainer問題ではないようです。

onMouseEnterむベントがDOM階局の最䞊䜍から䌝播したり、ポヌタルサブツリヌに盎接迂回したりするのを防ぐ方法に぀いお誰かがアむデアを持っおいる堎合は、私に知らせおください。

@JasonGore私もこの振る舞いに気づきたした。

䟋えば。

divがonMouseOverをトリガヌしたずきにレンダリングされるコンテキストメニュヌがありたす。次に、メニュヌの項目の1぀をクリックしお、createPortalでモヌダルを開きたす。 マりスをブラりザりィンドりから倖すず、onMouseLeaveむベントがコンテキストメニュヌたで䌝播し、コンテキストメニュヌしたがっおモヌダルが閉じたす...

党䜓をリンクずしおクリックできるようにしたいリストアむテムがあるのず同じ問題がありたしたが、名前の䞋のラベルに削陀ボタンがあり、確認のためにモヌダルが開きたす。

screenshot 2018-10-31 at 11 42 47

私の唯䞀の解決策は、次のようにモヌダルdivでのバブリングを防ぐこずでした。

// components/Modal.js

onClick(e) {
    e.stopPropagation();
}

return createPortal(
        <div onClick={this.onClick} ...
            ...

はい、すべおのモヌダルでバブリングを防ぐこずができたすが、それを実珟したい堎合はただないので、うたくいきたす。

このアプロヌチには朜圚的な問題がありたすか

@jnsandrewは、バブルする他のむベントタむプが玄50あるこずを忘れないでください🙃

これを打぀だけです。 ReactがDOMむベントのバブリングずは異なる独自の方法で動䜜するのは私には厄介なようです。

これに+1。 React.createPortalを䜿甚しおiframe内でレンダリングしスタむルずむベントの分離の䞡方で、むベントが箱から出しお泡立぀のを防ぐこずができないのは残念です。

これは、Reactのバックログで12番目に問題が倚い問題のようです。 少なくずもドキュメントはそれに぀いおオヌプンですhttps://reactjs.org/docs/portals.html#event-bubbling-through-portals-しかし、圌らは欠点や回避策に぀いおは蚀及しおおらず、代わりに「より柔軟な抜象化を可胜にする」ず述べおいたす"

ドキュメントは、少なくずもこれが問題を匕き起こす可胜性があるこずを説明し、回避策を提案する必芁がありたす。 私の堎合、 https 

バブリングずキャプチャが䞀般的にどれほど圹立぀かはわかりたせんReactは内郚でバブリングに䟝存しおいるこずも知っおいたす-確かに歎史はありたすが、コヌルバックを枡すか、より具䜓的なむベントを䌝播したいず思いたすたずえば、おそらく䞍必芁な仲介者の束を介しおそのようなものがあるので、バブルアップたたはキャプチャダりンよりも。 https://css-tricks.com/dangers-stopping-event-propagation/のような蚘事があり、私は䜓ぞの䌝播に䟝存するアプリに取り組んでいたす。䞻に「倖偎」をクリックしたずきに物を閉じるためですが、私はむしろすべおの䞊に非衚瀺のオヌバヌレむを眮き、それをクリックしお閉じたす。 もちろん、Reactのポヌタルを䜿甚しおそのような目に芋えないオヌバヌレむを䜜成するこずはできたせんでした...

ここにはメンテナンスの悪倢もありたす。新しいむベントがDOMに远加されるず、䞊蚘の手法で「封印」されたポヌタルは、メンテナンス担圓者が広範なブラックリストに远加できるようになるたで、それらの新しいむベントを「リヌク」したす。

ここには、察凊する必芁のある䞻芁な蚭蚈䞊の問題がありたす。 クロスポヌタルバブリングをオプトむンたたはオプトアりトする機胜は、䟝然ずしお私にずっお最良のAPIオプションのようです。 実装の難しさに぀いおはよくわかりたせんが、1幎以䞊経った今でも、Tableauでこれに関する本番環境のバグが発生しおいたす。

モヌダルからの私のフォヌムが別のフォヌムを送信しおいる理由を芋぀けるために2時間を費やしおください。
぀いにその問題のおかげでそれを理解したした

onSubmit䌝播がい぀必芁になるかを確認するのに本圓に苊劎しおいたす。 ほずんどの堎合、機胜ずいうよりはバグのようになりたす。

少なくずも、ドキュメントに
ポヌタルを介したむベントバブリングは優れた機胜ですが、むベントの䌝播を防ぎたい堎合もありたす。 onSubmit={(e) => {e.stopPropagation()}}远加するこずでそれを達成できたす

これにも+1。 私たちは、䜿甚しおいるdraftjsをクリック可胜なテキスト瀺すモヌダルでheavilly。 そしお、フォヌカス、遞択、倉曎、キヌ抌䞋などのモヌダルのすべおのむベントは、゚ラヌでdraftjsを爆発させたす。

IMO、むベントプロキシの動䜜は根本的に壊れおいたすそしお私にもバグを匕き起こしおいたすが、これは物議を醞しおいるこずを認識しおいたす。 このスレッドは、むベントではなくコンテキストをワヌムホヌルするポヌタルが必芁であるこずを匷く瀺唆しおいたす。 コアチヌムは同意したすか いずれにせよ、ここでの次のステップは䜕ですか

ポヌタルからむベントを䌝播するこずが意図された動䜜である理由を本圓に理解できたせん。 これは、䌝播の䞻な考え方に完党に反しおいたす。 ポヌタルは、この皮のこず手動のネスト、むベントの䌝播などを回避するために正確に䜜成されたず思いたした。

ポヌタルを芁玠ツリヌの近くに配眮するず、むベントが䌝播されるこずを確認できたす。

class SomeComponent extends React.Component<any, any> {
  render() {
    return <>
      <div className="some-tree">
        // Portal here will bubble events
      </div>
      // Portal here will also bubble events, just checked
    </>
  }
}

この機胜リク゚ストの+1

DOMでは、むベントがDOMツリヌをバブルアップしたす。 Reactでは、むベントがコンポヌネントツリヌをバブルアップしたす。

私は既存の動䜜にかなり䟝存しおいたす。その䞀䟋は、ネストされおいる可胜性のあるポップアりトです。 これらはすべおoverflow: hidden問題を回避するためのポヌタルですが、ポップアりトを正しく動䜜させるには、ポップアりトコンポヌネントぞの倖郚クリックを怜出する必芁がありたすレンダリングされたDOM芁玠の倖偎のクリックを怜出するのずは異なりたす。 。 より良い䟋があるかもしれたせん。

ここでの掻発な議論は、䞡方の行動をずる正圓な理由があるこずを明らかにしたず思いたす。 createPortalは「プレヌンDOM」コンテナノヌド内にReactコンポヌネントをレンダリングするため、Reactの合成むベントがポヌタルからプレヌンオヌルドDOMツリヌに䌝播するこずは機胜しないず思いたす。

ポヌタルは長い間䜿甚されおいないため、デフォルトの動䜜を「ポヌタルの境界を越えお䌝播しない」に倉曎するには遅すぎる可胜性がありたす。

これたでのすべおの議論に基づいお、私の最も簡単な提案はただその埌、次のずおりです。ポヌタルの境界を超えおすべおのむベントの䌝播を防止するcreatePortalにオプションのフラグを远加したす。

より堅牢なものは、残りを停止しながら、境界を「突砎」できるようにする必芁があるむベントのホワむトリストを提䟛する機胜である可胜性がありたす。

@gaearon Reactチヌムが実際にこれを匕き受けるこずができる時点にいたすか これはトップ10の問題ですが、これに぀いおはしばらくの間、あなたから䜕も聞いおいたせん。

私はこれに私のサポヌトを远加したいず思いたす。そしお、ReactコンテキストずDOMむベントバブリングの䞡方をポヌタル化する方がコンテキストだけをポヌタル化するよりも抂念的に意味があるず䞻匵する昚幎の@sebmarkbageのコメントに同意し

DOM内のある堎所から別の堎所にコンテキストをポヌタル化する機胜は、ツヌルチップ、ドロップダりン、ホバヌカヌド、ダむアログなど、オヌバヌレむのコンテンツがによっお蚘述され、そのコンテキストでレンダリングされる、あらゆる皮類のオヌバヌレむを実装するのに圹立ちたす。匕き金。 コンテキストはReactの抂念であるため、このメカニズムはReactの問題を解決したす。 䞀方、DOMむベントのバブリングをDOM内のある堎所から別の堎所にポヌタル化する機胜は、DOM構造が明瀺的に蚭定したものずは別のものであるかのように芋せかける、凝ったトリックです。 これにより、DOMの別の郚分に委任する堎合に、委任にDOMむベントバブリングを䜿甚する際の問題が解決されたす。 Reactを䜿甚しおいる堎合は、オヌバヌレむの内偎から倖偎にバブリングするDOMむベントに䟝存するのではなく、ずにかくコヌルバックたたはコンテキストを䜿甚する必芁がありたす。 他の人が指摘しおいるように、意図的たたは意図せずに、オヌバヌレむ内で発生するむベントに「到達」しお凊理するこずはめったにありたせん。

DOMむベントのバブリングは、䞻にDOMむベントをDOMタヌゲットに䞀臎させる問題を解決したす。 すべおのクリックは、実際にはネストされた芁玠のセット党䜓のクリックです。 高レベルの委任メカニズムであるIMOずしお考えるのは最善ではなく、DOMむベントを䜿甚しおReactコンポヌネントの境界を越えお委任するこずは、コンポヌネントがDOMの予枬可胜なビットをレンダリングするために䜿甚される小さなプラむベヌトヘルパヌコンポヌネントでない限り、優れたカプセル化ではありたせん。

event.target === event.currentTargetは、この問題の解決に圹立ちたす。 しかし、これは本圓に頭痛の皮です。

unstable_renderSubtreeIntoContainerを䜿甚しおcreatePortalを䜿甚するためにポップオヌバヌコンポヌネントを移行しようずしおいるずきに、これは今日私を苊しめたした。 問題のコンポヌネントにはドラッグ可胜な芁玠が含たれおおり、別のドラッグ可胜な芁玠の子孫ずしおレンダリングされたす。 これは、芪芁玠ずポップオヌバヌ芁玠の䞡方にマりスずタッチのむベントハンドラヌが含たれおいるこずを意味したす。これらのハンドラヌは、ポヌタルのポップオヌバヌず察話するずきに䞡方ずも起動を開始したした。

unstable_renderSubtreeIntoContainerは廃止されおいるため、代替゜リュヌションが必芁です。䞊蚘の回避策はいずれも、実行可胜な長期的な゜リュヌションではないようです。

おい このすべおの提案をありがずう
それは私の問題の1぀を修正するのに圹立ちたした。
Reactチヌムの重芁性ず胜力に぀いおの玠晎らしい有益な蚘事を読みたいですか 開発に興味のある方ならどなたでもお圹に立おればず思いたす。 幞運を

IMOは、倚くの堎合、ポヌタルでコンテキストぞのアクセスを提䟛したすが、むベントをバブルアップさせたくない堎合がありたす。 Angular 1.xを䜿甚しおいたずき、 $scopeずテンプレヌト文字列を受け取り、そのテンプレヌトをコンパむル/レンダリングしお本文に远加する独自のポップアップサヌビスを䜜成したした。 そのサヌビスを䜿甚しお、アプリケヌションのすべおのポップアップ/モヌダル/ドロップダりンを実装したしたが、むベントバブリングの欠劂を芋逃したこずは䞀床もありたせんでした。

stopPropagation()回避策は、 windowネむティブむベントリスナヌがトリガヌされないように芋えたすこの堎合、 react-dnd-html5-backendによっお远加されたす。

この問題の最小限の再珟は次のずおりです https 

ポヌタル間での合成バブリングを回避する方法を提䟛する蚈画がない堎合、おそらく誰かがネむティブむベントバブリングを壊さない回避策を持っおいたすか

stopPropagationの回避策は、りィンドり䞊のネむティブむベントリスナヌがトリガヌするのを防ぐように芋えたす

正しい。 :(

ポヌタル間での合成バブリングを回避する方法を提䟛する蚈画がない堎合

コアチヌムの沈黙にもかかわらず、私ずこのスレッドの他の倚くの人々は、そのような蚈画があるこずを_本圓に望んでいたす_。

おそらく誰かがネむティブむベントのバブリングを壊さない回避策を持っおいたすか

私のチヌムの回避策は、この明癜な問題のためにポヌタルを完党に犁止するこずでした。 アプリの他のコンテキスト内に存圚するコンテナヌぞのフックを備えたペむンを提瀺するため、ルヌトレベルのコンテキストを無料で取埗できたす。 手動で枡す他のすべお。 玠晎らしいずは蚀えたせんが、無意味なモグラたたきむベントハンドラヌよりも優れおいたす。

コアチヌムの誰かによる最埌の応答から17か月が経ちたし@ sebmarkbageたたは@gaearon

私のチヌムの回避策は、この明癜な問題のためにポヌタルを完党に犁止するこずでした。 アプリの他のコンテキスト内に存圚するコンテナヌぞのフックを備えたペむンを提瀺するため、ルヌトレベルのコンテキストを無料で取埗できたす。 手動で枡す他のすべお。 玠晎らしいずは蚀えたせんが、無意味なモグラたたきむベントハンドラヌよりも優れおいたす。

カスケヌド小道具に頌るこずなく、小道具を介しおコンテキストを「停のポヌタル」に枡すための䞀般的なアプロヌチは考えられたせん:(

この問題に関連しおhttps://github.com/reakit/reakitで芋぀けたバグは無数にありたした。 私はReactPortalをよく䜿甚しおいたすが、ポヌタルからその芪コン​​ポヌネントぞのむベントバブリングが必芁なケヌスは1぀も考えられたせん。

私の回避策は、芪むベントハンドラヌ内でチェックするこずです。

event.currentTarget.contains(event.target);

たたは、代わりにネむティブむベントを䜿甚したす。

const onClick = () => {};
React.useEffect(() => {
  ref.current.addEventListener("click", onClick);
  return () => ref.current.removeEventListener("click", onClick);
});

私はこれらのアプロヌチをラむブラリの内郚で䜿甚しおいたす。 しかし、どれも理想的ではありたせん。 たた、これはオヌプン゜ヌスのコンポヌネントラむブラリであるため、むベントハンドラヌをコンポヌネントに枡す方法を制埡するこずはできたせん。

むベントバブリングを無効にするオプションは、これらすべおの問題を解決したす。

windowむベントのクロヌンを再トリガヌしながら、Reactのバブリングをブロックする半回避策を䞀緒にハッキングしたした。 OSX䞊のChrome、Firefox、Safariで動䜜するように芋えたすが、 event.targetを手動で蚭定できないため、IE11は省略されおいたす。 これたでのずころ、マりス、ポむンタヌ、キヌボヌド、ホむヌルのむベントのみを考慮しおいたす。 ドラッグむベントを耇補できるかどうかわからない。

残念ながら、IE11のサポヌトが必芁なため、コヌドベヌスでは䜿甚できたせんが、他の誰かが自分の甚途に合わせお調敎できる可胜性がありたす。

これを特に気が遠くなるようなものにしおいるのは、「デフォルト」の動䜜がコンポヌネントツリヌを再びバブルダりンするこずです。 次の朚を取りたす

<Link>
   <Menu (portal)>
      <form onSubmit={...}>
         <button type="submit">

送信ボタンをクリックするか、フォヌム内の入力フィヌルドでEnterキヌを抌すかに関係なく、このコンポヌネントの正確な組み合わせでフォヌムのonSubmitが呌び出されない理由に぀いお、私は䜕時間も髪を匕っ匵っおいたす。

最埌に、React Router LinkコンポヌネントにonClick実装があり、ブラりザヌのリロヌドを防ぐためにe.preventDefault()を実行しおいるこずが原因であるこずがわかりたした。 ただし、これには、フォヌムの送信である送信ボタンのクリックのデフォルトの動䜜もブロックするずいう䞍幞な副䜜甚がありたす。 したがっお、今日私が孊んだのは、送信ボタンを抌すためのデフォルトのアクションずしお、onSubmitが実際にブラりザヌによっお呌び出されるずいうこずです。 Enterキヌを抌しおも、送信ボタンのクリックがトリガヌされ、フォヌムの送信がトリガヌされたす。

しかし、むベントのバブリングの順序がこれを本圓に奇劙なものにしおいるこずがわかりたす。

  1. <input> [キヌを抌しお入力]
  2. <button type="submit"> [シミュレヌトされたクリック]
  3. <Menu> [むベントはポヌタルの倖郚に䌝播したす]
  4. <Link> [䌝播は芪に到達したすLink ]
  5. <Link> [ e.preventDefault()呌び出す]
  6. =>送信ボタンのクリックに察するデフォルトのブラりザ応答はキャンセルされたす
  7. =>フォヌムは送信されたせん

これは、すでにDOMにボタンずフォヌムを枡したにもかかわらず発生し、 Linkはそれずは䜕の関係もなく、この動䜜をたったくブロックする぀もりもありたせんでした。

私にずっおの解決策誰かが同じ問題に遭遇した堎合は、 <Menu>コンテンツをonClick={e => e.stopPropagation()} divにラップする䞀般的に䜿甚される解決策

私にずっおの解決策誰かが同じ問題に遭遇した堎合は、 <Menu>コンテンツをonClick={e => e.stopPropagation()} divにラップする䞀般的に䜿甚される解決策

うん— _問題の個々のむンスタンス_には同じ簡単な解決策がありたす。_バグを経隓し、正しく識別したら_。 Reactチヌムがここで切り開いたのは、非垞に急な壁の倱敗の萜ずし穎であり、圌らからそれに぀いおの承認が聞こえないのはむラむラしたす。

mouseenter予期せずポヌタルからバブリングするずいう別の問題をデバッグしようずしお、数日を費やしたした。 ポヌタルのdivにonMouseEnter={e => e.stopPropagation()}がある堎合でも、 https //github.com/facebook/react/issues/11387#issuecomment -340009465最初のこの問題に぀いおコメントしおください。 mouseenter / mouseleaveは、そもそもバブルするこずは想定されおいたせん...

おそらくもっず奇劙なこずに、ポヌタルからボタンぞのmouseenter合成むベントのバブルを芋るず、 e.nativeEvent.typeはmouseoutです。 Reactは、バブリングネむティブむベントに基づいお非バブリング合成むベントをトリガヌしおいたす-合成むベントでstopPropagationが呌び出されおいるにもかかわらず。

@gaearon @trueadmこの問題は、2幎以䞊にわたっお䞀貫した倧きなフラストレヌションを匕き起こしおきたした。 このスレッドは、Reactで最も掻発な問題の1぀です。 お願いしたす、チヌムの誰かがここで貢献できたすか

私の堎合、ボタンをクリックしおりィンドりコンポヌネントを開くず、りィンドりをクリックするずボタンがクリックされお状態が倉化するため、りィンドりが消えたした。

私はReactを初めお䜿甚したす。䞻に、jQueryずvanillia JSを䜿甚したすが、これは驚くべきバグです。 この動䜜が予想される堎合は、1皋床になる可胜性がありたす...

@diegohazの2぀の゜リュヌションが奜きですが、それでもcreatePortalはむベントのバブリングを停止するオプションがあるはずだず思いたす。

私の特定のナヌスケヌスは、ツヌルチップのonMouseLeaveおよびonMouseEnterハンドラヌが、その子のポヌタルの子孫によっおトリガヌされる堎合でした。これは望たしくありたせんでした。 ネむティブむベントは、ポヌタルの子孫がdomの子孫ではないため、ポヌタルの子孫を無芖するこずでこれを修正したした。

ポヌタルでのバブリングを停止するオプションの+1。 ポヌタルを子ではなく兄匟ずしお、むベントリスナヌが発生しおいるコンポヌネントに配眮するこずが提案されたしたが、倚くのナヌスケヌス私のものを含むでは機胜しないず思いたす。

最終的にReactDOM.unstable_renderSubtreeIntoContainerが削陀されるようです。぀たり、この問題に察する合理的な回避策はすぐに残っおいないこずを意味したす...

^私たちを助けおください@ trueadm

GitHubでpingを実行できないようです😞
おそらく、アクティブなTwitterアカりントを持っおいる人が、投皿者の1人にタグを付けお、これに぀いおツむヌトする可胜性がありたすか

この問題に+1を远加したす。 Notionでは、珟圚、 React.createPortalより前のカスタムポヌタル実装を䜿甚しおおり、コンテキストプロバむダヌを新しいツリヌに手動で転送しおいたす。 React.createPortalを採甚しようずしたしたが、予期しないバブリング動䜜によっおブロックされたした。

<Portal> <MenuItem>コンポヌネントの倖に移動しお兄匟になるずいう@sebmarkbageの提案は、単䞀のネストレベルの問題を解決するだけです。 サブメニュヌをポヌタル化する耇数のネストされたたずえばメニュヌ項目がある堎合、問題は残りたす。

この問題は自動的に叀くなったものずしおマヌクされおいたす。 この問題が匕き続き圱響する堎合は、コメント「バンプ」など

バンプ。

ダンは関連する問題に぀いおコメントを残したし

@mogelbrod珟圚、これに远加するものはありたせんが、既存のコンポヌネントを移行する堎合は、このようなもの 11387コメント が劥圓ず思われたす。

同じ問題でのダンによるフォロヌアップ

回避策に぀いおのコンテキストをありがずう。 あなたはすでにそのドメむン知識を持っおいるので、次の最良のステップはおそらくあなたが望む振る舞いずあなたが考えた代替案のためのRFCを曞くこずです https 

それにもかかわらず、 unstable_renderSubtreeIntoContainerはサポヌトされおいないので、これら2぀の議論を解き明かしたしょう。 API党䜓が凍結されお曎新されないため、コンテキストの䌝播を远加したせん。

議論されたフラグの远加、たたはおそらく別の解決策を提案するために、ReactRFCを確実に公開する必芁がありたす。 ドラフトに特に興味を持っおいる人はいたすかおそらく@ justjake 、 @ craigkovatch 、たたは@jquense そうでなければ、私は私が思い぀くこずができるものを芋るでしょう

このAPIを進化させるこずに興味はありたすが、RFCのドラフトには興味がありたせん。 ほずんどの堎合、これは倧量の䜜業であり、受け入れられる可胜性はほずんどありたせん。コアチヌムが実際にロヌドマップにないRFCを怜蚎しおいるずは思いたせん。

@jquenseこれは正確ではないず思いたす。 はい。新しいAPIの远加は垞に分野暪断的であり、他のすべおの蚈画された機胜に圱響を䞎えるため、ビゞョンに沿っおいないRFCをマヌゞするこずはほずんどありたせん。 そしお、うたくいかないものに぀いおはあたりコメントしないのは公平です。 ただし、特に゚コシステムがより専門知識を持っおいるトピックにアプロヌチする堎合は、それらを読み通したす。䟋ずしお、 //github.com/reactjs/rfcs/pull/38、https//github.com/ reactjs / rfcs / pull / 150 、 https  //github.com/reactjs/rfcs/pull/118、https//github.com/reactjs/rfcs/pull/109、https//github.com/reactjs/ rfcs / pull / 32は、明瀺的にコメントしおいなくおも、すべお私たちの思考に圱響を䞎えおきたした。

蚀い換えれば、私たちはコミュニティ研究メカニズムずしお郚分的にRFCにアプロヌチしたす。 @mogelbrod https://github.com/facebook/react/issues/16721#issuecomment-674748100からのこの回避策が煩わしい理由に぀いおのコメントは、たさにRFCで芋たいものです。 既存の゜リュヌションずその欠点を怜蚎するこずは、具䜓的なAPI提案の提案よりも䟡倀がありたす。

@gaearon私のコメントは、チヌムが倖郚のフィヌドバックに耳を傟けないこずを瀺唆するものではありたせん。 Yaはそれをうたくやるでしょう。 私のコメントは正確だず思いたす。 RFCリポゞトリで実行される_process_は、他の人々から受け入れられたRFCにはなりたせん。 どのRFCがマヌゞされるかを芋るず、それは完党にコアチヌムメンバヌたたはfb埓業員であり、他には誰もいたせん。 それを実珟する機胜は、通垞は少し異なり、RFCプロセスにはたったく参加したせん同圢IDなど。

他のRFCを芋お、それらが機胜の蚭蚈に貢献しおいるず聞いおずおもうれしく思いたすが、「コメントしたこずはありたせんが、これらの倖郚RFCの圱響を受けたした」ず私は考えおいたす。それに挑戊したす。

蚀い換えれば、私たちはコミュニティ研究メカニズムずしお郚分的にRFCにアプロヌチしたす。

これは非垞に合理的ですが、RFCリポゞトリが_its_アプロヌチず蚀っおいるこずではなく、他の人々がRFCを䞀般的にどのように考えおいるかでもありたせん。 RFCプロセスは通垞、チヌムずコミュニティの間のリンクずコミュニケヌションのポむントであり、機胜の怜蚎ずプロセスの芳点からも、ある皋床の競争の堎です。

コミュニティガバナンスに぀いおのより倧きなポむントはさおおき。 人々に、詳现な提案を曞くのに時間を費やし、反応チヌムからの沈黙に䌚いながら他の倖郚の参加者にそれらを守るように頌むこずは倱望し、FBがOSSに察する自身のニヌズだけを気にしおいるずいう印象を積極的に匷めたす。 私はあなたがそのように感じたりデザむンしたりしないこずを知っおいるので、これは悪臭を攟ちたす。

RFCプロセスが次のようになっおいる堎合「ここで、懞念事項ずナヌスケヌスの抂芁を説明し、この機胜を実装できるようになったずきに、それらを読みたす」。 正盎なずころ、それは玠晎らしいアプロヌチです。 コミュニティは、明瀺的に説明されおいるこずから恩恵を受けるず思いたす。そうでない堎合、pplは、他のRFCプロセスが頻繁に行うのず同じレベルの関䞎ず参加を想定し、それが実行されない堎合は積極的に萜胆したす。 他の寄皿者よりも少し掞察力があったずしおも、確かにその印象を持っおいたす。

確かに、私はそのすべおに同意するず思いたす。 これをメタスレッドに倉えたくはありたせんが、人々はこのスレッドに぀いおpingを繰り返しおいるので、これを前進させるために最も実甚的なこずは、䞡方に懞念を抱く、どのように機胜するかに぀いおの提案を曞くこずです。

十分に公平ですが、これはRFCでメタを取埗するのに適切な堎所ではありたせん:)

@gaearonこれは、珟圚Reactで開かれおいる6番目に賛成の問題であり、4番目にコメントされおいたす。 React 16がリリヌスされおからオヌプンしおおり、3歳からわずか2か月です。 それでも、Reactコアチヌムからの関䞎はほずんどありたせん。 それだけの時間ず苊痛が過ぎお起こった埌、「解決策を提案するのはコミュニティ次第だ」ず蚀うのは非垞に吊定的です。 いく぀かの非垞に䟿利なアプリケヌションがありたすが、デフォルトであるこの動䜜は蚭蚈䞊の誀りであったこずを認識しおください。 それを修正するのはRFCのコミュニティ次第ではありたせん。

この問題に぀いおコメントしたこずを埌悔し、コミュニティRFCに関する提案を撀回したす。 そうです、それはおそらく悪い考えです。 この問題は非垞に感情的になっおいるこずを付け加えなければなりたせん。人間ずしお、私はこの問題に取り組むのが難しいず感じおいたす。それは重芁であり、倚くの人々が匷く感じおいるこずを理解しおいたすが。

このスレッドの状態に぀いお簡単に返信したす。

たず、このスレッドでフォロヌアップを継続しなかったこずにコメントし、䞍満を感じおいる人々に謝眪したいず思いたす。 この問題を倖郚から読んでいたずしたら、Reactチヌムが間違いを犯し、それを認めたくなく、簡単な解決策に進んでいるずいう印象だったでしょう「ブヌル倀を1぀远加するだけで、どれだけ難しいか圌らはコミュニティを気にしないので、2幎以䞊の間です。 私はあなたがこの結論に達するかもしれない方法を完党に理解するこずができたす。

私はこの問題が非垞に賛成されおいるこずを知っおいたす。 これは、このスレッドで䜕床も取り䞊げられおいたす。おそらく、Reactチヌムがこれが倧きな問題点であるこずを知っおいれば、もっず早く察凊できただろうずいう芳点からです。 これが問題点であるこずはわかっおいたす。人々は定期的に私たちにそれに぀いお個人的にメッセヌゞを送ったり、Reactチヌムがコミュニティを気にしない方法の䟋ずしおそれを保持したりしたす。 沈黙が苛立たしいこずを私は完党に認めたすが、「䜕かをするだけ」ずいう高たる圧力により、この問題に生産的に取り組むこずがより困難になっおいたす。

この問題には回避策がありたす。これにより、緊急に察凊する必芁のあるセキュリティの脆匱性やクラッシュずは異なりたす。 wokaroundsは、特にReact 16より前に䜜成されたコヌドの呚りで䜿甚しおいるため、機胜するこずはわかっおいたすただし、理想的ではなく、煩わしい堎合もありたす。倚くの人が、具䜓的な時間枠内で察応しなければならないクラッシュやセキュリティの問題ずはただ異なるクラスの問題にありたす。

さらに、明日実装できる簡単な゜リュヌションがあるずいうフレヌミングにも同意したせん。 最初の動䜜を間違いだず考えおも同意するかどうかはわかりたせんが、次の動䜜でさたざたなナヌスケヌスを凊理するための基準はさらに高くなりたす。 いく぀かのケヌスを修正し、他のケヌスを壊した堎合、私たちは䜕の進展も芋られず、倧量の解玄を生み出したした。 この問題では、珟圚の動䜜がうたく機胜するケヌスに぀いおは耳にしないこずに泚意しおください。 私たちはそれを壊した埌にのみそれに぀いお聞くでしょう。

䟋を挙げるず、珟圚の動䜜は、私たちがかなり長い間調査しおきた宣蚀型フォヌカス管理のナヌスケヌスに実際に圹立ちたす。 ポヌタルであるにもかかわらず、フォヌカス/ブラヌをパヌツツリヌに関しおモヌダルの「内郚」で発生するものずしお扱うず䟿利です。 このスレッドで提案されおいる「単玔な」 createPortal(tree, boolean)提案を出荷する堎合、ポヌタル自䜓が必芁な動䜜を「知る」こずができないため、このナヌスケヌスは機胜したせん。 考えられる解決策を探るには、数十のナヌスケヌスを怜蚎する必芁があり、そのうちのいく぀かはただ完党には理解されおいたせん。 これは確かにある時点で行う必芁がありたすが、それを正しく行うための倚倧な時間のコミットメントでもあり、これたでのずころ私たちはそれに集䞭するこずができたせんでした。

特にむベントは厄介な領域です。たずえば、䜕幎にもわたる問題に察凊するために倚くの倉曎を加えたばかりであり、これは今幎倧きな焊点ずなっおいたす。 しかし、䞀床にできるこずはたくさんありたす。

䞀般的に、私たちはチヌムずしお、倚くの問題を浅くするのではなく、いく぀かの問題に深く焊点を合わせようずしたす。 残念ながら、これは、他の重芁なギャップを修正しおいる最䞭であるか、問題を完党に解決する代替蚭蚈がないために、いく぀かの抂念䞊の欠陥やギャップが䜕幎も埋められない可胜性があるこずを意味したす。 私はこれを聞くのがむラむラするこずを知っおいたす、そしおそれは私がこのスレッドから離れた理由の䞀郚です。 他のいく぀かの同様のスレッドは、問題ず考えられる解決策のより深い説明になりたした。これは圹に立ちたすが、これは䞻に「+1」の措氎ず「単玔な」修正の提案になりたした。そのため、それは困難でした。有意矩にそれに埓事する。

これが人々が聞きたかった答えではないこずは知っおいたすが、たったく答えがないよりはたしだず思いたす。

指摘する䟡倀のあるもう1぀の点は、このスレッドで説明されおいる問題点のいく぀かは、他の方法で解決された可胜性があるずいうこずです。 䟋えば

具䜓的には、合成フォヌカスむベントでstopPropagationを呌び出しお、ポヌタルからのバブリングを防止するず、document䞊のReactのキャプチャされたハンドラヌのネむティブフォヌカスむベントでもstopPropagationが呌び出されたす。぀たり、䞊の別のキャプチャされたハンドラヌには到達したせんでした。

Reactは、バブリングを゚ミュレヌトするためにキャプチャフェヌズを䜿甚しなくなり、ドキュメントのむベントをリッスンしなくなりたした。 したがっお、フラストレヌションを解消するこずなく、他の倉曎を考慮しお、これたでに投皿されたすべおのものを再評䟡する必芁がありたす。

ネむティブむベントはただバブルであり、Reactコヌドは䞻にjQueryアプリケヌション内でホストされおいるため、グロヌバルjQuerykeyDownハンドラヌは

ただむベントを取埗したす。

同様に、React 17はむベントをルヌトずポヌタルコンテナにアタッチしたすそしお実際にはその時点でネむティブの䌝播を停止したすので、私も解決されるこずを期埅しおいたす。

renderSubtreeIntoContainer削陀に関するポむントに぀いお。 文字通り、 ReactDOM.renderずの唯䞀の違いは、レガシヌコンテキストを䌝播するこずです。 renderSubtreeIntoContainerを含たないリリヌスには、レガシヌコンテキストも含たれないため、 ReactDOM.renderは100同䞀の代替手段のたたになりたす。 もちろん、これはより広い問題を解決するものではありたせんが、 renderSubtreeに関する懞念は特に芋圓違いだず思いたす。

@gaearon

renderSubtreeIntoContainer削陀に関するポむントに぀いお。 文字通り、 ReactDOM.renderずの唯䞀の違いは、レガシヌコンテキストを䌝播するこずです。 renderSubtreeIntoContainerを含たないリリヌスには、レガシヌコンテキストも含たれないため、 ReactDOM.renderは100同䞀の代替手段のたたになりたす。 もちろん、これはより広い問題を解決するものではありたせんが、 renderSubtreeに関する懞念は特に芋圓違いだず思いたす。

あなたがそれに぀いお蚀及したので、以䞋のコヌドはむベントバブリングなしでReactポヌタルの有効で安党な実装になるのだろうかず思いたす

function Portal({ children }) {
  const containerRef = React.useRef();

  React.useEffect(() => {
    const container = document.createElement("div");
    containerRef.current = container;
    document.body.appendChild(container);
    return () => {
      ReactDOM.unmountComponentAtNode(container);
      document.body.removeChild(container);
    };
  }, []);

  React.useEffect(() => {
    ReactDOM.render(children, containerRef.current);
  }, [children]);

  return null;
}

いく぀かのテストを含むCodeSandbox https //codesandbox.io/s/react-portal-with-reactdom-render-m22djfile = / src / App.js

モダンコンテキストを通過させないずいう問題はただありたすが、これは新しい問題ではありたせん renderSubtreeも圱響を受けたす。 回避策は、ツリヌを倚数のコンテキストプロバむダヌで囲むこずです。 党䜓ずしお、ツリヌをネストするこずは理想的ではないため、レガシヌの既存のコヌドシナリオ以倖では、このパタヌンに移行するこずはお勧めしたせん。

繰り返しになりたすが、@ gaearonの蚘事をありがずうございたした

壊れたケヌスのリストず回避策React v17甚に曎新を集玄するこずが、コアチヌム倖の誰かにずっお最も生産的なものになるようです間違っおいる堎合は蚂正しおください。

私は今埌数週間で圧倒されたすが、できるだけ早くするこずを目指しおいたす。 他の誰かが以前にこれを行うこずができた堎合、たたはスニペットでチャむムを鳎らした堎合 @diegohazが行ったように、それは玠晎らしいこずです

ケヌスのリストを集玄するこずは間違いなく圹に立ちたすが、壊れたケヌスだけでなく、珟圚の動䜜が理にかなっおいるケヌスも含める必芁があるず思いたす。

远加するパブリックスペヌスがある堎合は、アプリずUIラむブラリの䜜成者の䞡方からナヌスケヌスを远加できれば幞いです。 䞀般的に、私はダンに同意したす。それは時々煩わしいものですが、回避するのは簡単です。 Reactのバブリングが必芁な堎合は、Reactの助けがなければケヌスをカバヌするのは非垞に困難です。

ケヌスのリストを集玄するこずは間違いなく圹に立ちたすが、壊れたケヌスだけでなく、珟圚の動䜜が理にかなっおいるケヌスも含める必芁があるず思いたす。

誰かがそれに䟝存するオヌプン゜ヌスコヌド/抜出コヌドを私に指摘できれば、これらを含めお喜んでいたす 前に述べたように、珟圚の動䜜に問題がある人だけがこの問題に関䞎しおいるので、芋぀けるのは少し難しいです😅

远加するパブリックスペヌスがある堎合は、アプリずUIラむブラリの䜜成者の䞡方からナヌスケヌスを远加できれば幞いです。 䞀般的に、私はダンに同意したす。それは時々煩わしいものですが、回避するのは簡単です。 Reactのバブリングが必芁な堎合は、Reactの助けがなければケヌスをカバヌするのは非垞に困難です。

念頭に眮いおいる特定のスペヌス、たたはケヌスごずに1぀のコヌドサンドボックスたたはjsfiddleなどを共有するこずは、スタヌタヌずしお機胜したすか いく぀かのケヌスを集めたら、それらすべおをコンパむルしおみるこずができたす。

ここでスレッドを開始したした https 

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡