React: рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 7 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  62рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

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

рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдФрд░ рдЬрд░реВрд░рдд рдкрдбрд╝рдиреЗ рдкрд░ рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯ-рдЗрди рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдИрд╡реЗрдВрдЯ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рдХреНрд░рд┐рдп рд╢реНрд░реЛрддрд╛ рд╣реЛрдиреЗ рдкрд░ рдХреЗрд╡рд▓ рдбрд┐рдлреЙрд▓реНрдЯ рдХреЛ рд░реЛрдХреЗрдВ рдпрд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдЗрд╕реА рддрд░рд╣, рд╣рдо рдЗрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ рдХреЗ рдереНрд░реЗрдбрд┐рдВрдЧ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рдереЗ, рд╡рд╣ рд╣реИ рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЬрдм рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдЬреИрд╕реЗ рд╕рдХреНрд░рд┐рдп рд╢реНрд░реЛрддрд╛ рд╣реЛрддреЗ рд╣реИрдВред

cc @vjeux @ide

DOM React Core Team Big Picture Feature Request

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдВрдиреЗ рд╡реНрд╣реАрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд░реЛрдо рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджреА рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдиреЗ рдкрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рд╣реЛрдирд╛ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реЛрдЧрд╛!

рд╕рднреА 62 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдХреНрд░реЛрдо 51 рдореЗрдВ рдЙрддрд░рд╛ред рдХреНрдпрд╛ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрджреНрдпрддрди рдпреЛрдЬрдирд╛ рд╣реИ? :рдУ

рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдпрджрд┐ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реЛрдВ рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рджреЗрддрд╛ рд╣реИ?
@sebmarkbage

рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ?

рдореИрдВрдиреЗ рд╡реНрд╣реАрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд░реЛрдо рдореЗрдВ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджреА рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрдиреЗ рдкрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдЗрд╕рдХрд╛ рд╣реЛрдирд╛ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реЛрдЧрд╛!

рдЖрдк рдордирдорд╛рдиреЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЬреИрд╕реЗ once рдЬреЛ рдкрд╣рд▓реЗ рд╣реА рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рд░рд╛рдд рдореЗрдВ рдЖ рдЪреБрдХрд╛ рд╣реИ: https://twitter.com/mozhacks/status/758763803991474176ред рдкреВрд░реА рд╕реВрдЪреА: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

FWIW, рдЬрдм рд╕рд╛рдЗрдбрдмрд╛рд░ рдпрд╛ рдЪреИрдЯ рд╡рд┐рдВрдбреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдлреЗрд╕рдмреБрдХ рдмрд╛рд╣рд░реА рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд╡реНрд╣реАрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕реБрдирддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рдмрд┐рдирд╛ UI рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╣рдо рдЕрднреА рднреА рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рд╕реНрдерд╛рди рдЕрднреА рднреА рдЕрдзреВрд░рд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛ рд╢реНрд░реЛрддрд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рддреЛ рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╕рдХреНрд░рд┐рдп рдбрд┐рдЬрд╛рдЗрди рд╕реНрдерд╛рди рд╣реИред

рджреЛрдиреЛрдВ рд╕рдХреНрд░рд┐рдп рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд░рдЦрдирд╛ рдФрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд╕рдорд░реНрдерди рджреЗрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдбреЗрд╕реНрдХрдЯреЙрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдЖрдк рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕реНрдХреНрд░реЙрд▓ рд╢реНрд░реЛрддрд╛ рдПрдХ рдорд╣рд╛рди рдЧрддрд┐ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддреЗ рд╣реИрдВред

рдЫреЛрдЯрд╛ рд╕реБрдЭрд╛рд╡:

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

@romulof рд╣рд╛рдБ, рдЗрд╕ рддрд░рд╣ рдЖрдк рдХреИрдкреНрдЪрд░ рдЪрд░рдг рдкрд░ рднреА рдИрд╡реЗрдВрдЯ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ

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

рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдЪрд┐рдд рдПрдкреАрдЖрдИ рд╣реЛрдЧрд╛ред

рд╕рд╛рдЗрдб рдиреЛрдЯ: рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╕рд╡рд╛рд▓ рд╣реИ - рдХреИрдкреНрдЪрд░ рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдЖрдк рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рдХреГрддрд┐ рд╕реЗ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдЪреВрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ event.preventDefault() рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЧреИрд░-рдореБрджреНрджрд╛ рд╣реИред

