React-window: рд╕реНрдХреНрд░реЙрд▓рд╕рд┐рдВрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдирд╡ре░ 2018  ┬╖  52рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: bvaughn/react-window

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

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

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдЗрдЪреНрдЫреБрдХ рд╣реЛрдВрдЧреЗ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЛрдИ рд╕рд▓рд╛рд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдХрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕рдиреЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреА рд╕рд╛рджрдЧреА рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдореИрдиреНрдпреБрдЕрд▓ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХреЗ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рд░рд╣рд╛ рд╣реИред

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

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

https://codesandbox.io/s/y3pyp85zm1

TLDR - рд╣реЗрдбрд░ рдЧреНрд░рд┐рдб рдкрд░ рдПрдХ рд░реЗрдлрд░реА рдбрд╛рд▓реЗрдВ, рдФрд░ рдЗрд╕реЗ рдмреЙрдбреА рдЧреНрд░рд┐рдб рдкрд░ рд░рдЦреЗрдВред

onScroll={({ scrollLeft }) => this.headerGrid.current.scrollTo({ scrollLeft })}

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

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

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

рд╕реНрдХреНрд░реЙрд▓ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╢реНрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдпрд╣ рдПрдХ рдРрд╕рд╛ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреНрдб рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдЧрдВрднреАрд░ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд░рд┐рдПрдХреНрдЯ рдмреНрд▓реЙрдЧ рдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдЙрддреНрд╕реБрдХ рд╣реИрдВ:

https://reactjs.org/blog/2018/06/07/you-probably-dont-need-dered-state.html#anti -pattern-erasing-state-when-props-change

рдЖрдк рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕реНрдХреНрд░реЙрд▓ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдорд╛рди рд╕рд┐рдВрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдСрдлрд╝рд░ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдЗрди рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░реЙрдкреНрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐рдмрджреНрдз рдЬреАрд╡рдирдЪрдХреНрд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдирд╣реАрдВ рддреЛ рдлреЙрд▓реЛ рдЕрдк рдкреНрд░рд╢реНрди рдкреВрдЫрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВ!

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

https://codesandbox.io/s/y3pyp85zm1

TLDR - рд╣реЗрдбрд░ рдЧреНрд░рд┐рдб рдкрд░ рдПрдХ рд░реЗрдлрд░реА рдбрд╛рд▓реЗрдВ, рдФрд░ рдЗрд╕реЗ рдмреЙрдбреА рдЧреНрд░рд┐рдб рдкрд░ рд░рдЦреЗрдВред

onScroll={({ scrollLeft }) => this.headerGrid.current.scrollTo({ scrollLeft })}

рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж! рдпрд╣ рдмрд╣реБрдд рд╡рд┐рдЪрд╛рд░рдгреАрдп рд╣реИред

рдЧреБрд░реБ, 8 рдирд╡рдВрдмрд░, 2018 рдХреЛ рджреЛрдкрд╣рд░ 1:09 рдмрдЬреЗ рд░реАрдЧрди рдХреАрд▓рд░ < рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди @github.com рдиреЗ рд▓рд┐рдЦрд╛:

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

https://codesandbox.io/s/y3pyp85zm1

TLDR - рд╣реЗрдбрд░ рдЧреНрд░рд┐рдб рдкрд░ рдПрдХ рд░реЗрдлрд░реА рдбрд╛рд▓реЗрдВ, рдФрд░ рдЗрд╕реЗ рдмреЙрдбреА рдЧреНрд░рд┐рдб рдкрд░ рд░рдЦреЗрдВред

рдСрдирд╕реНрдХреНрд░реЙрд▓ = {({рд╕реНрдХреНрд░реЙрд▓ рд▓реЗрдлреНрдЯ}) тАЛтАЛ=> this.headerGrid.current.scrollTo ({рд╕реНрдХреНрд░реЙрд▓ рд▓реЗрдлреНрдЯ})}

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЦреБрд▓реА/рдмрдВрдж рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/bvaughn/react-window/issues/86#issuecomment-437156749 ,
рдпрд╛ рдереНрд░реЗрдб рдХреЛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
https://github.com/notifications/unsubscribe-auth/AABznTUunzEIs6bVQfVsz7T21L2-Pkkoks5utJ17gaJpZM4YVMd7
.

рдЗрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ react-virtualized рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓-рд╕рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╢реАрд░реНрд╖/рджрд╛рдПрдВ/рдиреАрдЪреЗ/рдмрд╛рдПрдВ рдЬрдореЗ рд╣реБрдП рд╕реБрдкрд░ рдЧреНрд░рд┐рдб рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕ lib рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд┐рдпрд╛ рдерд╛ред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рди рдХрдо рд╕реЗ рдХрдо рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИ, рдФрд░ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ ScrollSync рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдлреА рдХрдо рджрд░реНрджрдирд╛рдХ рд╣реИред

