React-window: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ

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

рдореИрдВ react-custom-scrollbar рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ FixedSizeList рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдореИрдВрдиреЗ react-virtualized рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд╛рдБрдЪ рдХреА рд╣реИ: https://github.com/bvaughn/react-virtualized/issues/692#issuecomment -339393521

рд▓реЗрдХрд┐рди рдХреЛрдб рддреНрд░реБрдЯрд┐ рд╣реИ: Uncaught TypeError: Cannot read property 'handleScrollEvent' of undefined рд╕реНрдХреНрд░реЙрд▓ рдкрд░, рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ:

  handleScroll = ({ target }) => {
    const { scrollTop, scrollLeft } = target;

    const { Grid: grid } = this.List;

    grid.handleScrollEvent({ scrollTop, scrollLeft });
  }

рдореИрдВрдиреЗ рддрдпрд╢реБрджрд╛ <List рдШрдЯрдХ рдкрд░ ref={ instance => { this.List = instance; } } рдЬреЛрдбрд╝рд╛ рд╣реИред

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

рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг Scrollbars outerElementType рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

const CustomScrollbars = ({ onScroll, forwardedRef, style, children }) => {
  const refSetter = useCallback(scrollbarsRef => {
    if (scrollbarsRef) {
      forwardedRef(scrollbarsRef.view);
    } else {
      forwardedRef(null);
    }
  }, []);

  return (
    <Scrollbars
      ref={refSetter}
      style={{ ...style, overflow: "hidden" }}
      onScroll={onScroll}
    >
      {children}
    </Scrollbars>
  );
};

const CustomScrollbarsVirtualList = React.forwardRef((props, ref) => (
  <CustomScrollbars {...props} forwardedRef={ref} />
));

// ...

<FixedSizeList
  outerElementType={CustomScrollbarsVirtualList}
  {...rest}
/>

рдЙрджрд╛рд╣рд░рдг https://codesandbox.io/s/vmr1l0p463

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

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

рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ react-custom-scrollbar react-window рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рдХрднреА рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдпрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдкрд░ рдЪреИрдЯ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рд╣реЛ рддреЛ chat

рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкрддрд╛ рд▓рдЧрд╛рдКрдВрдЧрд╛, рдореБрдЭреЗ react-window рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рд▓реНрдХрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореБрдЭреЗ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореЗрд░реЗ рд╣рд╛рде рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ react-virtualized рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред
рдзрдиреНрдпрд╡рд╛рдж :)

@ рд░рд╛рд╣реБрд▓-рд╕рдЧреЛрд░реЗ рдХреНрдпрд╛ рдЖрдкрдиреЗ react-window рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдкреНрд░рд╛рдкреНрдд

рдирд╣реАрдВ, рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЬрд╛рдВрдЪ рдФрд░ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рдпрдХреАрди рдирд╣реАрдВ рд╣реЛрддрд╛ рдЕрдЧрд░ @bvaughn рдЗрд╕реЗ рдордВрдЬреВрд░реА рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ: https://codesandbox.io/s/00nw2w1jv

рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг Scrollbars outerElementType рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

const CustomScrollbars = ({ onScroll, forwardedRef, style, children }) => {
  const refSetter = useCallback(scrollbarsRef => {
    if (scrollbarsRef) {
      forwardedRef(scrollbarsRef.view);
    } else {
      forwardedRef(null);
    }
  }, []);

  return (
    <Scrollbars
      ref={refSetter}
      style={{ ...style, overflow: "hidden" }}
      onScroll={onScroll}
    >
      {children}
    </Scrollbars>
  );
};

const CustomScrollbarsVirtualList = React.forwardRef((props, ref) => (
  <CustomScrollbars {...props} forwardedRef={ref} />
));

// ...

<FixedSizeList
  outerElementType={CustomScrollbarsVirtualList}
  {...rest}
/>

рдЙрджрд╛рд╣рд░рдг https://codesandbox.io/s/vmr1l0p463

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ outerElementType рдпрд╛ innerElementType рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рддрдиреА рдЙрдиреНрдирдд рдЪреАрдЬреЗрдВ рд╕рдВрднрд╡ рд╣реИрдВ

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

