Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ 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 });
}
Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» ref={ instance => { this.List = instance; } }
Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ fixedSixe <List
.
ΠΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ react-virtualized
- ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΡΠ°Π·Π½ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ±ΡΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ Π²ΠΈΠ΄ΠΈΡΠ΅ Π² Π²ΠΎΠΏΡΠΎΡΠ°Ρ
react-virtualized
ΡΠ°ΡΡΠΎ ΠΌΠΎΠ³ΡΡ Π΄Π°ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠ΅ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊ ΡΠ΅ΠΌΡ-ΡΠΎ ΠΏΠΎΠ΄ΠΎΠΉΡΠΈ, Π½ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΡΡΠΎΠΉ, Π½Π΅ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΡ. (Π react-virtualized
List
ΡΠΊΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Grid
. Π react-window
ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ Π΄Π»Ρ Π»ΡΡΡΠ΅ΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°.)
Π― Π½Π΅ Π·Π½Π°Ρ, Π±ΡΠ΄Π΅Ρ Π»ΠΈ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ react-custom-scrollbar
ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ react-window
ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π». Π§Π΅ΡΡΠ½ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Ρ Π½Π΅ ΠΎΡΠ΅Π½Ρ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½ Π² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ΅ ΡΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Ρ ΡΡΠΈΡΠ°Ρ, ΡΡΠΎ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΏΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΠΏΠ»ΠΎΡ
Π°Ρ ΠΈΠ΄Π΅Ρ ΠΈΠ·-Π·Π° ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π²Π»ΠΈΡΡΡ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ. ΠΡΠ°ΠΊ, Ρ Π·Π°ΠΊΡΡΠ²Π°Ρ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ.
ΠΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π²ΠΎΠΏΡΠΎΡΠ°, Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ π
Π― ΠΊΠΎΠ΅-ΡΡΠΎ Π²ΡΡΡΠ½Ρ, ΠΌΠ½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ react-window
ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ½ Π»Π΅Π³ΠΊΠΈΠΉ ΠΈ ΡΠ΅ΡΠ°Π΅Ρ ΠΌΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΠ°ΠΆΠ΅ Ρ Π½Π΅ Π»ΡΠ±Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ, Π½ΠΎ ΡΡΠΎ Π½Π΅ Π² ΠΌΠΎΠΈΡ
ΡΡΠΊΠ°Ρ
, Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΡΠΉ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΏΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ.
Π Ρ
ΡΠ΄ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ react-virtualized
.
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ :)
@ Rahul-Sagore, Π²Ρ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΏΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Ρ 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
Π― ΠΏΡΡΠ°ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ Π² Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΠΎΠΊΠ½Π° ΡΠ΅Π°ΠΊΡΠΈΠΈ.
Π―Π²Π»ΡΠ΅ΡΡΡ Π»ΠΈ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ? Π£ Π²Π°Ρ Π΅ΡΡΡ ΠΈΠ΄Π΅ΠΈ Π½Π° ΡΡΠΎΡ ΡΡΠ΅Ρ? Π― Ρ
ΠΎΡΠ΅Π» Π±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠΈΠΌΠ΅Ρ codeandbox .
ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ° ΡΠΏΠΈΡΠΊΠ° scrollHeight
@rufoot.
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ scrollHeight
Π² ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠ΅. ΠΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ Π·Π΄Π΅ΡΡ Π½Π΅Ρ ΡΠ²ΠΎΠΉΡΡΠ²Π° scrollHeight
.
@bvaughn Π’Ρ
scrollToRow200Auto = () => {
this.listRef.current.scrollToItem(200);
console.log("current position = ", this.listRef.current.props.scrollHeight)
};
ΡΠ΅ΠΊΡΡΠ°Ρ ΠΏΠΎΠ·ΠΈΡΠΈΡ = undefined
@rufoot ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΡΡΠΎΠ³ΠΎ https://codesandbox.io/s/4zjwwq98j4 ?
https://codesandbox.io/embed/jzo2lool2y
ΠΠΎΠ³Π΄Π° Π²Ρ ΠΏΡΠΎΠΊΡΡΡΠΈΠ²Π°Π΅ΡΠ΅ Π²Π½ΠΈΠ· Π² Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΠ°ΡΡΠΈ ΠΎΠΊΠ½Π° ΡΠ΅Π°ΠΊΡΠΈΠΈ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅.
@piecyk Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π²Π°ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ outerElementType
ΠΈ ΠΎΠ½ΠΎ ΠΎΡΠ΅Π½Ρ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅, Π²Ρ Π΅Π³ΠΎ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ?: D
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΡΠΎ Ρ react-scrollbars-custom
. ΠΠ½ ΠΌΠ΅Π½Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ, Π½ΠΎ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ. Π£ ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°ΠΌΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ
ΠΏΠΎΠ»ΠΎΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ?
@ jancama2 Π½Π΅ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π» Π΅Π³ΠΎ ΠΠΎΠΆΠ΅ΡΠ΅ Π»ΠΈ Π²Ρ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ Code Sandbox, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΡΠΎΡΠΌΠΎΠ·ΠΈΡ?
@rufoot ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΡΡΠΎΠ³ΠΎ https://codesandbox.io/s/4zjwwq98j4 ?
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Π°ΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ, Π½ΠΎ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΡΡΠΎ forwardedRef Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ.
ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΏΡΡΠ°ΡΡΡ ΡΠ΅ΡΠΈΡΡ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΏΠΈΡΠΎΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ², ΠΈ ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°ΠΆΠΈΠΌΠ°Ρ Π½Π° ΠΎΠ΄ΠΈΠ½, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ ΠΌΠ°ΡΡΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π² ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠΈ) ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ ΠΏΠΎΡΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΠ°ΡΡΡΡΡΠ°.
@piecyk Π²Ρ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π»ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π΅Π³ΠΎ Ρ InfiniteLoader ΠΈΠ· react-window-infinite-loader
.
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ 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>
ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: Ρ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ. Π― Π½Π΅ ΠΌΠΎΠ³Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΠΎΠΉ ΠΏΠΎΠ»ΠΎΡΠΎΠΉ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ.
Π― Π±ΡΠ» Π±Ρ ΠΏΡΠΈΠ·Π½Π°ΡΠ΅Π»Π΅Π½, Π΅ΡΠ»ΠΈ Π±Ρ ΠΊΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΌΠΎΠ³ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΡΠΎ ΠΌΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π΄Π»Ρ response-scrollbars-custom
@ranihorev Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ? ΠΠΎΠ΄ΠΎΠ²ΠΎΠ΅ ΠΏΠ΅ΡΠΎ @piecyk, ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠΎΠ»ΠΎΡΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ
Π₯ΠΎΡΠΎΡΠΎ, ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΏΡΠΎΡΠΈΡΡ Π΅ΡΠ΅ ΡΠ°Π·. @piecyk Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Π°Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ΄Π° ΡΠ²Π΅ΡΡ
Ρ (Π³Π΄Π΅ Π²Ρ ΠΎΡΠ²Π΅ΡΠΈΠ»ΠΈ Π½Π° @simjes ). Π²ΠΌΠ΅ΡΡΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ, ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠ½ΡΡΡ VariableSizeList ΠΈ ΡΠΊΠ°Π·Π°ΡΡ externalElementType. Π§ΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ ΡΡΠΎΠ³ΠΎ:
<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 ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π²Ρ, Π½ΠΎ ΡΡΡΠ»ΠΊΠ° Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π½Π° Π½ΡΠ»Ρ. Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΡΡΠ»ΠΊΡ Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ AutoSizer, Π° ΡΠ°ΠΊΠΆΠ΅ Π² Π΅Π³ΠΎ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ΅, Π½ΠΎ ΠΎΠ½ Π²ΡΠ΅Π³Π΄Π° ΡΠ°Π²Π΅Π½ Π½ΡΠ»Ρ. Π― Π±ΡΠ» Π±Ρ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΈΠ·Π½Π°ΡΠ΅Π»Π΅Π½ Π·Π° ΠΏΠΎΠΌΠΎΡΡ Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΠΏΠΎΡΠ΅ΠΌΡ. ΠΠ°ΠΊ Ρ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π» Π²ΡΡΠ΅, ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ ΠΈ ΠΈΠΌΠ΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π΅Π΅ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΌΠ°ΡΡΡΡΡΠ° Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΡΠΎΠ±Ρ ΡΠΏΠΈΡΠΎΠΊ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π»ΡΡ Π½Π°Π²Π΅ΡΡ .
@ChristopherHButler Π― ΡΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΊΠΎΠ΄Π΅, ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π±Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ΅Π» ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡ ΠΆΠ΅ ΠΏΠ°ΠΊΠ΅Ρ. Π Π΅ΡΠ΅Π½ΠΈΠ΅ I ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ΅, Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅.
@ChristopherHButler Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π² ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΠ΅ ΠΊΠΎΠ΄Π°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅ΠΌ-ΡΠΎ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ?
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΈΠ΄Π΅Ρ Π·Π΄Π΅ΡΡ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ref ΠΈΠ· response-custom-scrollbars, ΡΡΠΎΠ±Ρ ΠΎΠΊΠ½ΠΎ ΡΠ΅Π°ΠΊΡΠΈΠΈ
AutoSizer ΠΈΠ»ΠΈ VariableSizeList Π±ΡΠ΄ΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΡΠΈΠΌ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΠΎΠΌ, ΠΊΠ°ΠΊ Π² ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅
https://codesandbox.io/s/react-window-custom-scrollbars-t4352
@ranihorev ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»ΠΈ Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ Code Sandbox?
@piecyk Π― ΡΠΎΠ·Π΄Π°Ρ ΠΏΡΠΎΡΡΠΎΠΉ (ΠΈ Π»ΠΎΠΌΠ°Π½ΡΠΉ) ΠΏΡΠΈΠΌΠ΅Ρ:
https://codesandbox.io/s/bvaughnreact-window-fixed-size-list-vertical-64kzh?fontsize=14
Π― ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π΄ΡΡΠ³ΠΈΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ref ΠΊΠ°ΠΊ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ ΡΠΊΡΠΎΠ»Π»Π΅ΡΠ°), Π½ΠΎ Π±Π΅Π·ΡΡΠΏΠ΅ΡΠ½ΠΎ ...
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ!
@ranihorev ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ. ΠΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠΎΡ ΠΆΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΏΡΠΎΠΊΡΡΡΠΊΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ.
react-scrollbars-custom
ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΡΡΠ½ΡΠΉ API Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½Π° ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠ° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ https://codesandbox.io/s/bvaughnreact-window-react-scrollbars-custom-pjyxs
ΠΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ» ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ π
@piecyk Π― ΡΠ°Π±ΠΎΡΠ°Ρ Ρ Π²Π°ΡΠ΅ΠΉ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠ΅ΠΉ Π·Π΄Π΅ΡΡ: https://codesandbox.io/s/4zjwwq98j4 . Π― Ρ ΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ onScrollStop Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π² redux, ΡΡΠΎΠ±Ρ Ρ ΠΌΠΎΠ³ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ (ΠΈΠ΄Π΅Ρ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°: 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
--- ΠΡΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΎ
ΠΡΠ»ΠΈ Π²Ρ ΠΎΡΠΊΠ»ΡΡΠΈΡΠ΅ Π²Π΅ΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΌΠ°ΡΡΡΡΡΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΡΠΎΠ³Π΄Π° Last scrollOffset ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠΎΡ
ΡΠ°Π½Π΅Π½ Π² ref ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ onScroll: function
ΠΈΠ· VariableSizeList, ΡΠΎΠ³Π΄Π° Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΡ ΠΏΠΎΠ»ΠΎΡΠ°ΠΌ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ
@piecyk , ΡΡΠΎ
ΠΡΡΠ°ΡΠΈ, ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΡΡΠΎ Π²ΡΠ΅, ΡΡΠΎ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ onScroll
(ΠΊΠΎΡΠΎΡΡΡ Ρ ΠΏΡΠΎΠΏΡΡΡΠΈΠ»), ΠΈ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ»Π°ΡΡ ΡΡΡΠ»ΠΊΡ.
https://codesandbox.io/s/bvaughnreact-window-react-scrollbars-custom-99dn1
@piecyk, ΠΈΠ·Π²ΠΈΠ½ΠΈΡΠ΅, Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΠ» ΡΠΏΠΎΠΌΡΠ½ΡΡΡ, ΡΡΠΎ ΠΌΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ VariableSizeList Π·Π°Π²Π΅ΡΠ½ΡΡΠ° Π² AutoSizer, Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π΅Π³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ»Π°ΡΡΠΎΠ², ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΡΡΠΎ ΠΌΠΎΠ³Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ. ΠΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠΎΠΌΡ Ρ Π½Π΅ ΠΌΠΎΠ³Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ onScrollStop?
ΠΡΡΡΡΠΎΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅:
Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» Π΅Π³ΠΎ Π½Π° Scroll.
`
class BaseTree extends Component {
...
ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ = {scrollPosition: 0,};
...
listRef = React.createRef ();
externalRef = React.createRef ();
...
ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ {
const {ΡΠ·Π»Ρ, nodesFetching, nodesFetchingFailed, extendedNodes, selectedNode} = this.props;
Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΡΡ (
{({Π²ΡΡΠΎΡΠ°, ΡΠΈΡΠΈΠ½Π°}) => ( ref = {this.listRef}
className = "Π‘ΠΏΠΈΡΠΎΠΊ"
externalRef = {this.outerRef}
externalElementType = {TreeScrollbar}
width = {width}
height = {height}
onScroll = {({scrollOffset}) => this.setState ({scrollPosition: scrollOffset})}
itemSize = {index => rowHeights [ΠΈΠ½Π΄Π΅ΠΊΡ]}
itemCount = {nodeTree.length}
itemData = {{
nodeTree
ΡΠ°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΡΠ·Π»Ρ,
ΡΠ·Π»Ρ
nodesFetchingFailed,
selectedNode,
selectedNodeId,
resetRowHeight: this.resetRowHeight,
}}
>
{Π£Π·Π΅Π»}
)}
);
}}
const mapStateToProps = state => ({
scrollPosition: selectors.getTreeScrollPosition (ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅),
});
const mapDispatchToProps = dispatch => ({
setTreeScrollPosition: position => dispatch (actions.setTreeScrollPosition ({position})),
});
ΡΠΊΡΠΏΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ (mapStateToProps, mapDispatchToProps) (BaseTree);
`
Π·Π°ΡΠ΅ΠΌ Π½Π° componentWillUnmout Ρ ΠΎΡΠΏΡΠ°Π²Π»ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠΎΠ·ΠΈΡΠΈΡ Π² redux ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
componentWillUnmount() {
this.props.setTreeScrollPosition(this.state.scrollPosition);
}
ΠΠΎΡ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ΅ΠΏΠ΅ΡΡ - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΌ ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°. Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΌΠ΅ΡΠΎΠ΄Ρ scrollTop Π½Π° this.listRef ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
this.listRef.current.scrollTop()
Π½ΠΎ Ρ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, ΡΡΠΎ ΡΡΠΎ Π½Π΅ ΡΡΠ½ΠΊΡΠΈΡ. Π― Π½Π΅ ΡΠ²Π΅ΡΠ΅Π½, ΠΊΠ°ΠΊΠΎΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ (this.listRef ΠΈΠ»ΠΈ this.outerRef) Ρ ΠΌΠΎΠ³Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ ΠΈΠ»ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅. Π― Π΄ΡΠΌΠ°Π», ΡΡΠΎ ΠΌΠΎΠ³Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π΅Π³ΠΎ Π² componentDidMount BaseTree ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
componentDidMount() {
const { scrollPosition } = this.props;
if (this.listRef.current) {
// console.log('initializing scroll position to : ', scrollPosition);
this.listRef.current.scrollTop(scrollPosition);
}
}
ΠΡΠ±Π°Ρ ΠΏΠΎΠΌΠΎΡΡ Π² ΡΡΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠ½ΡΡΠ° Ρ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ½ΠΎΡΡΡΡ!
edit: ΠΠ½Π΅ ΠΎΡΠ΅Π½Ρ ΠΆΠ°Π»Ρ, Π½ΠΎ ΠΌΠΎΠΉ ΠΊΠΎΠ΄, ΠΏΠΎΡ
ΠΎΠΆΠ΅, Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ΅ΡΡΡ Π² ΡΡΠΎΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΠΏΡΠΎΡΡ ΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π·Π° ΡΡΠΎ :(
@ranihorev forward ref
to response-window Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ ΡΠ°ΠΊΠΈΡ
ΡΡΠ½ΠΊΡΠΈΠΉ, ΠΊΠ°ΠΊ 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-vertical-80zo7
ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΡΡΠ»ΠΎΠΊ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, AutoSizer Π·Π°Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΡΠΏΠΈΡΠΊΠ°, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ this.listRef.current Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ,
Ρ Π°ΠΊΠ΅ΡΡΠΊΠΈΠΉ Π²Π°ΡΠΈΠ°Π½Ρ - ΠΏΡΠ΅ΡΠ²Π°ΡΡ ΠΆΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ» ΡΠ΅Π°ΠΊΡΠΈΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ setTimeout ΠΈ Π²ΡΠ·Π²Π°ΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ ΡΠΈΠΊΠ΅
componentDidMount() {
window.setTimeout(() => {
if (this.listRef.current) {
this.listRef.current.scrollTo(this.props.scrollPosition);
}
}, 0);
}
@piecyk Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΠΎΠΌΠΎΡΡ, Ρ ΠΎΡΠ΅Π½Ρ ΡΠ΅Π½Ρ ΡΡΠΎ :)
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ @piecyk ΠΠ°ΠΆΠ΅ΡΡΡ, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ. ΠΠΎΡΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΠ°ΡΡΡΡΡΠ° ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΡΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΌΠ΅ΡΡΠ°Π½ΠΈΠ΅, Π½ΠΎ Ρ ΠΌΠΎΠ³Ρ Ρ ΡΡΠΈΠΌ ΠΆΠΈΡΡ :) Π― ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°Π» Π΄ΡΡΠ³ΠΎΠΉ Ρ
Π°ΠΊ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΊΠ»ΡΡΠ°Π»ΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ className Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ scrollPosition ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ scrollTop Π² refSetter CustomScrollbars:
if (scrollbarsRef) {
forwardedRef(scrollbarsRef.view);
// HACK
scrollbarsRef.scrollTop(className);
}
ΠΡΠΎΠ΄Π΅ Ρ
ΠΎΡΠΎΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
ΠΡΠ΅ ΡΠ°Π· ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π²Π°ΡΡ ΠΏΠΎΠΌΠΎΡΡ, ΠΎΡΠ΅Π½Ρ ΠΏΡΠΈΠ·Π½Π°ΡΠ΅Π»Π΅Π½! ππ»
Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π²ΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ Π² ΡΡΠΎΠΌ Π²ΡΠΏΡΡΠΊΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ (ΠΈΠ½ΠΎΠ³Π΄Π° ΠΌΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π΅Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°ΡΡ Π½Π° ΠΏΡΠΎΠΊΡΡΡΠΊΡ).
ΠΠΎ ΡΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ!
@ranihorev ΡΡΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π±ΡΠ΄Π΅Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ. ΠΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΡΠ»ΠΊΡ Π½Π° ΡΠΎΡ ΠΆΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° ΠΏΡΠΎΠΊΡΡΡΠΊΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ.
react-scrollbars-custom
ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΈΡΡΠ½ΡΠΉ API Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠ°Π±Π»ΠΎΠ½Π° ΡΠ΅ΠΊΠ²ΠΈΠ·ΠΈΡΠ° ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ https://codesandbox.io/s/bvaughnreact-window-react-scrollbars-custom-pjyxs
Π― ΠΏΡΠΎΠ±ΠΎΠ²Π°Π» ΡΡΠΎ Ρ
react-scrollbars-custom
. ΠΠ½ ΠΌΠ΅Π½Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ, Π½ΠΎ Π²ΡΠ΅ Π΅ΡΠ΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ. Π£ ΠΊΠΎΠ³ΠΎ-ΡΠΎ Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠ°ΠΌΠΈ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΠΎΠ»ΠΎΡ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ?
ΠΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎ? ΠΠ°ΠΊΠΎΠ΅ ΠΎΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?
ΠΡΠ»ΠΈ ΡΡΠΎ ΠΊΠΎΠΌΡ-ΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ, ΠΌΠ½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ OverlayScrollbars . ΠΠ°ΠΌ ΠΏΡΠΎΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΊΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ. ΠΠΎΡ ΠΊΠ°ΠΊ:
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