рдпрд╣ рдирдП useRef рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ (https://reactjs.org/docs/hooks-reference.html#useref) рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИред

const topRef = useRef();
const rightRef = useRef();
const bottomRef = useRef();
const leftRef = useRef();
...
<Grid
  onScroll={({ scrollLeft, scrollTop }) => {
    if (leftRef.current) {
      leftRef.current.scrollTo({ scrollTop });
    }
    if (rightRef.current) {
      rightRef.current.scrollTo({ scrollTop });
    }
    if (topRef.current) {
      topRef.current.scrollTo({ scrollLeft });
    }
    if (bottomRef.current) {
      bottomRef.current.scrollTo({ scrollLeft });
    }
  }}
  ...
/>

рдЕрдЪреНрдЫрд╛! @ranneyd рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣ рдирдП useRef рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ (https://reactjs.org/docs/hooks-reference.html#useref) рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рддрд╛ рд╣реИред

рдзрдиреНрдпрд╡рд╛рдж @ranneyd

рдХреНрдпрд╛ рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдЙрджрд╛рд╣рд░рдг рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛?

@ranneyd рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдФрд░ рд╕реНрдХреНрд░реЙрд▓ рд╕рд┐рдВрдХ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдкрд░ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдЧреНрд░рд┐рдб рдХреЗ рдЕрдВрдд рдХреЗ рдирд┐рдХрдЯ рдЧрд▓рдд рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ:

gridalignement

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реБрдЭрд╛рд╡?

рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг

рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж

@carlosagsmendes рдпрд╣ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдХреА рд╡рдЬрд╣ рд╕реЗ рд╣реИред рдмрд╛рдИрдВ рдУрд░ рдКрдВрдЪрд╛рдИ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдШрдЯрд╛рдХрд░ рдКрдВрдЪрд╛рдИ рдмрдирд╛рдПрдВред рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдЖрдХрд╛рд░ рдХреЛ рд╣рд╛рд░реНрдб-рдХреЛрдб рдХрд░рддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдЗрддрдиреА рдЧрддрд┐рд╢реАрд▓ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рд╣реЛ рднреА рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдирд╣реАрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ "рд╕рдВрдЦреНрдпрд╛ рдЖрдЗрдЯрдо * рдЖрдХрд╛рд░ рдЖрдЗрдЯрдо <рдЪреМрдбрд╝рд╛рдИ (рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡реЗ рд╕рднреА рдорд╛рди рд╡рд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП)" рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рдЙрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдКрдВрдЪрд╛рдИ рдмрджрд▓реЗрдВред

рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реНрдерд┐рд░рддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реАрдПрд╕рдПрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдЖрдХрд╛рд░ рдХреЛ рд╣рд╛рд░реНрдб-рдХреЛрдб рдХрд░рддрд╛ рд╣реВрдВред

FWIW рдбреЛрдо-рд╣реЗрд▓реНрдкрд░реНрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдЖрд╕рд╛рди scrollbarSize рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЪреМрдбрд╝рд╛рдИ рдХреНрдпрд╛ рд╣реИред рд╣рд╛рд░реНрдб-рдХреЛрдбрд┐рдВрдЧ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@ рдмрд╡реЙрди рд╣рд╛рдБ! рдореИрдВ рдЙрд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдХрд░ рд░рд╣реЗ рдереЗ рдФрд░ рдЗрд╕рдиреЗ рдЗрд╕реЗ рднреНрд░рдорд┐рдд рдХрд░ рджрд┐рдпрд╛

рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рдПрдХ рдХреЛрд╢рд┐рд╢ рдХрд░рдиреА рд╣реА рд╣реЛрдЧреА!

рдХреНрдпрд╛ рдпрд╣ рдХреНрд╖реИрддрд┐рдЬ VariableSizeList рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдлреНрд░реАрдЬ рд╣реЛ рдЧрдпрд╛ред

onScroll={({ scrollLeft }) => this.headerGrid.current.scrollTo({ scrollLeft })}

рдпрд╣ VariableSizeGrid рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд╣реЗрдбрд░ рд╕реНрдХреНрд░реЙрд▓ рдкрд░ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рд░рд╣рддрд╛ рд╣реИред

@ajaymore рддреЛ рд╣реЗрдбрд░ рд▓реИрдЧрд┐рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ: рдЬрдм рдЖрдк рдореИрдХ рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рд╡реНрд╣реАрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдХреНрд░реЙрд▓ рд╕рд┐рдВрдХ рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИред MacOSX рдореЗрдВ рдпрд╣ рдмрд┐рд▓реНрдЯ-рдЗрди рдиреЗрдЪреБрд░рд▓ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдЪреАрдЬрд╝ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ "рд╕реНрдореВрде" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкрд░ рд░рд┐рдлреНрд░реЗрд╢ рд░реЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд░реЛрдо рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдлреНрд░реЗрдо рд░реЗрдЯ рд╕реЗ рддреЗрдЬ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕ рддрддреНрд╡ рдХреЛ рдЖрдк рд╕реНрдХреНрд░реЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ V8/ScrollSync рдХреЗ рдкрд╛рд╕ DOM рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪреЗрддрди рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдпрд╣ рдПрдХ рддрдХрдиреАрдХреА рд╕реАрдорд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореИрдВрдиреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред

рдордЬреЗрджрд╛рд░ рддрдереНрдп: рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдЫреЛрдЯреА рдЪреАрдЬрд╝ рдХреЛ рдЦреАрдВрдЪрдХрд░ рдкреБрд░рд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛) рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рдЪреАрдЬрд╝ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рд╡реНрд╣реАрд▓/рдЯреНрд░реИрдХ рдкреИрдб рд╕реНрд╡рд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

@ajaymore рддреЛ рд╣реЗрдбрд░ рд▓реИрдЧрд┐рдВрдЧ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ: рдЬрдм рдЖрдк рдореИрдХ рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рд╡реНрд╣реАрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдХреНрд░реЙрд▓ рд╕рд┐рдВрдХ рд╕рдВрдШрд░реНрд╖ рдХрд░рддрд╛ рд╣реИред MacOSX рдореЗрдВ рдпрд╣ рдмрд┐рд▓реНрдЯ-рдЗрди рдиреЗрдЪреБрд░рд▓ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдЪреАрдЬрд╝ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ "рд╕реНрдореВрде" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдкреЛрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкрд░ рд░рд┐рдлреНрд░реЗрд╢ рд░реЗрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд░реЛрдо рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдлреНрд░реЗрдо рд░реЗрдЯ рд╕реЗ рддреЗрдЬ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕ рддрддреНрд╡ рдХреЛ рдЖрдк рд╕реНрдХреНрд░реЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ V8/ScrollSync рдХреЗ рдкрд╛рд╕ DOM рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪреЗрддрди рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдпрд╣ рдПрдХ рддрдХрдиреАрдХреА рд╕реАрдорд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореИрдВрдиреЗ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИред

рдордЬреЗрджрд╛рд░ рддрдереНрдп: рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рдЫреЛрдЯреА рдЪреАрдЬрд╝ рдХреЛ рдЦреАрдВрдЪрдХрд░ рдкреБрд░рд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдирд╛) рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрдВрдЯрд░рдкреЛрд▓реЗрд╢рди рдЪреАрдЬрд╝ рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рд╡реНрд╣реАрд▓/рдЯреНрд░реИрдХ рдкреИрдб рд╕реНрд╡рд╛рдЗрдкрд┐рдВрдЧ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ

@ranneyd рдЗрддрдиреА рддреНрд╡рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕реАрдорд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдмрдбрд╝реА рдЪрд┐рдВрддрд╛ рдирд╣реАрдВ рд╣реИред

@bvaughn рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА position: sticky рд╕рд╛рде рдЦреЗрд▓рд╛ рд╣реИ? рдореИрдВрдиреЗ рдЗрд╕реЗ рдереЛрдбрд╝реА рджреЗрд░ рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЗрд╕рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рд╣реИ ...

рдореЗрд░реЗ рдкрд╛рд╕ @ajaymore рдЬреИрд╕рд╛ рд╣реА рдореБрджреНрджрд╛ рд╣реИ, рдХрдордЬреЛрд░ рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдореИрдиреНрдпреБрдЕрд▓ рд╕реНрдХреНрд░реЙрд▓ рдкрд░ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред рдореИрдВ рдПрдХ рдкреАрд╕реА рдкрд░ рдХреНрд░реЛрдо рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдореИрдХ рд╣реА рдореБрджреНрджрд╛ рдирд╣реАрдВ рд╣реИ ... рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдлрд▓рддрд╛ рдорд┐рд▓реА рд╣реИ?

