рдореИрдВ 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; } }
рдЬреЛрдбрд╝рд╛ рд╣реИред
рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдФрд░ 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 рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ?
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
рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╕рд╣рд╛рдпрддрд╛ рдорд┐рд▓реЗрдЧреАред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг
Scrollbars
outerElementType
рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛рдЙрджрд╛рд╣рд░рдг https://codesandbox.io/s/vmr1l0p463