@radubrehar , onScrollCapturePassive рдКрдВрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреВрд░реА рдмрд╛рдЗрдмрд┐рд▓ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

:) рдпрд╣ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреИрдкреНрдЪрд░ рдЪрд░рдг рдкрд░ рдХреЛрдИ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛ рдирд╣реАрдВ рд╣реИред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдИрд╡реЗрдВрдЯ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рднреА рд╣реИрдВ, рдЬреИрд╕реЗ once ред

рдПрдХ рдФрд░ рд╕реБрдЭрд╛рд╡:

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

рдЗрд╕ рддрд░рд╣ рд░рд┐рдПрдХреНрдЯ рдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдЗрдВрдбрд┐рдВрдЧ) рд╣реИ, рдпрд╛ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рд╕рдореЗрдВ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк рдФрд░ рд╣реИрдВрдбрд▓рд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг onFooPassive рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдРрд╕реЗ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрджрд┐ @sebmarkbage рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП рдХрд┐ рдИрд╡реЗрдВрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рдпрд╣ рд╢рд╛рдпрдж рдмрд╣реБрдд рдмреЛрдЭрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдПрдХ рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреЛ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЧреБрдг рд╕рдВрд▓рдЧреНрди рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореЛрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рд╕рдХреЗрдВ (рдпрд╛ рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЯреЙрдЧрд▓ рдХрд░ рд╕рдХреЗрдВ)ред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

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

  handleScroll() {
    ...
  }

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

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдПрдХ рдмрд╛рд░ рдЬрдм рд╡реЗ рдЙрддрд░реЗрдВрдЧреЗред

рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рд╕реЛрдЪрддреЗ рд╣реБрдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдИрд╡реЗрдВрдЯ рд╡рд┐рдХрд▓реНрдк рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред рдпрд╣ рд░рд┐рдПрдХреНрдЯ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрдИ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рддреЛ, рдКрдкрд░ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

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

  handleScroll() {
    ...
  }

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

рдПрдХ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдореЗрд░реЗ рд╕рд╛рде рд╣реБрдЖ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо 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 рд░рд┐рдПрдХреНрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ "рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЗрд╡реЗрдВрдЯреНрд╕" рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореВрд▓ рдШрдЯрдирд╛рдУрдВ рдХреА рддрд░рд╣ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдЕрдзрд┐рдХ рдЬреНрдЮрд╛рди рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдЬреЛ рдореИрдВ рдХрд╣рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдЙрд╕реЗ рд╕рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдб рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ рдЬреЛ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рд╕реЗ рд╕реБрдкрд░ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ preventDefault рдХрдо рд╕реЗ рдХрдо _ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдЬрд┐рди рд╣реИрдВрдбрд▓рд░ рдХреЛ рд░реЛрдХ рд░рд╣реЗ рд╣реИрдВ рд╡реЗ рднреА рд░рд┐рдПрдХреНрдЯ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░_ рд╣реИрдВред рд╡реИрд╕реЗ рднреА рдореЗрд░рд╛ рдЕрдиреБрднрд╡ рдпрд╣реА рд░рд╣рд╛ рд╣реИред

stopPropagation рдЖрдкрдХреЗ рднрд╛рдЧреНрдп рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ document рдХреНрд▓рд┐рдХ рд╢реНрд░реЛрддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рдзреНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдЕрдВрджрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдмреБрд▓рдмреБрд▓реЗ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрддреНрд╡)ред рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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