@alonrbar рдореБрдЭреЗ рд╡рд┐рдВрдбреЛрдЬ рдкреАрд╕реА рдкрд░ рднреА рдпрд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИред

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

рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ;

import styled from '@emotion/styled';
import * as React from 'react';
import { VariableSizeGrid, VariableSizeGridProps } from 'react-window';
import { SizeUtils } from '../utils';

export interface SyncableGridProps extends VariableSizeGridProps {
    mainGridRef: React.Ref<VariableSizeGrid>;
    shadowGridRef: React.Ref<VariableSizeGrid>;
    hideVerticalScrollbar?: boolean;
}

export class SyncableGrid extends React.PureComponent<SyncableGridProps> {
    public render() {
        const { height, width } = this.props;
        const {
            onScroll,
            mainGridRef: mainGridRef1,
            shadowGridRef: shadowGridRef1,
            ...mainProps
        } = this.props;
        const {
            children,
            style,
            overscanRowsCount,
            overscanColumnsCount,
            overscanCount,
            useIsScrolling,
            onItemsRendered,
            mainGridRef: mainGridRef2,
            shadowGridRef: shadowGridRef2,
            innerRef,
            outerRef,
            ...shadowProps
        } = this.props;
        return (
            <SyncWrapper
                style={{
                    height,
                    width
                }}
            >
                <MainGrid
                    {...mainProps}
                    style={Object.assign({}, style, {
                        overflowY: 'scroll'
                    })}
                    ref={mainGridRef1}
                />
                <GridShadow
                    {...shadowProps}
                    style={{
                        position: 'absolute',
                        top: 0,
                        left: 0
                    }}
                    ref={shadowGridRef1}
                >
                    {() => null}
                </GridShadow>
            </SyncWrapper>
        );
    }
}

// ---------------- //
//      styles      //
// ---------------- //

const SyncWrapper = styled.div`
    position: relative;
    overflow: hidden;
`;

export interface MainGridProps extends VariableSizeGridProps {
    hideVerticalScrollbar?: boolean;
}

export const MainGrid = styled(VariableSizeGrid) <MainGridProps>`
    overflow-y: scroll;
    box-sizing: content-box;
    ${props => {
        if (!props.hideVerticalScrollbar)
            return '';
        const paddingDir = (props.theme.dir === 'rtl' ? 'padding-left' : 'padding-right');
        return `${paddingDir}: ${SizeUtils.scrollbarWidth}px;`;
    }}
`;

export const GridShadow = styled(MainGrid)`
    opacity: 0;
`;

рдлрд┐рд░ рджреВрд╕рд░реА рдлрд╛рдЗрд▓ рдореЗрдВ:

<SyncableGrid
    mainGridRef={this.firstGridMain}
    shadowGridRef={this.firstGridShadow}
    onScroll={this.handleFirstGridScroll}
    // other props omitted for bravity...
>
   // children omitted for bravity...
</SyncableGrid>
<SyncableGrid
    mainGridRef={this.secondGridMain}
    shadowGridRef={this.secondGridShadow}
    onScroll={this.handleSecondGridScroll}
    // other props omitted for bravity...
>
   // children omitted for bravity...
</SyncableGrid>

private handleFirstGridScroll = (e: GridOnScrollProps) => {
    const { scrollTop, scrollLeft } = e;

    // synchronize self
    if (this.firstGridMain.current) {
        this.firstGridMain.current.scrollTo({ scrollTop, scrollLeft });
    }

    // synchronize other grid
    if (this.secondGridMain.current) {
        this.secondGridMain.current.scrollTo({ scrollTop, scrollLeft });
        this.secondGridShadow.current.scrollTo({ scrollTop, scrollLeft });
    }
}

@alonrbar рдпрд╣ рдЖрдХрд░реНрд╖рдХ рд╣реИ! рдореИрдВ рдЗрд╕реЗ рдЬрд▓реНрдж рд╣реА рдЖрдЬрдорд╛рдКрдВрдЧрд╛ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╢реИрдбреЛ рдЧреНрд░рд┐рдб рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧреНрд░рд┐рдб рдХреЗ рдКрдкрд░ рд░рд╣рддрд╛ рд╣реИ, рд╣рд╛рдБ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ "рдЕрд╕рд▓реА рдЧреНрд░рд┐рдб" рдкрд░ рдИрд╡реЗрдВрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рд╡реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯреНрд╕ + x/y рдХреЛрд░реНрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣реИрдХреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдореБрдЦреНрдп рдЧреНрд░рд┐рдб рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ @barbalex re: рд╡рд┐рдВрдбреЛрдЬрд╝ рдореЗрдВ рднреА рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрд░реЛрдо рдлреНрд▓реИрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдХреНрд░реЛрдо рдореЗрдВ рдХреБрдЫ рд╣реИ

рдпрд╣ рдореБрджреНрджрд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдиреАрдореЗрд╢рди рдлреНрд░реЗрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ "рд╕реБрдЪрд╛рд░реВ" рд╣реЛрдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд┐рдВрддрд┐рдд рд╣реИрдВ рддреЛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдкреНрд░рджрд░реНрд╢рди/рдЕрдВрддрд░рд╛рд▓ рдЪреАрдЬ рд╣реИ рдЬреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рд╕реНрдХреНрд░реЙрд▓ рд╕рд┐рдВрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ (рдЬрд╣рд╛рдВ рдПрдХ div рдХреЗ рд╕реНрдХреНрд░реЙрд▓ рдкрд░ рджреВрд╕рд░реЗ рдХреА рд╕реНрдХреНрд░реЙрд▓ рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рд╣реЛрддреА рд╣реИ) рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЕрдкрд░рд╛рдзреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж рдЗрд╕реЗ рд╢реБрджреНрдз рд╡реЗрдирд┐рд▓рд╛ рдЬреЗрдПрд╕ рдореЗрдВ рднреА рдХрд░реЗрдВ

Ahhh @ranneyd рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ рдпрд╣ рдХреНрд▓рд┐рдХ рдИрд╡реЗрдВрдЯ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ... рдЙрд╕ рдкрд░ рдХреБрдЫ рдФрд░ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ...

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЛрдо рдореЗрдВ рдереНрд░реЗрдбреЗрдб рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛

2019-07-15_00h03_42

@alonrbar рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛:

