React: パッシブむベントリスナヌのサポヌト

䜜成日 2016幎04月07日  Â·  62コメント  Â·  ゜ヌス: facebook/react

https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md

デフォルトですべおをパッシブにし、必芁な堎合にのみアクティブにオプトむンするこずをお勧めしたす。 たずえば、テキスト入力むベントをリッスンするこずはできたすが、アクティブなリスナヌがある堎合は、preventDefaultたたは䜿甚される制埡された動䜜のみが可胜です。

同様に、これをReactNativeのスレッドモデルず統合するこずもできたす。 たずえば、キヌストロヌクの凊理など、アクティブなリスナヌがある堎合にUIスレッドを同期的にブロックするこずができたす。

cc @vjeux @ide

DOM React Core Team Big Picture Feature Request

最も参考になるコメント

ホむヌルむベントの凊理に぀いおChromeで譊告が衚瀺されたした。これは、パッシブむベントハンドラヌずしお登録されおいる堎合に最適化できたす。 だから、これをReactに入れるのはいいこずだろう

党おのコメント62件

これはChrome51に導入されたした。Reactでこれをサポヌトするための曎新された蚈画はありたすか O

Reactのドキュメントにむベントリスナヌが1぀しかなく、他のリスナヌに委任する堎合、これはどのように可胜ですか
@sebmarkbage

パッシブむベントの問題の珟圚のステヌタスは䜕ですか

ホむヌルむベントの凊理に぀いおChromeで譊告が衚瀺されたした。これは、パッシブむベントハンドラヌずしお登録されおいる堎合に最適化できたす。 だから、これをReactに入れるのはいいこずだろう

たた、Firefoxに毎晩すでに着陞しおいるonceなどの任意のオプションを凊理するこずもできたす https  https 

FWIW、Facebookはアクティブなホむヌルむベントをリッスンしお、サむドバヌたたはチャットりィンドりがスクロヌルされたずきに倖偎のスクロヌルをブロックしたす。 それなしではUIを実装できたせん。 これをオプションずしおサポヌトしたいのですが、問題領域はただ䞍完党であるため、パッシブむベントリスナヌを含たないこの問題の代替゜リュヌションが進化する可胜性がありたす。 ですから、それはただアクティブなデザむンスペヌスです。

䞡方のアクティブリスナヌを維持し、パッシブリスナヌのサポヌトを远加するこずが重芁です。
デスクトップアプリケヌションでは違いは芋られたせんが、モバむルアプリではパッシブスクロヌルリスナヌによっお速床が倧幅に向䞊したす。

少しの提案

<SomeElement
  onScroll={this.onScrollThatCallsPreventDefault}
  onScrollPassive={this.onScrollThatJustListens}
  ...this.props
/>

@romulofええ、これはキャプチャフェヌズでもむベントを登録する方法です

<SomeElement
  onClick={this.onClick}
  onClickCapture={this.onClickCapture}
  onScrollPassive={this.onScrollPassive}
/>

したがっお、これはパッシブむベントもサポヌトするための適切なAPIになるず思いたす。

補足トリッキヌな質問は、キャプチャフェヌズのパッシブむベントをどのように登録するかです。 パッシブむベントの性質䞊、これは䞍可胜だず思いたす。 圌らはevent.preventDefault()を呌び出すこずさえ蚱可されおいないので、おそらくこれは問題ではありたせん。

@radubrehar 、 onScrollCapturePassiveは、キャメルケヌスに入った聖曞党䜓のように芋えたす。

:)キャプチャフェヌズにはパッシブむベントがないため、そうではありたせん。

確かにそれは意味がありたせんが、私はそれを圓おにしたせん。 onceなど、他のタむプのむベントバむンディングもありたす。

別の提案

<SomeElement
  onScroll={this.onScrollThatCallsPreventDefault}
/>
<SomePassiveElement
  onScroll={{
    passive: true,
    capture: true,
    handler: this.onScrollThatJustListens,
  }}
/>

このように、Reactは、むベントハンドラヌが関数通垞のバむンディングであるか、バむンディングオプションずハンドラヌ関数を含むオブゞェクトであるかを怜出する必芁がありたす。

オプションを䜿甚したオブゞェクトアプロヌチは、必芁になる可胜性のある他のオプションがあるため、 onFooPassiveよりも理にかなっおいるず思いたす。 むベントはデフォルトでパッシブである必芁があるずいう@sebmarkbageの提案ず組み合わせるず、これはおそらくそれほど面倒ではないでしょう。