рдЖрдк scrollHeight @rufoot рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд░реЗрдлрд░реА рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдкреНрд░реЙрдкрд░ рдореЗрдВ scrollHeight рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ scrollHeight рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИред
@bvaughn рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ?

https://codesandbox.io/s/github/bvaughn/react-window/tree/master/website/sandboxes/scrolling-to-a-list-item

scrollToRow200Auto = () => { this.listRef.current.scrollToItem(200); console.log("current position = ", this.listRef.current.props.scrollHeight) };

рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ = рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд

@rufoot рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ https://codesandbox.io/s/4zjwwq98j4 ?

https://codesandbox.io/embed/jzo2lool2y

рдЬрдм рдЖрдк рд░рд┐рдПрдХреНрд╢рди-рд╡рд┐рдВрдбреЛ рдХреЗ рдиреАрдЪреЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЕрд▓рд░реНрдЯ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

@ рдореИрдВ рдЕрдкрдиреЗ рдЙрдкрд╛рдп outerElementType рд╕рд╛рде рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рдЪреБрдХрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рд╕реБрдкрд░ рдкрд┐рдЫрд▓рдЧреНрдЧреВ рд╣реИ, рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИ ?: D

рдореИрдВрдиреЗ рдЗрд╕реЗ react-scrollbars-custom рд╕рд╛рде рдЖрдЬрд╝рдорд╛рдпрд╛ рд╣реИред рдЗрд╕рдХреА рд╢рд┐рдерд┐рд▓рддрд╛ рдХрдо рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХрдо рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реИрдЧ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд░рдЦреА рд╣реИ?

@ jancama2 рдиреЗ рддрдм рдЗрд╕рдХрд╛ рд╡рд┐рд░реЛрдз рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬрдм рдЖрдк рдкрд┐рдЫрдбрд╝ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ?

@rufoot рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ https://codesandbox.io/s/4zjwwq98j4 ?

рдореИрдВ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдлрд╛рд░рд╡рд░реНрдбрд░рдл рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИред

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

@piecyk рдЖрдкрдиреЗ react-window-infinite-loader рд╕реЗ InfiniteLoader рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИред
рдореИрдВ react-scrollbars-custom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдЕрдирдВрдд рд▓реЛрдбрд░ рдХреЛ рддреЛрдбрд╝рддрд╛ рд╣реБрдЖ рдкреНрд░рддреАрдд рд╣реЛ рд░рд╣рд╛ рд╣реИ :(

рдореЗрд░рд╛ рдХреЛрдб:

<InfiniteLoader isItemLoaded={isItemLoaded} itemCount={items.total} loadMoreItems={loadMoreItems}>
      {({
        onItemsRendered,
        ref,
      }: {
        onItemsRendered: (props: ListOnItemsRenderedProps) => any;
        ref: React.Ref<any>;
      }) => (
        <List
          height={TABLE_HEIGHT}
          width={width}
          itemCount={items.total}
          itemSize={ROW_HEIGHT}
          onItemsRendered={onItemsRendered}
          itemData={{ items }}
          ref={ref}
          outerElementType={Scrollbar}
        >
          {Row}
        </List>
      )}
    </InfiniteLoader>

рдЕрджреНрдпрддрди: рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдЕрдирдВрдд рд╕реНрдХреНрд░реЙрд▓ рдШрдЯрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдореИрдВ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдЕрдЧрд░ рдХреЛрдИ рдореЗрд░реЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░-рдХрд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рддреЛ рдореИрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░реВрдБрдЧрд╛

@ranihorev рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЙрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдКрдкрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб рдкреЗрди @piecyk рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдХрд╕реНрдЯрдо-рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдХреЗрд╡рд▓ рдПрдХ рд░реЗрдлрд░реА рдмрдирд╛рддреЗ рд╕рдордп, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рд╢реВрдиреНрдп рд╣реИ)