рдореБрдЦреНрдп рдЧреНрд░рд┐рдб рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рдореЗрдВ рдЖрдк рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП e.preventDefault(); рдпрд╛ рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░ рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рддрдирд╛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдЧрд╛, рдЬреЛ рдпрд╣ рдЕрдиреНрдп рд╕рд┐рдВрдХ рдХрд┐рдП рдЧрдП рд╕рд╛рдорд╛рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдк рдЙрд╕реА рддрддреНрд╡ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рддреЛ рдП рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдмреА рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдП рдкрд░ рд╕реНрдХреНрд░реЙрд▓ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд░рджреНрдж рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рдмреА рдФрд░ рдП рдХреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдЗрд╕рд╕реЗ рдХрд╛рдо рд╣реЛ рдЬрд╛рдпреЗрдЧрд╛?

рдореИрдВ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрдкреНрдпреВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рд╣реВрдВред рдмрд╣реБрдд рд╣реИрдХреА рд▓реЗрдХрд┐рди рдореИрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рдерд╛ред @bwaughn рд╡рд┐рдЪрд╛рд░?

@barbalex рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░реЛрдо рдлрд╝реНрд▓реИрдЧ рдХреЛ рдЪрд╛рд▓реВ рдФрд░ рдмрдВрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ

@ranneyd рдореИрдВрдиреЗ рдЕрднреА рдЗрд╕рдореЗрдВ рджреЗрдЦрд╛ рд╣реИ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб ( рд▓рд┐рдВрдХ ) рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рд╕рд╛ рдЭреБрдХрд╛ рд╣реБрдЖ рд╣реИ рд▓реЗрдХрд┐рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдк рд╕реНрдХреНрд░реЙрд▓ рдИрд╡реЗрдВрдЯ рдХреЛ

@alonrbar рд╣рд╛рдБ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред рдпрджрд┐ рдЖрдк _do_ рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕реАрдзрд╛ рд▓рд┐рдВрдХ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ: рдХреНрд░реЛрдо: // рдЭрдВрдбреЗ / # рдЕрдХреНрд╖рдо -рдереНрд░реЗрдбреЗрдб-рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ

@alonrbar рдПрд╣ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднрдпрд╛рдирдХ рдирд╣реАрдВ рд╣реИ рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдЧреНрд░рд┐рдб рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╕рд╛рде рд╣реИрдХрд┐рдВрдЧ рдХрд░реЗрдВрдЧреЗред

рдпрд╣ рд╕рд┐рд░реНрдл рд╕реНрдХреНрд░реЙрд▓ рд╡реНрд╣реАрд▓ рд╣реИ рдирд╛? рдХреНрдпрд╛ рддреАрд░ рдХреБрдВрдЬрд┐рдпрд╛рдБ рднреА рдРрд╕рд╛ рдХрд░рддреА рд╣реИрдВ?

рдпрд╣ рдпрд╣рд╛рдВ рд╕реНрд╡реАрдХреГрдд рдЙрддреНрддрд░ рд╕реЗ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ: https://stackoverflow.com/questions/4770025/how-to-disable-scrolling-temporally

function disableScroll() {
  if (window.addEventListener) // older FF
      window.addEventListener('DOMMouseScroll', preventDefault, false);
  document.addEventListener('wheel', preventDefault, {passive: false}); // Disable scrolling in Chrome
  window.onwheel = preventDefault; // modern standard
  window.onmousewheel = document.onmousewheel = preventDefault; // older browsers, IE
  window.ontouchmove  = preventDefault; // mobile
  document.onkeydown  = preventDefaultForScrollKeys;
}

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реА рдХрдИ рдШрдЯрдирд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдФрд░ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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

@alonrbar рд╣рд╛рдБ, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдБ рдХрд┐ SO рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд

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

@alonrbar рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдЧреИрд░-рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреНрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд┐рдпрд╛ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреА рд╣реИ рд╡рд╣ рд╣реИ рдмрд╛рд╣рд░реА рдХрдВрдЯреЗрдирд░ред рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдкрд░ рдпрд╣ рд╢реАрд░реНрд╖/рдмрд╛рдПрдВ рдорд╛рдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдВрддрд░рд┐рдХ рддрддреНрд╡реЛрдВ рдХреЛ рдкреВрд░реНрдг-рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдирд╣реАрдВ scrollTo рдпрд╛ scrollTop = ... , рдЬреЛ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдмрд╣реБрдд рджреБрдЦ рд╣реЛ рд░рд╣рд╛ рдерд╛ред рдЙрд╕рдХреЗ рдКрдкрд░, рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рд╣рдореЗрд╢рд╛ ENTIRE рдЧреНрд░рд┐рдб рдХреЗ рдмрд╛рд╣рд░ рд╣реЛрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ рдЬреЛ рдЪреАрдЬрд╝ рдмрдирд╛рдИ рд╣реИ рд╡рд╣ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рднреА рддрд░рдл "рдЬрдореЗ рд╣реБрдП рд╢реАрд░реНрд╖рд▓реЗрдЦ" рд╣реЛ рд╕рдХрддреА рд╣реИред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдореЛрдЯрд╛ рдЙрджрд╛рд╣рд░рдг/рдкреАрдУрд╕реА рд╣реИред

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

https://codesandbox.io/embed/non-virtual-scroll-synced-table-ot467

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣реА рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рддрд░реНрдХ рдЬреЛ рдЗрд╕ lib рдХреЛ рдИрдВрдзрди рджреЗрддрд╛ рд╣реИ рдЙрд╕реЗ рдЗрд╕ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

@ranneyd рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди!

рдореБрдЭреЗ рдЧрддрд┐рд╢реАрд▓ рдЧреНрд░рд┐рдб рд░рдЪрдирд╛ рдкрд╕рдВрдж рд╣реИ :)

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

рдпрджрд┐ рдЖрдк react-window рдХреА render рд╡рд┐рдзрд┐ рд╕реЗ рдЬреБрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде 459 рдФрд░ рдЖрдЧреЗ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рддрдм рдЖрдк рдСрдирд╕реНрдХреНрд░реЙрд▓ рдИрд╡реЗрдВрдЯ рдХреЛ рд╣реБрдХ рдХрд░ рд╕рдХреЗрдВрдЧреЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрдбрд╝рдиреЗ рдкрд░ рдЗрд╕рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХреЗрдВрдЧреЗ (рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдЕрднреА рднреА рд╣рдореЗрд╢рд╛ рд╣рд┐рд▓реЗрдВрдЧреЗ рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдмрджрд▓рдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред

@alonrbar рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдЬрдм рдпрд╣ рдЧреНрд░рд┐рдб рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд╣реА рдПрд▓реНрдЧ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рднреНрдп рд╣реИред рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдВрддрд░рд╛рд▓ рдХреЗ 200x200 рдЧреНрд░рд┐рдб рдФрд░ рдХреЗрд╡рд▓ рдереЛрдбрд╝реЗ рд╕реЗ 500x500 рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЕрдЧрд░ рдореЗрд░реЗ рдорд╛рд▓рд┐рдХ рдореБрдЭреЗ рдЗрд╕ рдкрд░ рдФрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдЬреЛ рд╢рд╛рдпрдж рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

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

@ranneyd рд╣рд╛рдБ, рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд╕рдорд╛рдзрд╛рди рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реВрдВрдЧрд╛ рд▓реЗрдХрд┐рди рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ :)

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