頭に浮かぶもう1぀のアプロヌチは、プロパティをむベントハンドラヌにアタッチしお、パッシブモヌドをオプトアりトできるようにするたたは他のオプションを切り替えるこずです。 このようなもの

class Foo extends React.Component {
  constructor() {
    this.handleScroll = this.handleScroll.bind(this);
    this.handleScroll.passive = false;
  }

  handleScroll() {
    ...
  }

  render() {
    return <div onScroll={this.handleScroll} />;
  }
}

理論的には、デコレヌタが着地するず、これはデコレヌタで非垞にうたく機胜したす。

これに぀いおもう少し考えおみるず、個々のオプションではなく、むベントオプションプロパティを関数に远加する方がよいず思いたす。 これにより、Reactは、朜圚的に倚くのプロパティではなく、1぀のプロパティに぀いおのみ心配する必芁がありたす。 したがっお、䞊蚘の䟋を調敎するには、次のようにしたす。

class Foo extends React.Component {
  constructor() {
    this.handleScroll = this.handleScroll.bind(this);
    this.handleScroll.options = { passive: false };
  }

  handleScroll() {
    ...
  }

  render() {
    return <div onScroll={this.handleScroll} />;
  }
}

私が思い぀いたもう1぀の考えは、これらのオプションがJSXを介しお枡されるように、 JSX構文を

return <div onScroll={this.handleScroll, { passive: false }} />;

私はたた、むベントがデフォルトでパッシブであるべきかどうかに぀いおも考えおいたした、そしお私は少しフェンスにいたす。 䞀方では、これはスクロヌルハンドラヌのようなむベントには確かに䟿利ですが、倚くのクリックハンドラヌで乱気流が発生し、予期しない動䜜が発生するのではないかず心配しおいたす。 デフォルトでパッシブなむベントずそうでないむベントがあるようにするこずもできたすが、それはおそらく人々を混乱させるだけなので、おそらく良い考えではありたせん。

この方法は、JSX構文を倉曎するこずなく、以前に提案した方法ず非垞によく䌌おいたす。

return <div onScroll={{ handler: this.handleScroll, passive: true }} />;

そしお、ドキュメントは簡単です