рдареАрдХ рд╣реИ рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рдкреВрдЫрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред @piecyk рдореИрдВ рдКрдкрд░ рд╕реЗ рдЖрдкрдХреЗ рдХреЛрдб рдирдореВрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдЬрд╣рд╛рдВ рдЖрдкрдиреЗ @simjes рдХреЛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рдерд╛)ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рдХреА рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ VariableSizeList рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдЯреЛ рдмрд╛рд╣рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЖрдЙрдЯрд░рд┐рдлрд╛рдЗрдореЗрдВрдЯ рдЯрд╛рдЗрдк рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
<TreeRoot onDragOver={e => this.onDragOver(e)} > <AutoSizer> {({ height, width }) => ( <List treeRef={this.props.treeRef} width={width} height={height} itemSize={index => rowHeights[index]} itemCount={nodeTree.length} itemData={{ nodeTree, expandedNodes, nodesFetching, nodesFetchingFailed, selectedNode, selectedNodeId, resetRowHeight: this.resetRowHeight, }} outerElementType={TreeScrollbar} outerRef={this.props.outerRef} onScroll={({ scrollOffset, scrollUpdateWasRequested }) => { if (scrollUpdateWasRequested) { console.log('scrollOffset: ', scrollOffset); } }} > {Node} </List> )} </AutoSizer> </TreeRoot>

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

@ChristopherHButler рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдХрдИ рдмрд╛рд░ рдЙрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрд╕реА рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд░рд╣реВрдВрдЧрд╛ред рдореИрдВ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирдпрд╛ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд▓рд╛рддреА рд╣реИ

@ChristopherHButler рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдХрд┐рд╕реА рднреА рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╣рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдпрд╣рд╛рдВ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдХрд╕реНрдЯрдо-рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рд╕реЗ рд░реЗрдлрд░реА рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рд░рд┐рдПрдХреНрд╢рди-рд╡рд┐рдВрдбреЛ

AutoSizer рдпрд╛ VariableSizeList рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛
https://codesandbox.io/s/react-window-custom-scrollbars-t4352

@ranihorev рдЖрдк рдХреЛрдб рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рднреА рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@ рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг (рдФрд░ рдЯреВрдЯрд╛ рд╣реБрдЖ) рдЙрджрд╛рд╣рд░рдг
https://codesandbox.io/s/bvaughnreact-window-fixed-size-list-vertical-64kzh?fontsize=14

рдореИрдВрдиреЗ рдЕрдиреНрдп рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА (рдЬреИрд╕реЗ рд░реЗрдлрд░реА рдХреЛ рд░реИрдкрд░ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рдирд╛) рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВ ...

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

@ranihorev рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрддреНрд╡ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░реЙрд▓ рдФрд░ рдЙрд╕ рд╕реНрдХреНрд░реЙрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

react-scrollbars-custom рд░реЗрдВрдбрд░ рдкреНрд░реЙрдкреНрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд╛рдЗрд╕рд░ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк https://codesandbox.io/s/bvaughnreact-window-react-scrollbars-custom-pjpxs рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХреЗрдВ

рдХреЛрдИ рд░реВрдкрд░реЗрдЦрд╛ рдирд╣реАрдВ рдХреА, рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдорджрдж рдХрд░рддрд╛ рд╣реИ iling

@piecyk рдореИрдВ рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рдбреЗрдореЛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ: https://codesandbox.io/s/4zjwwq98j4 ред рдореИрдВ redux рдореЗрдВ рдПрдХ рдПрдХреНрд╢рди рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП onScrollStop рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реНрдХреНрд░реЙрд▓ рд╕реНрдерд┐рддрд┐ (рдЗрд╕ рдереНрд░реЗрдб рд╕реЗ рдПрдХ рд╡рд┐рдЪрд╛рд░: https://github.com/malte-wessel/react-custom-scrollbars-issues/146) рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди onScrollStart рдФрд░ onScrollStop рдореЗрд░реЗ рдХреЛрдб рдпрд╛ рдЖрдкрдХреЗ рдбреЗрдореЛ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпрд╛ рд╕реВрдЪреА рд╕реЗ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рддрдХ рдкреНрд░реЙрдкрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?