https://codesandbox.io/embed/absolute-position-scrolling-1u7vj

рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрджрд┐ рд╣рдо top рдФрд░ left рдЧреБрдгреЛрдВ рдХреЛ Content рдШрдЯрдХ рд╕реЗ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рддреЛ
рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрдм рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ onscroll рдШрдЯрдирд╛ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдиреЗ рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдПрдХрд╛рдзрд┐рдХ рдЧреНрд░рд┐рдб рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХреБрдЫ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдЧрд▓реА рдмрд╛рд░ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ...

рдЗрд╕ рдЪрд░реНрдЪрд╛ рдиреЗ рдореБрдЭреЗ рдЙрддреНрд╕реБрдХ рдХрд░ рджрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рджреЛ рд╕реНрдХреНрд░реЙрд▓-рд╕рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯ рдХрд┐рдпрд╛ Grid s рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреНрдб MultiGrid , рддрд╛рдХрд┐ рдореИрдВ рд╕рдордЭ рд╕рдХреВрдВ рдХрд┐ рдХреИрд╕реЗ perf рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ :
https://github.com/bvaughn/react-window-vs-react-virtualized-synced-grids

рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдпреЛрдЧ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдорд╛рди рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд▓реЛрдХрди:

  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдбреАрдИрд╡реА рдореЛрдб рдореЗрдВ рдХрд╛рдлреА рдзреАрдореА рджрд┐рдЦрддреА рд╣реИ рд▓реЗрдХрд┐рди рдЙрддреНрдкрд╛рджрди рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдереЛрдбрд╝рд╛ рддреЗрдЬ/рдЕрдзрд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдорд╣рд╕реВрд╕ рдХрд░рддреА рд╣реИред (рдпрд╣рд╛рдВ рдореЗрд░реА рдУрд░ рд╕реЗ рдкреВрд░реНрд╡рд╛рдЧреНрд░рд╣ рд╕реЗ рдЗрдВрдХрд╛рд░ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИред рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЕрдВрддрд░ рдЫреЛрдЯрд╛ рд╣реИред)
  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рднреА рдмрд╣реБрдд рдХреБрдЫ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░реЙрд▓ рдИрд╡реЗрдВрдЯ рдкрд╣рд▓реЗ рд╕рдХреНрд░рд┐рдп рдЧреНрд░рд┐рдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЧреНрд░рд┐рдб рдХреЛ рдХреИрд╕реНрдХреЗрдбрд┐рдВрдЧ рдЕрдкрдбреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рд╡рд░реНрддрдорд╛рди onScroll (рдЬрд┐рд╕реЗ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рджреМрд░рд╛рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреЗ рдмрдЬрд╛рдп "рдореВрд▓" (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛) рд╕реНрдХреНрд░реЙрд▓ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ (рд░рд┐рдПрдХреНрдЯ рдХреЗ рдмреИрдЪ рдЕрдкрдбреЗрдЯ рдХреЗ рднреАрддрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП Grid рд▓рд┐рдП рдПрдХ рдкреИрдЪ рдмрдирд╛рдпрд╛ред рдЪрд░рдг)ред рдЬрдм рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рддреЛ рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рдЖрд╢рд╛рдЬрдирдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрд▓рдЧ рдХреИрд╕реНрдХреЗрдбрд┐рдВрдЧ рд░реЗрдВрдбрд░ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢рд╛рдпрдж рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ onScroll рд╕рдордп рдмрджрд▓ рджреВрдВрдЧрд╛ред

@bvaughn рдореИрдВрдиреЗ divA -> onScroll -> setState -> ref.scrollTop рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА, рд╡реЗрдирд┐рд▓рд╛ рд╕реНрдХреНрд░реЙрд▓ рдЗрдлреЗрдХреНрдЯ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдпрд╣ рдЕрднреА рднреА рдЗрд╕ рдХреНрд░реЛрдо рдереНрд░реЗрдбреЗрдб-рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдЪреАрдЬрд╝ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрд╛ред рдореИрдВрдиреЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдСрдирд╕реНрдХреНрд░реЙрд▓ рд╣реИрдВрдбрд▓рд░ рдХреЗ рднреАрддрд░ ref.scrollTop рд╕реЗрдЯ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╕реЛрдЪ рд╕рдХрддрд╛ред рдпрджрд┐ рдЖрдк рдХрдо рд╕реЗ рдХрдо рд╕рдВрднрд╡ рдЪрд░рдгреЛрдВ рдореЗрдВ рдСрдирд╕реНрдХреНрд░реЙрд▓ -> рд╕реНрдХреНрд░реЙрд▓рдЯреЙрдк рдкрд░реНрдпрд╛рдкреНрдд рддреЗрдЬрд╝реА рд╕реЗ рдирд╣реАрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ (рдпрд╛ рд╕реНрдХреНрд░реЙрд▓рдЯреЙрдк рд╕реЗрдЯ рдХрд░рдирд╛) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЧреНрд░рд┐рдб рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд▓рдХреНрд╖реНрдп рд╣рдореЗрд╢рд╛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рддреЗрдЬрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдпрд╣ рдереНрд░реЗрдб рдкреНрд░рдмрдВрдзрди рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдмрдирд╛ рд░рд╣реЗред

рдореИрдВрдиреЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдСрдирд╕реНрдХреНрд░реЙрд▓ рд╣реИрдВрдбрд▓рд░ рдХреЗ рднреАрддрд░ ref.scrollTop рд╕реЗрдЯ рдХрд┐рдпрд╛

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

@ranneyd рдФрд░ @bvaughn рдЖрдкрдХреЗ рд╕рд╛рде рдЕрдм рддрдХ рдХреА рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:

  1. рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдбреЗрд╕реНрдХрдЯреЙрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рдореБрдЭреЗ рдЬрдмрд░рджрд╕реНрдд рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

  2. рджреЛ рд╕рд╛рдзрд╛рд░рдг рдЧреИрд░-рд╡рд░реНрдЪреБрдЕрд▓ рдЧреНрд░рд┐рдбреЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (100% рд╕рд╣реА рдирд╣реАрдВ рдмрд▓реНрдХрд┐ рдореЛрдмрд╛рдЗрд▓ рдкрд░ рднреА рдХрд╛рдлреА рдХрд░реАрдм)ред рдпрд╣ рдореЗрд░рд╛ рдЕрдиреБрднрд╡рд╣реАрди, рдЕрднреА рддрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЗрд╕реЗ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓рд╛ рд╣реИ ( yarn storybook )ред

  3. "рдирд┐рдпрдВрддреНрд░рд┐рдд" рд╕реНрдХреНрд░реЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ https://github.com/alonrbar/react-window/commit/c39ce7006dbd590d9c640e37f8a1e78826e4688e

    рдлрд┐рд░ рднреА, рдореИрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд▓рдЪрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ "рдирд┐рдпрдВрддреНрд░рд┐рдд" рд░рдгрдиреАрддрд┐ рдХрд┐рд╕реА рдПрдХ рдЖрднрд╛рд╕реА рд╕реВрдЪреА рдкрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд╕рдХрддреА рд╣реИред

  4. рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЛрдиреЛрдВ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдерд╛, рдХрд┐ рд╢рд╛рдпрдж _callPropsCallbacks рдХреЛ _onScroll рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рд╕реАрдзреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рд▓реИрдЧ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ - рдЕрднреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ

  5. рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╕рдВрдмреЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЖрдИрдПрдордПрдЪрдУ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рддрд░реНрдХ рдХреЛ рд╢реЗрд╖ рдШрдЯрдХ (рд╢рд╛рдпрдж рдПрдХ рд╣реБрдХ рднреА?) рдШрдЯрдХ рд╕рд╣рд╛рд░рд╛ред рдпрд╣ рдЗрд╕ рддрд░реНрдХ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрд╕реА рддрд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ (рдЬреИрд╕реЗ рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ @ranneyd рд╕рдорд╛рдзрд╛рди) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

рд╡рд┐рдЪрд╛рд░?

@alonrbar рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди, рдЬреЛ рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рднреА рдЧреНрд░рд┐рдб рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд╣реАрдВ рд╣реИрдВ, рд▓рдЧрднрдЧ 300x300 рддрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рдереЛрдбрд╝рд╛ рд╕реБрд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ 100% рд╕рдордп рд╕рд┐рдВрдХ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ, рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдмрд╕ рдереЛрдбрд╝рд╛ рд╕реБрд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ)ред рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдмрдбрд╝реЗ рд╕рд░рдгреА рдкрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг/рдорд╛рдирдЪрд┐рддреНрд░рдг рдХрд░ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЖрд╢реНрд╡рд╕реНрдд рдирд╣реАрдВ рд╣реВрдВ рдХрд┐ рд╕реНрдХреНрд░реЙрд▓ рд╕рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рддрдирд╛ рдХрд┐ рдореЗрд░реЗ рдХрд╛рдлреА рд╕рд░рд▓ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрдзрд┐рдХ рдХреИрд╢рд┐рдВрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд▓ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреНрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВ (рдФрд░ рдлрд┐рд░ рд╢рд╛рдпрдж рдмреЗрд╣рддрд░ рдХреИрд╢ рдХрд░реЗрдВ)ред