[[рдПрдордбреАрдПрди](https://developer.mozilla.org/en-US/docs/Web/API/Event/stopImmediatePropagation)]

рдпрд╣ рдореБрдЦреНрдп рд╡рд┐рд╖рдп рд╕реЗ рдереЛрдбрд╝рд╛ рд╣рдЯрдХрд░ рдерд╛, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдХрднреА-рдХрднреА рдПрдХ рдЕрдЬреАрдм рдХреНрд░рдо рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

@joshjg @ benwiley4000 @gaearon рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХреНрд░реЛрдо рдЯреАрдо рдиреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рд╕реНрддрд░реАрдп рд╕реНрдкрд░реНрд╢ рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдЧрдП рд╣реИрдВред рдФрд░ рдЪреВрдВрдХрд┐ рд░рд┐рдПрдХреНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝-рд╕реНрддрд░ рдкрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдирдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИред

рджреЗрдЦреЗрдВ https://www.chromestatus.com/features/5093566007214080

рдЗрд╕рдиреЗ рдкрд░реЛрдХреНрд╖ рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ - рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╕рдордп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ passive: false рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиред

рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рднреА рдорд╛рд░рд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ addEventListener рдХреЗ рд╕рд╛рде рд╣рд╛рде рд╕реЗ рд╕реНрдкрд░реНрд╢ рдИрд╡реЗрдВрдЯ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХреНрд░реЛрдо рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЗрд╡рд▓ touchstart рдФрд░ touchmove рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рди рдХрд┐ wheel ред рддреЛ рд╕реНрдкрд╖реНрдЯ {passive: true} рдмрд┐рдирд╛ рдПрдХ wheel рдШрдЯрдирд╛ рдЕрднреА рднреА рдореВрд╕рд╡реНрд╣реАрд▓ рдФрд░ рдЯреВ-рдлрд┐рдВрдЧрд░ рдЯреНрд░реИрдХрдкреИрдб рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рдмрд╛рдзреНрдп рдХрд░реЗрдЧреАред (рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрд╛ рд╣реИред)

рд╕рд╛рде рд╣реА рд╣рдорд╛рд░рд╛ (рдПрдЬ рдЯреАрдо) рдЙрд╕реА рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрдм рд╣рдо рдирд┐рд╖реНрдХреНрд░рд┐рдп рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд╢рд┐рдк рдХрд░рддреЗ рд╣реИрдВ рддрдм рднреА рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ {passive: true} рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред

рдПрдлрд╡рд╛рдИрдЖрдИ, рдореИрдВрдиреЗ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ div рд╣реЛрдиреЗ рдкрд░ рд╢рд░реАрд░ рдХреЛ рдореЛрдмрд╛рдЗрд▓ рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдХреНрд░рд┐рдп: рдЭреВрдард╛ рдкрде рдиреАрдЪреЗ рдЬрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЛрдХрдерд╛рдо рдбреАрдлреЙрд▓реНрдЯ() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рднрд╛рд░реА рд╣реИред рдореИрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЕрдЧрд░ div рдореМрдЬреВрдж рд╣реИ, рдпрд╛ рд╢рд░реАрд░ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред рдКрдВрдЪрд╛рдИ = 100% рджреГрд╖реНрдЯрд┐рдХреЛрдгред body.height рдлрд┐рдХреНрд╕ рдереЛрдбрд╝рд╛ рд╣реИрдХреА рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рдореБрдЭреЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА: рдмрд┐рд▓реНрдХреБрд▓ рдЭреВрдаред

рдореЗрд░рд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рддрддреНрд╡ рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реИ рддреЛ рдореИрдВ рдХрдВрдЯреЗрдирд░ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП event.preventDefault() рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЙрд╕рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдХреЛ рдЧреИрд░-рдирд┐рд╖реНрдХреНрд░рд┐рдп (рдирд┐рд╖реНрдХреНрд░рд┐рдп: рдЕрд╕рддреНрдп) рдХреЗ рд░реВрдк рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░ рд░рд╣реЗ рд╣реИрдВ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рддреНрдп, рдореИрдВ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдореИрдВ touch-action: none; рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдкрд░реНрд╢ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬрд▓реНрдж рд╣реА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИ, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рджреЛ рд╕рд╛рд▓ рдореЗрдВ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдФрд░ рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдирд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд░реЛрдзреА рдкреИрдЯрд░реНрди рд╣реИред

рдФрд░ рдЕрдЧрд░ рдпрд╣ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдРрд╕рд╛ рд╣реА рд╣реЛред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ рдХрд╣рд╛рдиреА рдХрд╛ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред

рдореБрдЭреЗ https://github.com/facebook/react/issues/6436#issuecomment -254331351 рдореЗрдВ @romulof рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдирдпрд╛ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкрд╕рдВрдж рд╣реИред
рдпрд╣рд╛рдВ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп EventListenerOptions рдЬреИрд╕реЗ once рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛

рдореИрдВ рдЕрднреА рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдХреИрдирд╡рд╛рд╕ рд╣реИ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдбреНрд░рд╛рдЗрдВрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдХрднреА-рдХрднреА рдкреЗрдВрдЯ-рд╕реНрдЯреНрд░реЛрдХ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп 'рд░рд┐рдлреНрд░реЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреАрдВрдЪреЗрдВ'ред рдЗрд╕рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореИрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП onTouch{Start,Move,End} рд╕реЗ рдмрдЪреВрдВрдЧрд╛ рдФрд░ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ addEventListener рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдореБрдЭреЗ @romulof рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рдзрд╛рди рдХреЛ рднреА рддреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

@bobvanderlinden рдЕрдкрдиреА рдХреИрдирд╡рд╛рд╕ рд╢реИрд▓реА рдореЗрдВ touch-action: none; рдЬреЛрдбрд╝рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЪрдордХрддрд╛ рд╣реИред рдЕрдиреНрдп рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп рднреА рдХрд╛рдлреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЬреИрд╕рд╛ рдХрд┐ @piotr-cz рдиреЗ рдмрддрд╛рдпрд╛, touch-action рдЗрд╕ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рдмрд╛рд▓ рддрддреНрд╡ рдЦреАрдВрдЪрддреЗ рд╕рдордп рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдореЗрдВ рднреА рднрд╛рдЧ рд░рд╣рд╛ рд╣реВрдВред рд╕рднреА рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдмрд╣реБрдд рд╣реИрдХреА рд╣реИрдВ рдФрд░ рддрдХрдиреАрдХреА рдЛрдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдХрд┐рд╕реА рднреА рдЧреИрд░-рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╢реНрд░реЛрддрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬрдВрдХ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреА рд╣реИ, рднрд▓реЗ рд╣реА рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рд▓реИрдВрдб рд╣реИрдВрдбрд▓рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рди рд╣реЛрдВред рдХреНрд░реЛрдо рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ 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/ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рд╣реИрдВрдбрд▓рд░ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдбреЛрдо/src/рдШрдЯрдирд╛рдУрдВ/ReactDOMEventListener.js#L155)

@romulof @lencioni @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

рд╣рд╛рдВ, рдореБрдЭреЗ рдЕрдм рдЗрд╕рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рдЧрдИ рд╣реИред рдЬрдм рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ рддреЛ рдореБрдЭреЗ рдЧрд▓рдд рд╕реВрдЪрдирд╛ рджреА рдЧрдИ рдереА
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБред рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдмреБрдзрд╡рд╛рд░, 6 рджрд┐рд╕рдВрдмрд░, 2017, 8:25 рдкреВрд░реНрд╡рд╛рд╣реНрди рдкрд░ рдорд╛рд░реНрдЯрд┐рди рд╣реЙрдлрдореИрди рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com
рд▓рд┐рдЦрд╛ рдерд╛:

@romulof https://github.com/romulof @lencioni
https://github.com/lencioni @radubrehar https://github.com/radubrehar
рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рддрдереНрдп рд╕реЗ рдЕрд╡рдЧрдд рд╣реИрдВ рдХрд┐ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдзреНрд╡рдЬ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ
рд╕реНрдХреНрд░реЙрд▓ рдШрдЯрдирд╛ рд╢реНрд░реЛрддрд╛? рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЯрдЪрдореВрд╡ рдЖрджрд┐ рдШрдЯрдирд╛рдУрдВ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг
рдореБрдЭреЗ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдореВрд▓ рд╕реНрдХреНрд░реЙрд▓ рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдкреИрд╕рд┐рд╡ рд╕реЗрдЯ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛
рд░рджреНрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╢реНрд░реЛрддрд╛ рд╡реИрд╕реЗ рднреА рдкреЗрдЬ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрд░реЛрдд:
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, рдореБрдЭреЗ рдкреВрд░рд╛ рдпрдХреАрди рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реЙрд▓ рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Google рдбреЗрд╡рд▓рдкрд░ рд╕рд╛рдЗрдЯ рдкрд░ рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрдврд╝реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЧрд▓рдд рдкрдврд╝рд╛ рд╣реЛрдЧрд╛ рдпрд╛ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдХреБрдЫ рдмрджрд▓ рдЧрдпрд╛ рд╣реЛрдЧрд╛ред рд╡реИрд╕реЗ рднреА, рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

@romulof @lencioni @el-moalo-loco https://developers.google.com/web/tools/lighthouse/audits/passive-event-listeners
рдкрд╣рд┐рдпрд╛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдЕрднреА рднреА рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рднрд▓реЗ рд╣реА рд╕реНрдХреНрд░реЙрд▓ рд╢реНрд░реЛрддрд╛ рди рд╣реЛрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рднреНрд░рдо рдХрд╛ рд╕реНрд░реЛрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@sebmarkbage рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛ рд╢реНрд░реЛрддрд╛ рд╕рдорд░реНрдерди рдХрднреА-рдХрднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЕрдкрдирд╛ рд░рд╛рд╕реНрддрд╛ рдмрдирд╛ рджреЗрдЧрд╛?

рдирдорд╕реНрддреЗ,

рдореБрдЭреЗ рдмрд╕ рдЗрд╕ рддрд░рд╣ componentDidMount рдореЗрдВ рдПрдХ рд╕рдХреНрд░рд┐рдп рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдЬреЛрдбрд╝рдирд╛ рдерд╛:

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

рддрд╛рдХрд┐ рдореИрдВ рдХреНрд░реЛрдо рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП e.preventDefault() рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХреВрдВ рдФрд░ рдПрдХ рддрддреНрд╡ рдХреЛ touchStart() рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХреВрдВред

рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореБрдЭреЗ рдХрд┐рд╕ рддрддреНрд╡ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ JSX рддрддреНрд╡ рдореЗрдВ onTouchStart рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛:

onTouchStart={this.touchStartSetElement(element)}

touchStartSetElement() рдореИрдВрдиреЗ рдПрдХ рд░рд╛рдЬреНрдп рд╕рдВрдкрддреНрддрд┐ element рдЬрд┐рд╕реЗ рдореИрдВ touchStart() рдореЗрдВ рдкрдврд╝ рд╕рдХрддрд╛ рд╣реВрдВ

рдпрджрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдХреНрд░рд┐рдп рдШрдЯрдирд╛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗрдЧреА рддреЛ рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рддрдХ рдЙрдмрд╛рд▓ рдЬрд╛рдПрдЧрд╛ред

рдзрдиреНрдпрд╡рд╛рдж,

рдлрд┐рд▓рд┐рдк

рдкреАрдПрд╕: рдпрджрд┐ рдЖрдк рдирд┐рд╖реНрдХреНрд░рд┐рдп рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдореЗрдВ e.preventDefault() рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреНрд░реЛрдо 56 рдореЗрдВ рдорд┐рд▓рддреА рд╣реИ:

[рд╣рд╕реНрддрдХреНрд╖реЗрдк] рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛ рд╢реНрд░реЛрддрд╛ рдХреЗ рдЕрдВрджрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЛ рд░реЛрдХрдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рд▓рдХреНрд╖реНрдп рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдорд╛рдирд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рджреЗрдЦреЗрдВ https://www.chromestatus.com/features/5093566007214080

Google рдХреЗ " рд╣рд╕реНрддрдХреНрд╖реЗрдк " рдФрд░ рд╡реЗрдм рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ

рдЖрдИрдУрдПрд╕ 11.3 рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдлрд╛рд░реА рдХреЗ рдмрд╛рдж рд╕реЗ рдпрд╣ рдПрдХ рдореБрджреНрджрд╛ рдмрди рд░рд╣рд╛ рд╣реИ, рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ, рдФрд░ touch-action:none рдХрд╛ рд╢рд╛рд╕реНрддреНрд░реАрдп рд╕рдорд╛рдзрд╛рди

рдореИрдВрдиреЗ рдПрдХ RFC https://github.com/reactjs/rfcs/pull/28 рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХрд╕реНрдЯрдо рд░реЗрдл рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдкреНрд░реЙрдкреНрд╕ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛рдиреА рдЖрдк рдРрд╕реЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк onClick рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЧрдгрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рд╕рдВрдкрддреНрддрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рд╣реИрдВрдбрд▓рд░ рд░реЗрдлрд░реА рдФрд░ рдкреНрд░реЛрдк рдореВрд▓реНрдп рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЕрдкрдбреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ)ред рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  • рдирд┐рд╖реНрдХреНрд░рд┐рдп, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЧреИрд░-рдирд┐рд╖реНрдХреНрд░рд┐рдп, рдПрдХ рдмрд╛рд░, рдФрд░ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
  • рдХреЗрд╡рд▓ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдкрдВрдЬреАрдХрд░рдг рд╕реЗ рднреА рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЪреАрдЬреЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
  • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рд╕реЗ рд╡реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдХреА рдЧрдИ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП import {onScroll} from 'react-passive-events'; <div [onScroll]={scrollHandler} />

рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпреЗ рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛рдУрдВ (рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛, рдирд┐рд╖реНрдХреНрд░рд┐рдп, рдЖрджрд┐ ...) рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдЬрдЯрд┐рд▓ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдШрдЯрдирд╛рдУрдВ (рдирд┐рд╖реНрдХреНрд░рд┐рдп рдпрд╛ рдЧреИрд░-рдирд┐рд╖реНрдХреНрд░рд┐рдп) рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдВрдЬреАрдХреГрдд рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рд░рд╛ред

IOS 11.3.1 рдореЗрдВ рд╕рднреА рдЯрдЪ рдЗрд╡реЗрдВрдЯ рдЕрдм рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рд╕реА рднреА рдЯрдЪ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ event.preventDefault() рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрдм рдЧреИрд░-рдкреНрд░рднрд╛рд╡реА рд╣реИ

https://codesandbox.io/s/l4kpy569ol

рдЧреИрд░-рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╣рдореЗрдВ iOS 11.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 рдореИрдВ Vue-loader рдХреЗ рдПрдХ рдХрд╛рдВрдЯреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬрд┐рд╕реЗ React рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

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

рдпреЗ рдореБрдЭреЗ рджреБрдЦреА рдХрд░рддрд╛ рд╣реИ

selection_028

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╛ рдпрджрд┐ рдпрд╣ рдореЗрд░реЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐:

onTouchStart={listener} 

рдкреНрд░рддрд┐

onTouchStart={listener, options}

рджреЛрдиреЛрдВ рдкрд╛рд╕рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк рдЬреИрд╕реЗ { passive, true, once: true } рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХрд╛ рдмрдирд╛ рджреЗрдВрдЧреЗ, рдФрд░ рдпрд╣ addEventListener рд╕реНрдХреАрдорд╛ рд╕реЗ рднреА рдореЗрд▓ рдЦрд╛рдПрдЧрд╛ред

@phaistonian рдХреЗ рд╕реБрдЭрд╛рд╡ рдХреА рдУрд░ onEventNameCapture рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧреА

@alexreardon рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рджреЗ рдЬреЗрдПрд╕ рдореЗрдВ, listener, options рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдЬреЛ options рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдирд┐рд░реНрдорд╛рдг рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдорддрд▓рдм рд░рдЦрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХреЛ рдЬреЗрдПрд╕ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдпрд╣ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЯреАрдо рдЗрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рдПрдЧреАред

рд░рд╛рдп?

рдпрд╣ рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реЛрдиреЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЗрд╕реЗ рдПрдХ рд╣реА рдЗрд░рд╛рджреЗ рд╕реЗ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╢рд╛рдпрдж рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

import {handler} from 'React';

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

рдпрд╛

onTouchStart={[listener, options]}

рдпрд╛

onTouchStart={listener} onTouchStartOptions={options}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд╕рдВрдж рд╣реИред рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ, рдЗрд╕реЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдХреНрдпрд╛ рдЕрднреА рддрдХ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдХреНрдпрд╛ рдЕрднреА рддрдХ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рд╣реИ?

рдЖрдкрдХрд╛ рдХреНрд▓рд╛рд╕рд┐рдХ addEventListener рдФрд░ removeEventListener componentWillUnmount рдХреНрд░рдорд╢рдГ componentDidMount рдФрд░ componentWillUnmount ред

рд╣рд╛рдБ, рдпрд╣ рдмреЗрдХрд╛рд░ рд╣реИред

рдФрд░ рдЖрдк рдПрдХ рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ?

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

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

@ ara4n рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреИрд░-рд╣реБрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдПрдХ рд╢рд╛рд╕реНрддреНрд░реАрдп рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

@sebmarkbage рдЗрд╕ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдХреНрд░реЛрдо рдиреЗ рдЕрднреА рдЗрд╕реЗ рд╢рд┐рдк рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдРрдк рдХреЛ рддреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реИред

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 рдУрд╣, рдпрд╣ рдХреНрд░реЛрдо 73 рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рд╕реНрддрд░ рд╡реНрд╣реАрд▓/рдорд╛рдЙрд╕рд╡реНрд╣реАрд▓ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдорд╛рдирддрд╛ рд╣реИ

рдЖрдк рдЕрдкрдиреЗ рдШрдЯрдХ рдХрдВрдЯреЗрдирд░ div рдЯрдЪ-рдПрдХреНрд╢рди рдкрд░ рд╕реАрдПрд╕рдПрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдХреЛрдИ рдирд╣реАрдВ

рдХрдВрдЯреЗрдирд░ {
рд╕реНрдкрд░реНрд╢-рдХреНрд░рд┐рдпрд╛: рдХреЛрдИ рдирд╣реАрдВ;
}

@madcher рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдЙрд╕ рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЕрдВрддрддрдГ рдЗрд╕реЗ рджреЗрд╢реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛
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 рдкреНрд░реЙрдкреНрд╕ рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ 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} />;
}