@ChristopherHButler рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╕рд╣рд╛рд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЬреИрд╕реЗ рдХреБрдЫ

https://codesandbox.io/s/bvaughnreact-window-fixed-size-list-vertical-v2-usi1m

--- рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛
рдпрджрд┐ рдЖрдк рд░реВрдЯ рдмрджрд▓рддреЗ рд╕рдордп рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░реЙрд▓рдСрдлрд╝рд╕реЗрдЯ рдХреЛ Ref рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ VariableSizeList рд╕реЗ onScroll: function рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдХреНрд░реЙрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдЖрдкрдХреЛ рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░реНрд╕ рдкрд░ рдкреНрд░реЛрдкреНрд╕ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

@piecyk рдпрд╣ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реИ, рдзрдиреНрдпрд╡рд╛рдж!
btw, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ onScroll рдлрд╝рдВрдХреНрд╢рди (рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдФрд░ рдХрд┐рд╕реА рднреА рд░реЗрдлрд░реА рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
https://codesandbox.io/s/bvaughnreact-window-react-scrollbars-custom-99dn1

рдорд╛рдл рдХрд░рдирд╛, рдореБрдЭреЗ рдорд╛рдл рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореБрдЭреЗ рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рд╢рд╛рдпрдж рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП onScrollStop рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ?

рд╢реАрдШреНрд░ рдирд╡реАрдиреАрдХрд░рдг:
рдореИрдВрдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реНрдЯреЗрдЯ рдЬреЛрдбрд╝рд╛ рдФрд░ рдЗрд╕реЗ рдСрдирдХреНрд░реЙрд╕ рд╕реЗрдЯ рдХрд┐рдпрд╛ред

`
рдХреНрд▓рд╛рд╕ рдмреЗрд╕рдЯреНрд░реА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдШрдЯрдХ {
...
рд░рд╛рдЬреНрдп = {рд╕реНрдХреНрд░реЙрд▓рдкреЛрдЬрд┐рд╢рди: 0,};
...
listRef = React.createRef ();
рдЖрдЙрдЯрд░ рд░реАрдл = React.createRef ();
...
рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ {
const {nodes, nodes
рд╡рд╛рдкрд╕реА (

{(рдКрдВрдЪрд╛рдИ, рдЪреМрдбрд╝рд╛рдИ}) => (
Ref = {this.listRef}
className = "рд╕реВрдЪреА"
рдЖрдЙрдЯрд░ рд░реАрдл = {this.outerRef}
рдЖрдЙрдЯрд░рдореЗрдВрдЯрдЯрд╛рдЗрдк = {рдЯреНрд░реАрд╕реНрдХреНрд░реЛрд▓рдмрд╛рд░}
рдЪреМрдбрд╝рд╛рдИ = {рдЪреМрдбрд╝рд╛рдИ}
рдКрдБрдЪрд╛рдИ = {рдКрдБрдЪрд╛рдИ}
onScroll = {({ScrollOffset}) => this.setState ({рд╕реНрдХреНрд░реЙрд▓рдкреЛрдЬрд┐рд╢рди: рд╕реНрдХреНрд░реЙрд▓рдСрдлрд╝рд╕реЗрдЯ)}}
itemSize = {index => rowHeights [рд╕реВрдЪрдХрд╛рдВрдХ]}
itemCount = {nodeTree.length}
рдЖрдЗрдЯрдордбреИрдЯ = {{
рдиреЛрдбрдЯреНрд░реА,
рд╡рд┐рд╕реНрддрд╛рд░рд┐рддрдиреЙрдбреНрд╕,
рдиреЛрдбрд┐рдВрдЧ,
nodesFetchingFailed,
рдЪрдпрдирд┐рдд
рдЪрдпрдирд┐рдд
рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ
}}
>
{рдиреЛрдб}

)}

);
}}

const mapStateToProps = рд░рд╛рдЬреНрдп => ({
рд╕реНрдХреНрд░реЙрд▓рдкреЛрдЬрд┐рд╢рди: рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ редgetTreeScrollPosition (рд░рд╛рдЬреНрдп),
};

const mapDispatchToProps = рдкреНрд░реЗрд╖рдг => ({
setTreeScrollPosition: рд╕реНрдерд┐рддрд┐ => рдкреНрд░реЗрд╖рдг (рдХреНрд░рд┐рдпрд╛рдПрдБ редsetTreeScrollPosition ({рд╕реНрдерд┐рддрд┐})),
};

рдирд┐рд░реНрдпрд╛рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдиреЗрдХреНрдЯ (mapStateToProps, mapDispatchToProps) (рдмреЗрд╕рдЯреНрд░реА);
`

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

componentWillUnmount() { this.props.setTreeScrollPosition(this.state.scrollPosition); }

рдореЗрд░рд╛ рдПрдХрдорд╛рддреНрд░ рдореБрджреНрджрд╛ рдЕрдм рд╕реНрдХреНрд░реЙрд▓ рд╕реНрдерд┐рддрд┐ рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬрдм рдШрдЯрдХ рдлрд┐рд░ рд╕реЗ рдЖрд░реЛрд╣рд┐рдд рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ scrollTop рдкрджреНрдзрддрд┐ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджреЗрдЦреЗрдВ:

this.listRef.current.scrollTop() рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╕рдВрдкрддреНрддрд┐ (this.listRef рдпрд╛ this.outerRef) рдореИрдВ рд╕реНрдХреНрд░реЙрд▓ рд╕реНрдерд┐рддрд┐ рдпрд╛ рдХрд┐рд╕ рдкрджреНрдзрддрд┐ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдореИрдВ рдмреЗрд╕рдЯреНрд░реА рдХреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:
componentDidMount() { const { scrollPosition } = this.props; if (this.listRef.current) { // console.log('initializing scroll position to : ', scrollPosition); this.listRef.current.scrollTop(scrollPosition); } }
рдЗрд╕ рдХрд╛рдо рдХреЛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдорджрдж рдХреА рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХреА рдЬрд╛рдПрдЧреА!
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдореБрдЭреЗ рдмрд╣реБрдд рдЦреЗрдж рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рдХреЛрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЗрд╕ рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╕реНрд╡рд░реВрдкрдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ :(

@ranihorev forward ref рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП scrollTo, scrollToItem рдХрд╛рдо рдХрд░рдиреЗ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

@ChristopherHButler рд╕рдВрджрд░реНрдн рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ рд╡реЗ рдбреЙрдХреНрд╕ рд╕реЗ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ

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

рд▓реЗрдХрд┐рди рд╣рд╛рдБ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рд░реВрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреВрд░реЗ рдШрдЯрдХ рдХреЛ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдкреНрд░реЙрдкрд░ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд░рд╛рдЬреНрдп рдкрд░ scrollPosition рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХрдо рдкреБрди: рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ, рдЗрд╕реЗ рд░реЗрдлрд░реА рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред

onScroll={({ scrollOffset }) => this.setState({ scrollPosition: scrollOffset })}

// to 

lastScrollOffsetRef = React.createRef(0);

<List
  onScroll={({ scrollOffset }) => {
    this.lastScrollOffsetRef.current = scrollOffset
  }}
  // ...rest
/>

// then in 
componentWillUnmount() { 
  this.props.setTreeScrollPosition(this.lastScrollOffsetRef.current); 
}

outerRef , рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред listRef.current.scrollTo рд╕рд╣реА рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдореНрдо рдХреЛ componentDidMount рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╡рд┐рдЪрд╛рд░ рд╕рд╣реА рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП,

https://codesandbox.io/s/bvaughnreact-window-fixed-size-list-vertor-80zo7

Refs рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдХреБрдЫ рд╕рдордп рдХреА рд╕рдорд╕реНрдпрд╛ рджрд┐рдЦрддреА рд╣реИ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ AutoSizer рд╡рд┐рд▓рдВрдм рдХреЛ рдЙрд╕ рд╕реВрдЪреА рдХреЗ рд░реЗрдВрдбрд░ рдХрд░ рджреЗ рдЬреЛ рдЗрд╕ рдмрдирд╛рддрд╛ рд╣реИред

рд╣реИрдХ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЪрдХреНрд░ рд╕реЗ рдмреНрд░реЗрдХ рд▓реЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рдЯрд┐рдХ рдкрд░ рд░реЗрдл рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ

componentDidMount() {
  window.setTimeout(() => {
    if (this.listRef.current) {
      this.listRef.current.scrollTo(this.props.scrollPosition);
    }
  }, 0);
}

@piecyk рдорджрдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреА рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реВрдВ :)

рдзрдиреНрдпрд╡рд╛рдж @piecyk рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдорд╛рд░реНрдЧ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдмрдврд╝рддреЗ рд╣реБрдП рдПрдХ рдорд╛рдореВрд▓реА рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд░рд╣ рд╕рдХрддрд╛ рд╣реВрдВ :) рдореИрдВрдиреЗ рдПрдХ рдФрд░ рд╣реИрдХ рдХреА рднреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреЛ рд╕реНрдХреНрд░реЙрд▓рдирд╛рдордкреЗрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕рдиреЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛ рдФрд░ рдХрд╕реНрдЯрдорд╕реНрдХрдХреНрд░рдмрд░реНрд▓реНрд╕ рдХреЗ рд░реЗрдлрд╕реЗрдЯреНрдЯрд░ рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓рдЯреЙрдк рд╕реЗрдЯ рдХрд░рдирд╛ рдерд╛:
if (scrollbarsRef) { forwardedRef(scrollbarsRef.view); // HACK scrollbarsRef.scrollTop(className); }
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдЖрдкрдХреА рд╕рднреА рдорджрдж рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдмрд╣реБрдд рд╕рд░рд╛рд╣рдирд╛ рдХрд░рддрд╛ рд╣реИ !! ЁЯЩМЁЯП╗

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдХрднреА-рдХрднреА рдорд╛рдЙрд╕ рд╕реНрдХреНрд░реЙрд▓ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ)ред

рд▓реЗрдХрд┐рди рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

@ranihorev рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рд╣реЛрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрддреНрд╡ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдХреНрд░реЙрд▓ рдФрд░ рдЙрд╕ рд╕реНрдХреНрд░реЙрд▓ рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред

react-scrollbars-custom рд░реЗрдВрдбрд░ рдкреНрд░реЙрдкреНрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд╛рдЗрд╕рд░ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк https://codesandbox.io/s/bvaughnreact-window-react-scrollbars-custom-pjpxs рдЬреИрд╕рд╛ рдХреБрдЫ рдХрд░ рд╕рдХреЗрдВ

рдореИрдВрдиреЗ рдЗрд╕реЗ react-scrollbars-custom рд╕рд╛рде рдЖрдЬрд╝рдорд╛рдпрд╛ рд╣реИред рдЗрд╕рдХреА рд╢рд┐рдерд┐рд▓рддрд╛ рдХрдо рд╣реИ рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХрдо рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдХрд╕реНрдЯрдо рд╕реНрдХреНрд░реЙрд▓рдмрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реИрдЧ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд░рдЦреА рд╣реИ?

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛? рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдХреНрдпрд╛ рд╣реИ?

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

const Overflow = ({ children, onScroll }) => {
  const ofRef = useRef(null);

  useEffect(() => {
    const el = ofRef.current.osInstance().getElements().viewport;

    if (onScroll) el.addEventListener('scroll', onScroll);

    return () => {
      if (onScroll) el.removeEventListener('scroll', onScroll);
    };
  }, [onScroll]);

  return (
    <OverlayScrollbarsComponent
      options={options}
      ref={ofRef}
    >
      {children}
    </OverlayScrollbarsComponent>
  );
};

рдФрд░ рдлрд┐рд░, рдЕрдкрдиреЗ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреНрдб рдШрдЯрдХ рдореЗрдВ:

<FixedSizeGrid
  {...props}
   outerElementType={Overflow}
>

рдореИрдВ FixedSizeGrid рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓реЗрдЧреАред

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