рдореИрдВрдиреЗ рдореЛрдмрд╛рдЗрд▓ рдкрд░ рдХреБрдЫ рднреА рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдЖрдкрдХреЛ рдХреБрдЫ рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рдереЛрдбрд╝реА рджреЗрд░ рдореЗрдВ рдЖрдЬрдорд╛ рд╕рдХреЗрдВред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @bvaughn рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡рд╣ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕реАрдзреЗ рджреЗрд╢реА рд╕реНрдХреНрд░реЙрд▓ рдореЗрдВ рд╣реБрдХ рдХрд░рдирд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЦреБрдж рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЛ рдПрдХ рд╣реБрдХ рдпрд╛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЦреАрдВрдЪрдиреЗ рдХреА рдмрд╛рдд рд╣реИ, рдпрд╣ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЙрдЬрд┐рдХ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рджреГрд╢реНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИред рдРрд╕рд╛ рднреА рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рджрд░реНрд╢рди рдЯреНрд╡реАрдХ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ рдФрд░ рдореЗрдореЛрдЗрдЬрд╝реЗрд╢рди рд╕рд╛рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╣реБрдХ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рд╣рдж рддрдХ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рд╕рдорд╛рди рдкреНрд░рджрд░реНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реИ рдФрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдХрд┐рддрдирд╛ рддрд░реНрдХ рдирд┐рдХрд╛рд▓ рд╕рдХрддрд╛ рд╣реВрдВред

рдкреБрдирд╢реНрдЪ:
рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЕрднреА рд╕реЛрдЪрд╛ рдерд╛, рдЬреЛ рд╢рд╛рдпрдж рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧреА, рд╡рд╣ рд╣реИ рдирд┐рдВрджрд╛ рдЬреИрд╕реА рдЪреАрдЬ + рд╕реАрдПрд╕рдПрд╕ рд╕рдВрдХреНрд░рдордг рдХрд░рдирд╛ред рдпрджрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ 100 ms рдпрд╛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдХреНрд░реЙрд▓ рдИрд╡реЗрдВрдЯ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдВрджреЛрд▓рди рдХреЛ рдЪреЗрддрди рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдмреЗрд╣рддрд░ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдлреА рд╣рдж рддрдХ рдХрдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рднреА рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд░реНрд▓реНрдб рдСрдл Warcraft рдХреИрд╕реЗ рдХрд┐рдпрд╛ (рдпрджрд┐ рдЕрдВрддрд░рд╛рд▓ рдпрд╛ рдЙрдЪреНрдЪ рд╡рд┐рд▓рдВрдмрддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдореЗрдВ рдПрдХ рдЪрд░рд┐рддреНрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓ рдЬрд╛рдПрдЧреА рдХрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣рд╛рдВ рдЧрдП рдереЗ)ред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ @bvaughn рдкрд░реАрдХреНрд╖рдг рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд╡рд╣ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕реАрдзреЗ рджреЗрд╢реА рд╕реНрдХреНрд░реЙрд▓ рдореЗрдВ рд╣реБрдХ рдХрд░рдирд╛ рдЗрд╕реЗ рдареАрдХ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЦреБрдж рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

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

@alonrbar @bvaughn рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИ:

https://github.com/ranneyd/synced-table

@alonrbar @bvaughn рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдордЬреЗрджрд╛рд░ рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЕрднреА рдЦреЛрдЬрд╛ рд╣реИ:

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдореИрдХрдмреБрдХ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрд░реЛрдо 75 рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдореЗрд░реЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдиреЗ рдХреНрд░реЛрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рдпрджрд┐ рд╡реЗ рдмрд╛рд╣рд░реА рдореЙрдирд┐рдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрдирдХреЗ рд▓реИрдкрдЯреЙрдк рд╕реНрдХреНрд░реАрди рдкрд░ рдпрд╣ рдкрд┐рдЫрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ

рд╣рдореНрдо...рдмрд╛рд╣рд░реА рдореЙрдиреАрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде, рддрд╛рдЬрд╝рд╛ рджрд░ рдпрд╛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрдВрддрд░ рд╣реИрдВред рдЬрдм рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ "рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛" рддреЛ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ?

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

рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рд╛рд░ рдорд╛рди рд▓реА рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕реЗ position: sticky рд╕рд╛рде рдЖрдЬрдорд╛ рд░рд╣рд╛ рд╣реВрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдорд░реНрдерди 100% рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред

рдпрд╣ рдПрдХ рдЧреИрд░-рдкреЙрд▓реАрдлрд╝рд┐рд▓ рдкреЙрд▓реАрдлрд╝рд┐рд▓ рд╣реИ рдЬреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рдХреНрд╖рд┐рдд рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреЗ рд╣реИрдВред
https://github.com/dollarshaveclub/stickybits

@alonrbar @bvaughn рдпрд╣рд╛рдБ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдпрд╣ position: sticky рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рд░реАрдбрдореА рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВред рдХреЛрдб рдХреЛ рдЕрднреА рднреА рдкреНрд░рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

https://github.com/ranneyd/sticky-table

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рди рдореИрдХрдмреБрдХ рд╕реНрдХреНрд░реАрди рдкрд░ рдХреНрд░реЛрдо 75 рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдореЗрд░реЗ рд╕рд╣рдХрд░реНрдорд┐рдпреЛрдВ рдиреЗ рдХреНрд░реЛрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░ рдЧрдпрд╛ред рдпрджрд┐ рд╡реЗ рдмрд╛рд╣рд░реА рдореЙрдирд┐рдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрдирдХреЗ рд▓реИрдкрдЯреЙрдк рд╕реНрдХреНрд░реАрди рдкрд░ рдпрд╣ рдкрд┐рдЫрдбрд╝ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВ

@ranneyd рдЖрдЬ рдореЗрд░реЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдлреНрд░реЗрдо рджрд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдмрд╛рд╣рд░реА рдореЙрдирд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рджрд░ 30 рдПрдлрдкреАрдПрд╕ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдо "рд╕реНрдХреНрд░реЙрд▓" рдИрд╡реЗрдВрдЯ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗрд╡рд▓ рдкреНрд░рддрд┐ рдлреНрд░реЗрдо/рдкреЗрдВрдЯ рднреЗрдЬрддреЗ рд╣реИрдВ)ред рд╢рд╛рдпрдж рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдмрд╛рд╣рд░реА рдореЙрдирд┐рдЯрд░ рдкрд░ рдЖрдкрдХреЗ рд▓рд┐рдП рдЕрдВрддрд░рд╛рд▓ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ?

@bvaughn рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдУрдПрд╕ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ 60 рд╣рд░реНрдЯреНрдЬ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЙрдирд┐рдЯрд░ рдХреЗ рдЪрд╢реНрдореЗ 60 рд╣рд░реНрдЯреНрдЬ рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреЛрдИ рдЭреВрда рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ рддреЛ рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реЛрдЧрд╛

@ranneyd рдореБрдЭреЗ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рдЦреЗрдж рд╣реИ рдХрд┐ рдореИрдВ рдЕрднреА рдмрд╣реБрдд рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реВрдБ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдкрд░ рдЙрдЪрд┐рдд рдирдЬрд╝рд░ рдирд╣реАрдВ рдбрд╛рд▓ рд╕рдХрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЫреЛрдЯреА рдирдЬрд╝рд░ рд╕реЗ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рд╛рдл рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдиреЗ рдПрдХ useVirtual рд╣реБрдХ рдФрд░ рддрд░реНрдХ рдХреЛ рд╕реБрдВрджрд░ рдврдВрдЧ рд╕реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ react-window рд▓рд┐рдП рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╡рд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╢рд╛рдпрдж рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА renderTable рд╡рд┐рдзрд┐ рдХрд╛ рдкрд░реНрджрд╛рдлрд╛рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рд░реЗрдВрдбрд░ рддрд░реНрдХ рдореЗрдВ рдкреНрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рд▓рдкреЗрдЯ рд╕рдХрддреА рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ react-window рдЕрдВрджрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддреЛ рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рдПрдЧреА рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд▓рдбрд╝рд╛рдИ рдкрд░реАрдХреНрд╖рдг рдФрд░ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рд╕рд╛рд░ рд╣реИред

рдПрдХ рдЕрдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ scrollTo рдкреНрд░рддреНрдпрдХреНрд╖ рдбреЛрдо рд╣реЗрд░рдлреЗрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ (рд╢рд╛рдпрдж рд░рд╛рдЬреНрдп рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ) рддреЛ рджреЛ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рд╕рдордиреНрд╡рдпрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирддреАрдЬрд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рдирд╣реАрдВ рд╣реВрдБ @bvaughn рднреА рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдХреБрдЫ рд╕реБрдЭрд╛рд╡ рджреЗ рд░рд╣рд╛ рдерд╛ред

@ranneyd рдЖрдкрдХрд╛ рдЪрд┐рдкрдЪрд┐рдкрд╛-рдЯреЗрдмрд▓ рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЦреБрд╢реА рд╣реЛрдЧреАред рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП npm рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдПрдкреАрдЖрдИ рдЬрд╛рд░реА рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ?

@bvaughn @ranneyd

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

рдЗрд╕рдХрд╛ TLDR рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рд╕реНрдЯрд┐рдХреА рдкреЛрдЬрд┐рд╢рдирд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд░реАрд╕рд╛рдЗрдХреНрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдХреЛрдб рдХрд╛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЯреБрдХрдбрд╝рд╛ рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдкрд░ рдХреНрд░реЗрдбрд┐рдЯ рдФрд░ рдЕрдзрд┐рдХ рдпрд╣рд╛рдБ рд╣реИрдВ ред рдзрдиреНрдпрд╡рд╛рдж!

рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдИ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдареЛрдХрд░ рдЦрд╛рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдпрд╣рд╛рдВ рдЕрдкрдиреЗ рдХрд╛рдордХрд╛рдЬреА рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
https://codesandbox.io/s/y3pyp85zm1

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛, рдЬрдм рддрдХ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд╛рдИрдВ рдУрд░ рд╕реНрдХреНрд░реЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ: рддрдм рд╣реЗрдбрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЧрд▓рдд рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ (рд╕реНрдХреНрд░реЙрд▓ рд╡рд░реНрдЯрд┐рдХрд▓ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред
рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврддреЗ?
рдзрдиреНрдпрд╡рд╛рдж

рдЕрдЧрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдХреЛрдИ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдареЛрдХрд░ рдЦрд╛рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдпрд╣рд╛рдВ рдЕрдкрдиреЗ рдХрд╛рдордХрд╛рдЬреА рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред
https://codesandbox.io/s/y3pyp85zm1

рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛, рдЬрдм рддрдХ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджрд╛рдИрдВ рдУрд░ рд╕реНрдХреНрд░реЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ: рддрдм рд╣реЗрдбрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЧрд▓рдд рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ (рд╕реНрдХреНрд░реЙрд▓ рд╡рд░реНрдЯрд┐рдХрд▓ рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░)ред
рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕рдХрд╛ рд╕рдорд╛рдзрд╛рди рдвреВрдВрдврддреЗ?
рдзрдиреНрдпрд╡рд╛рдж

рдкреВрд░реНрдг рдкреНрд░рдХрдЯреАрдХрд░рдг: рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рд╣реИред рдЗрд╕ рдкрд░рд┐рд╡рд╛рдж рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЖрдзрд╛рд░рд┐рдд рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд╣реИред рдореИрдВрдиреЗ рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдХрдмреБрдХ рдкрд░ рдФрд░ рдХреБрдЫ рдХреНрд░реЛрдо рдлрд╝реНрд▓реИрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдиреАрдореЗрд╢рди рдЬреЗрдПрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рд╕реНрдХреНрд░реЙрд▓рд╕рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрд╛рд╕-рдкрд╛рд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рдзреАрдорд╛ рдерд╛ред рдореБрдЭреЗ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЗрд╕рдХреЗ рдореВрд▓ рдореЗрдВ рдЪрд┐рдкрдЪрд┐рдкрд╛ рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде рд░реАрдореЗрдХ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдерд╛ (рдореИрдВрдиреЗ position: sticky рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛ рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдЕрдм рдЬреЛ рдХреБрдЫ рднреА рд╣реИ рдЙрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)ред

рдЙрд╕ рдиреЗ рдХрд╣рд╛, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рдпрд╛ рддреЛ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП overflow: scroll рд╣реИ рдФрд░ рдлрд┐рд░ рдЙрд╕ рдкреИрдбрд┐рдВрдЧ рдХреЛ рдЕрдВрддрд┐рдо рд╕реЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ, рдпрд╛ рдореИрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ (рдФрд░ рдЗрд╕рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреНрдпрд╛ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░реЗрдлрд░реА рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЕрджреГрд╢реНрдп div рдбрд╛рд▓рдирд╛, рд╕реНрдХреНрд░реЙрд▓ рдмрд╛рд░ рдЖрдХрд╛рд░ рдХреЛ рдорд╛рдкрдирд╛, рдФрд░ рдбреАрдУрдПрдо рдиреЛрдб рдХреЛ рд╣рдЯрд╛рдирд╛ред

рдореИрдВрдиреЗ overflow-y: overlay рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдУрд╡рд░рд▓реЗ рдмрдирд╛рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ рдХреЗрд╡рд▓ рд╡реЗрдмрдХрд┐рдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд┐рдкрдЪрд┐рдкрд╛ рд╣реЗрдбрд░ рдЗрддрдиреА рдЖрдо рдЬрд░реВрд░рдд рд╣реИ, рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдореЗрдВ рдЪрд┐рдкрдЪрд┐рдкрд╛ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдпрд╣ рдХрдИ рдФрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреНрдб рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдмрди рдЬрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛?

@ranneyd рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдФрд░ рд╕реНрдХреНрд░реЙрд▓ рд╕рд┐рдВрдХ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдкрд░ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдЧреНрд░рд┐рдб рдХреЗ рдЕрдВрдд рдХреЗ рдирд┐рдХрдЯ рдЧрд▓рдд рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ:

gridalignement

рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕реБрдЭрд╛рд╡?

рдХреЛрдбрд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг

рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж

рдкрд╛рд░реНрдЯреА рдХреЗ рд▓рд┐рдП рджреЗрд░ рд╣реЛ рдЪреБрдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдмрд╛рдПрдВ рд░реЗрдл рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЫреБрдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореВрд▓ рд░реВрдк рд╕реЗ рдкреАрдмреА рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВред (рдореИрдВрдиреЗ рдпрд╣ рднреА рдХрд┐рдпрд╛ рдХрд┐ рдмрд╛рдПрдВ рд░реЗрдл рдХреЛ рд╕рд┐рдВрдХ рди рдХрд░рдирд╛ рдкрдбрд╝реЗ -> рдореБрдЦреНрдп рдЧреНрд░рд┐рдб

  const headerRef = React.useRef();
  const leftRef   = React.useRef();

  return <Box classes={{
            root:classes.tableContainer
          }}>
      <AutoSizer>
        {({ height, width }) => (<>
        {/*---------------- LA┬аTABLE -------------*/}
          <Grid
            columnCount={1000}
            columnWidth={100}
            height={height}
            rowCount={1000}
            rowHeight={35}
            width={width}
            onScroll={({ scrollLeft, scrollTop }) => {
              if (leftRef.current) {
                leftRef.current.scrollTo({ scrollTop });
              }
              if (headerRef.current) {
                headerRef.current.scrollTo({ scrollLeft });
              }
            }}
          >
            {({ columnIndex, rowIndex, style }) => (
              <Box style={style} classes={{root:classes.cell}}>
                Item {rowIndex},{columnIndex}
              </Box>
            )}
          </Grid>
          {/*---------------- HEADER -------------*/}
          <Grid
            ref={headerRef}
            outerElementType={React.forwardRef((props, ref) => (
              <div ref={ref}  {...props} style={{...props.style,position:"absolute",overflow:"hidden",top:0,right:0,left:150}} />
            ))}
            columnCount={1001}  /*columns count +1 for scroll problems*/
            columnWidth={100}
            height={60}
            rowCount={1}
            rowHeight={60}
            width={width}
          >
            {({ columnIndex, rowIndex, style }) => (
              <Box style={style} classes={{root:classes.headerCell}}>
                Header {rowIndex},{columnIndex}
              </Box>
            )}
          </Grid>  
          {/*---------------- LEFT┬аCOL -------------*/}
          <Grid
            ref={leftRef}
            outerElementType={React.forwardRef((props, ref) => (
              <div ref={ref}  {...props} style={{...props.style,position:"absolute",overflow:"hidden",top:60,left:0}} />
            ))}
            columnCount={1}
            columnWidth={150}
            height={height}
            rowCount={251} /** add 1 for scroll problems at the end */
            rowHeight={140}
            width={150}
          >
            {({ columnIndex, rowIndex, style }) => (
              <Box style={style} classes={{root:classes.headerCell}}>
                Left {rowIndex},{columnIndex}
              </Box>
            )}
          </Grid>  
        </>)}
      </AutoSizer>
    </Box>
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

ivan-badmaev picture ivan-badmaev  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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