рдпрд╣ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рджреЗрдЧрд╛ рдпрд╛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмрджрд▓рд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рджреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдЪрд┐рдВрддрд┐рдд рдерд╛ред рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рд░реЛрдХрдерд╛рдо рдбрд┐рдлреЙрд▓реНрдЯ рдПрдХ рдмрдбрд╝реА рдмрд╛рдзрд╛ рд╣реИ (рджреВрд╕рд░реЛрдВ рдХреЗ рдмреАрдЪ) рдЬреЛ рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдВ рдЪрд▓рдиреЗ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИред

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 рдПрдб рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреЛрдб рдореЗрдВ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдмрд╕ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдкрд░ рдЪрд▓рд╛рдПрдВ рдФрд░ рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдПрдВред

рдЬрдм рддрдХ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рд╕реЗ event.preventDefault() рд╕рдВрджрд░реНрдн рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдкрд░ preventDefault рдореЗрдВ рдХреНрд░реЛрдо рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рд░рд┐рдПрдХреНрдЯ v17 рд╕реЗ рдШрдЯрдирд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддрд╛ рд╣реВрдВред рд▓рд╛рдЗрдЯрд╣рд╛рдЙрд╕ рдХрд╛ рдПрдХ рдирд┐рдпрдо рд╣реИ https://web.dev/uses-passive-event-listeners/ рдЬреЛ рдЧреИрд░-рдирд┐рд╖реНрдХреНрд░рд┐рдп рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред

рдкрд╣рд▓реЗ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ <div onTouchStart /> рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрддрд╛ рд╣реИ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд░рд┐рдПрдХреНрдЯ v17 рдХреЗ рд╕рд╛рде, рдШрдЯрдирд╛ рд░рд┐рдПрдХреНрдЯ рдЯреНрд░реА рдХреА рдЬрдбрд╝ рдкрд░ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рдЬреЛ рдЕрдм рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреВрдЫреЗ рдмрд┐рдирд╛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИред

рдкреНрд░рдЬрдирди: https://codesandbox.io/s/material-demo-forked-e2u72?file=/demo.js , рд▓рд╛рдЗрд╡: https://csb-e2u72.netlify.app/

Capture dтАЩe╠Бcran 2020-08-19 a╠А 16 11 31

рд╣рд╛рдВред рд╕рдВрдмрдВрдзрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдирдпрд╛ рдорд╛рдорд▓рд╛ рджрд░реНрдЬ рдХрд░реВрдВрдЧрд╛ред

рд░рд┐рдПрдХреНрдЯ 17 рдЪрд░реНрдЪрд╛ рдХреЗ рд▓рд┐рдП https://github.com/facebook/react/issues/19651 рдлрд╛рдЗрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

jmullo picture jmullo  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tleunen picture tleunen  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jvorcak picture jvorcak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bloodyowl picture bloodyowl  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hnordt picture hnordt  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