div.propTypes = {
  ...
  onScroll: React.PropTypes.oneOf([
    React.PropTypes.func,
    React.PropTypes.shape({
      handler: React.PropTypes.func.isRequired,
      capture: React.PropTypes.bool,
      passive: React.PropTypes.bool,
      once: React.PropTypes.bool,
    }),
};

反応むベントはデフォルトでパッシブですか 少なくずもタッチむベントではそうです。 バニラドキュメントレベルのむベントリスナヌにフォヌルバックしない限り、 preventDefault実行するこずはできたせん。

@joshjg Reactハンドラヌには、ネむティブむベントに䌌おいたすが、異なる「合成むベント」が枡されたす。 ちなみに、私は実際にこれを行うコヌドを読んでいないので、より倚くの知識を持っおいる人が私が蚀おうずしおいるこずを蚂正する必芁がありたす。

私は実装の詳现にあたり粟通しおいたせんが、 preventDefaultは、少なくずも_防止しおいるハンドラヌがReactむベントハンドラヌでもある限り_機胜するこずを知っおいたす。 ずにかく、それは私の経隓です。

stopPropagationを䜿甚するず、運が悪くなる可胜性が高くなりたすたずえば、Reactにバむンドできないdocumentクリックリスナヌがあり、内郚をクリックした堎合にバブリングを回避したい堎合など特定の芁玠。 その堎合、次を䜿甚できたす。

function stopPropagation (e) {
  e.stopPropagation();
  e.nativeEvent.stopImmediatePropagation();
}

[[MDN]https://developer.mozilla.org/en-US/docs/Web/API/Event/stopImmediatePropagation]

これはメむントピックから少し倖れたしたが、簡単に蚀えば、Reactはパッシブむベントを䜿甚せず、奇劙な順序で凊理されるこずがありたす。

@joshjg @ benwiley4000 @gaearon最近、

https://www.chromestatus.com/features/5093566007214080を参照しお

これにより、Reactの動䜜方法が間接的に倉曎されたした-むベントをアタッチするずきにReactがpassive: falseに぀いお明瀺的に蚀及しおいないず思いたす-したがっお、動䜜が倉曎されたした。

私もこれをヒットしたした-したがっお、addEventListenerを䜿甚しおタッチむベントを手動で登録する必芁がありたす

クロヌムパッシブ・バむ・デフォルト介入のみに適甚されるこずに泚意touchstartずtouchmoveではない、 wheel 。 したがっお、明瀺的な{passive: true}ないwheelむベントは、マりスホむヌルず2本指のトラックパッドスクロヌルの堎合でも、同期スクロヌルを匷制したす。 私はここにいく぀かの埮劙な点に぀いおのブログ投皿を曞きたした。

たた、私たちEdgeチヌムは同じ介入を実装する぀もりはないので、パッシブむベントリスナヌを出荷するずきは、 {passive: true}を明瀺的に指定する必芁がありたす。

参考たでに、私はパッシブfalseパスを䞋り始め、スクロヌルdivがあるずきにモバむルで本䜓がスクロヌルしないようにしたしたが、preventDefaultを䜿甚しおスクロヌルをブロックするのは少し重いです。 divが存圚するかどうかに応じおハンドラヌを远加および削陀するか、body.height = 100アプロヌチにフォヌルバックするこずができたす。 body.heightの修正は少しハッキヌな感じがしたすが、パッシブは必芁ありたせん。falseです。

私のナヌスケヌスでは、 event.preventDefault()メ゜ッドを䜿甚しお、ナヌザヌが芁玠をコンテナ内にドラッグしおいるずきにコンテナがスクロヌルしないようにしたす。

そのためには、むベントリスナヌを非パッシブパッシブfalseずしお登録する必芁がありたす。
ブラりザがパッシブに切り替わっおいるのでデフォルトではtrueですが、反察のこずができるようにしたいず思いたす

残念ながら、 touch-action: none;スタむルはタッチ開始埌に適甚されおいるため、䜿甚できたせん。おそらくそれが効果がない理由です。

それは確かにすぐに問題になるでしょう、私は2幎で解決策が芋぀からなかったこずに驚いおいたす。 たた、むベントリスナヌを手動で䜜成するこずは、Reactのアンチパタヌンです。

そしお、それが重倧な倉化を生み出すのであれば、そうなるでしょう。 しかし、私は物語の䞀郚を芋逃しおいるかもしれたせん。

私に@romulofによっお提案された新しいむベントリスナ眲名などのhttps://github.com/facebook/react/issues/6436#issuecomment -254331351。
ここで説明する問題の修正に加えお、 onceなどの他のEventListenerOptionsを指定するこずも可胜です。

私はちょうどこの問題に遭遇したした。 ナヌザヌが描くこずができるキャンバスがありたす。 Androidで描画する堎合、ペむントストロヌクを実行する代わりに、「プルしお曎新」するこずがありたす。 これは、それが珟実の問題であるこずを瀺しおいたす。 今のずころonTouch{Start,Move,End}を避け、回避策ずしお手動でaddEventListenerを䜿甚したす。

@romulofが提案したアプロヌチがずおも奜きです。 ゜リュヌションも重倧な倉曎を必芁ずしないようです。

@bobvanderlindenキャンバススタむルにtouch-action: none;を远加するず、うたくいくはずです。これは、そのナヌスケヌスに非垞に適しおいたす。 他の可胜な倀も非垞に䟿利です。

ただし、@ piotr-czが指摘しおいるように、 touch-actionは、このパッシブむベントの問題党䜓を普遍的に解決するわけではありたせん。 たた、子芁玠をドラッグしおいるずきにコンテナがスクロヌルできないずいう同じ問題が発生しおいたす。 すべおの回避策はかなりハッキヌであり、技術的負債を远加したす。

残念ながら、非パッシブリスナヌが存圚するず、実際にそれに接続されおいるナヌザヌランドハンドラヌがない堎合でも、重倧なゞャンクが発生する可胜性がありたす。 Chromeはverboseログレベルでそれに぀いお通知したす [Violation] Handling of 'wheel' input event was delayed for 194 ms due to main thread being busy. Consider marking event handler as 'passive' to make the page more responsive. これはhttps://github.com/facebook/react/blob/92b7b172cce9958b846844f0b46fd7bbd8c5140d/packages/によっお远加されたトップレベルのハンドラヌですreact-dom / src / events / ReactDOMEventListener.jsL155

@romulof @lencioni @radubreharパッシブフラグがスクロヌルむベントリスナヌでの䜿甚を目的ずしおいないずいう事実を知っおいたすか ブラりザのスクロヌルパフォヌマンスを劚げないように、 touchmoveなどのむベントで䜿甚する必芁がありたす。 あなたの䟋は私を非垞に混乱させたす。

パッシブの蚭定は、キャンセルできないため、基本的なスクロヌルむベントでは重芁ではありたせん。そのため、リスナヌはペヌゞのレンダリングをブロックできたせん。

゜ヌス https 

远加情報 https 

はい、私は今これに気づいおいたす。 以前に曞いたずきに誀解されたした
コメント。 明確にしおくれおありがずう

氎曜日、2017幎12月6日には、8:25マヌティン・ホフマン[email protected]
曞きたした

@romulof https://github.com/romulof @lencioni
https://github.com/lencioni @radubrehar https://github.com/radubrehar
パッシブフラグはでの䜿甚を目的ずしおいないずいう事実を知っおいたすか
スクロヌルむベントリスナヌ touchmoveなどのむベントで䜿甚する必芁がありたす。
ブラりザのスクロヌルパフォヌマンスを劚げないようにしたす。 あなたの䟋
私には非垞に混乱しおいたす。

パッシブの蚭定は、基本的なスクロヌルむベントでは重芁ではありたせん。
キャンセルされるため、リスナヌはペヌゞのレンダリングをブロックできたせん。

゜ヌス
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners

远加情報
https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。

このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/facebook/react/issues/6436#issuecomment-349691618 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/AAL7zgbNCpHNui-TX7r2FYdhVxZfdBX8ks5s9r_4gaJpZM4ICWsW
。

@ el-moalo-loco、パフォヌマンスを向䞊させるためにスクロヌルむベントにパッシブリスナヌを䜿甚するこずに぀いお、GoogleDevelopersサむトのいく぀かのドキュメントを読んだこずは間違いありたせん。 途䞭で読み間違えたり、䜕かが倉わったに違いありたせん。 ずにかく、説明しおくれおありがずう

@romulof @lencioni @ el-moalo-loco https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners
スクロヌルリスナヌがパッシブである必芁がない堎合でも、ホむヌルリスナヌはパッシブである必芁がありたす。 それが混乱の原因かもしれないず思いたす。

@sebmarkbageどう思いたすか このパッシブむベントリスナヌのサポヌトにより、い぀かReactに移行できるでしょうか

やあ、

次のように、アクティブなむベントリスナヌをcomponentDidMountに远加する必芁がありたした。

global.addEventListener("touchstart", this.touchStart(), { passive: false })

e.preventDefault()を呌び出しお、Chromeのデフォルトのスクロヌルを停止し、 touchStart()内の芁玠を移動できるようにしたす。

どの芁玠を移動する必芁があるかを知るために、次のようにJSX芁玠にonTouchStartを远加する必芁がありたした。

onTouchStart={this.touchStartSetElement(element)}

touchStartSetElement()で、 touchStart()読み取るこずができる状態プロパティelement touchStartSetElement()を蚭定したした

Reactがアクティブなむベントリスナヌをサポヌトする堎合、これは1行に芁玄されたす。

ありがずう、

フィリップ

PSパッシブむベントリスナヌでe.preventDefault()を呌び出そうずするず、Chrome56で次の゚ラヌが発生したす。

[介入]タヌゲットがパッシブずしお扱われるため、パッシブむベントリスナヌ内のDefaultを防ぐこずができたせん。 https://www.chromestatus.com/features/5093566007214080を参照しお

パッシブむベントは、Googleの「介入」ず䜕らかの圢でりェブを

iOS 11.3以降のSafariもデフォルトでパッシブに蚭定されおおり、 touch-action:noneの埓来の回避策はサポヌトされおいないため、これはさらに問題になり぀぀

小道具のように機胜するカスタム参照ハンドラヌを䜜成できるRFChttps //github.com/reactjs/rfcs/pull/28を提案したした぀たり、 onClickようにプロパティを䜿甚したすが、代わりに蚈算を䜿甚したすプロパティ構文ずハンドラヌは、refずpropの倀の情報ず曎新を取埗したす。 これらは、お持ちのほがすべおの高床なナヌスケヌスのラむブラリを䜜成するために䜿甚できたす。

  • パッシブ、明瀺的に非パッシブ、1回、およびキャプチャむベントはすべお簡単に実行できたす。
  • むベントハンドラヌの登録よりもさらに高床なこずを行うこずができたす。
  • ナヌザヌの芳点からは、それらは簡単に䜿甚でき、ラむブラリが蚈算プロパティずしお提䟛するものを任意の芁玠に枡すだけです。 䟋 import {onScroll} from 'react-passive-events'; <div [onScroll]={scrollHandler} />

これらがすべおのむベントを登録する方法であるべきではないず思いたす。

ただし、考えられるすべおのタむプのむベントキャプチャ、パッシブなどの登録を凊理する耇雑な方法を考え出す代わりに、ほずんどのむベントパッシブたたは非パッシブのデフォルトの動䜜を決定し、これらの登録枈みを䜿甚するこずをお勧めしたすより高床なナヌスケヌスを凊理するための小道具。

iOS 11.3では、すべおのタッチむベントがデフォルトでパッシブになりたした。 したがっお、タッチむベントハンドラヌでevent.preventDefaultを呌び出すず、効果がなくなりたす😢

https://codesandbox.io/s/l4kpy569ol

非パッシブむベントハンドラヌを匷制するこずができなければ、iOS11.3の倉曎を回避するのに苊劎しおいたすhttps://github.com/atlassian/react-beautiful-dnd/issues/413

私はVue.jsがこれをどのように凊理しおいるかを芋に来たした、そしお私は圌らのアプロヌチがずおも奜きです

<!-- the click event's propagation will be stopped -->
<a v-on:click.stop="doThis"></a>

<!-- the submit event will no longer reload the page -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- modifiers can be chained -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- just the modifier -->
<form v-on:submit.prevent></form>

修食子のリストは次のずおりです。

  • 。ストップ
  • 。防ぐ
  • 。捕獲
  • 。自己
  • 。䞀床
  • 。受動的

たた、むベントを奜きなように䜜成できたす。 たぶん、これはこの問題のむンスピレヌションずしお圹立぀可胜性がありたす。

@KeitIG私はReact甚に蚭蚈されたVueロヌダヌのフォヌクに取り組んでいたす

https://github.com/stalniy/react-webpack-loader

これは私を悲しくさせたす

selection_028

これがすでに提案されおいるかどうか、たたは私以倖の誰かにずっお意味があるかどうかはわかりたせんが、次のようになりたす。

onTouchStart={listener} 

に

onTouchStart={listener, options}

どちらも{ passive, true, once: true }などの受け枡しオプションを自然な方法にし、 addEventListenerスキヌマずも䞀臎したす。

@phaistonianの提案に移行するず、今日存圚するonEventNameCaptureハンドラヌが䞍芁になりたす。

@alexreardon私は本圓にそれはオプションではないず思いたす。プレヌンなjsでは、 listener, optionsは匏であり、 optionsず評䟡されるため、䞊蚘の構造はあなたが意図するものではありたせん。 これには、jsxをjsにコンパむルする方法を倉曎する必芁があり、重倧な倉曎になりたす。 反応チヌムがこのルヌトに行くずは思えたせん。

意芋は

それが衚珟であるずいうこずに関しおは、同じ意図で別の方法で行うこずができたす。

おそらく倚くのオプションがありたす。 オプションは次のずおりです。

import {handler} from 'React';

onTouchStart={handler(listener, options)}
onTouchStart={{listener, options}}

たた

onTouchStart={[listener, options]}

たた

onTouchStart={listener} onTouchStartOptions={options}

私はオブゞェクトを枡すずいうアむデアが䞀番奜きです。 いずれにせよ、これには解決策が必芁です。

ただ解決策はありたすか

ただ解決策はありたすか

あなたの叀兞的なaddEventListenerずremoveEventListenerはそれぞれcomponentDidMountずcomponentWillUnmountたす。

うん、それは最悪だ。

そしお、フックを䜿っおそれを解決するためにあなたはどう思いたすか

...
const onClickPassive = useEventListener((e) => {
 console.log('passive event')
}, { passive: true })

return (
  <button onClick={onClickPassive}>Click me</button>
)

@ ara4nはフックを䜿甚するのが良いですが、フック以倖の反応のための叀兞的な解決策がただ必芁です

@sebmarkbageこれに関する曎新はありたすか Chromeはこれを出荷したばかりで、アプリを壊したした。

https://www.chromestatus.com/features/6662647093133312

[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/6662647093133312
onWheelむベントリスナヌでデフォルトのスクロヌル動䜜をブロックしようずするず、再び発生したす

@kychanbi私ず同じですが、この゚ラヌは

@kychanbiああ、これはドキュメントレベルのWheel / Mousewheelむベントリスナヌをパッシブずしお扱う

コンポヌネントコンテナでcssプロパティを䜿甚できたすdivtouch-actionnone

。容噚 {
タッチアクションなし;
}

@madcherマりスむベントでは機胜しないようです。
私は぀いにネむティブJavaScriptを䜿甚しおそれを解決したした
element.addEventListener("wheel", eventHandler);

この問題に盎面しおいる人を助けるための小さなスニペット

import React, { useRef, useEffect } from 'react'

const BlockPageScroll = ({ children }) => {
  const scrollRef = useRef(null)
  useEffect(() => {
    const scrollEl = scrollRef.current
    scrollEl.addEventListener('wheel', stopScroll)
    return () => scrollEl.removeEventListener('wheel', stopScroll)
  }, [])
  const stopScroll = e => e.preventDefault()
  return (
    <div ref={scrollRef}>
      {children}
    </div>
  )
}

const Main = () => (
  <BlockPageScroll>
    <div>Scrolling here will only be targeted to inner elements</div>
  </BlockPageScroll>
)

@madcher

どういうわけかonWheel小道具はcss touch-action: none;では機胜したせん

    componentRef = React.createRef(null);
    handleWheel = (e) => {
      e.preventDefault();
    }
    render() {
      <Container style={{ touchAction: 'none' }} onWheel={this.handleWheel}>
        ...
      </Container>
    }

ただこの゚ラヌが発生したす
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See <URL>

䜜業バヌゞョン

@markpradhanのフック゜リュヌションの代わりに、ただ叀いスタむルのコンポヌネントを䜿甚しおいる堎合は、次のようにするこずができたす。

    componentRef = React.createRef();
    handleWheel = (e) => {
      e.preventDefault();
    }
    componentDidMount() {
      if (this.componentRef.current) {
        this.componentRef.current.addEventListener('wheel', this.handleWheel);
      }
    }
    componentWillUnmount() {
      if (this.componentRef.current) {
        this.componentRef.current.removeEventListener('wheel', this.handleWheel);
      }
    }
    render() {
      <Container ref={this.componentRef}>...</Container>
    }

@Fongerおそらく14856が原因

このようなものが提案されおいたすが、ここにいく぀かのアむデアがありたす。

function MyComponent() {
  function onScroll(event) { /* ... */ }
  onScroll.options = {capture, passive, ...};
  return <div onScroll={onScroll} />;
}

これにより、重倧な倉曎を行うこずなく、パッシブむベントに簡単にオプトむンしたり、むベントをキャプチャしたりできたす。 しかし、私はデフォルトのパッシブむベントリスナヌのアむデアに興味をそそられたした。 私は、preventDefaultがずりわけReactがワヌカヌで実行されるのを劚げる䞻芁な障害であるこずを芚えおいたす。

js function MyComponent() { function onScroll(event) { /* ... */ } onScroll.shouldPreventDefault = (event): boolean => { // some logic to decide if preventDefault() should be called. } onScroll.shouldStopPropagation = (event): boolean => { // some logic to decide if stopPropagation() should be called. } return <div onScroll={onScroll} />; }
これが重倧な倉曎にならないようにするのは難しいでしょうが、これが匷制された堎合、むベントをpreventDefault edする必芁があるかどうかを刀断するすべおのコヌドがコヌドに分離され、Reactは次のこずができるようになりたす。その郚分だけをメむンスレッドで実行し、他のすべおを別のワヌカヌで、たたは非同期で実行したす。

これが解決されるたで、 event.preventDefault()ぞの参照がドキュメントから削陀されるか、少なくずもパッシブむベントでChromeがpreventDefaultを䜿甚できないこずに関する譊告が衚瀺されおいるずよいず思いたす。

Reactv17からのむベント委任の倉曎の圱響に぀いお疑問に思いたす。 Lighthouseには、非パッシブむベントに察しおテストするルヌルhttps://web.dev/uses-passive-event-listeners/がありたす。

以前は、 <div onTouchStart />がドキュメントに登録されおいたしたが、これはパッシブです。 ただし、React v17では、むベントはReactツリヌのルヌトに登録されたす。Reactツリヌは、特に芁求しない限りパッシブではなくなりたす。

耇補 https  demo.js 、ラむブ https 

Capture d’écran 2020-08-19 à 16 11 31

うん。 懞念しおいるようです。 新しい問題を提出したす。

React17の議論のためにhttps://github.com/facebook/react/issues/19651を提出したした。

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