React-window: Windowscroller

์— ๋งŒ๋“  2018๋…„ 07์›” 27์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: bvaughn/react-window

์ž‘์—… ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ธ์ƒ์  ์ด๋„ค์š” ๐ŸŽ‰

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— windowscroller ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์—ด๋ ค ์žˆ๊ฑฐ๋‚˜ ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ์•ฑ์—์„œ ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ ๋ฐ˜์‘ ๊ฐ€์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ํ•ญ์ƒ ๋” ์„ฑ๋Šฅ์ด ์ข‹์€ ๋Œ€์•ˆ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๋ฉด windowscroller ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ๋„์›€์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‹ help wanted ๐Ÿ˜Ž enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ฐฝ ์Šคํฌ๋กค๋Ÿฌ๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ react-virtalized ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WindowScroller
https://codesandbox.io/s/vy620pkzzy

๋™์  ์ฝ˜ํ…์ธ ๊ฐ€์žˆ๋Š” WindowScroller
https://codesandbox.io/s/xvl23p7okp

๋ชจ๋“  12 ๋Œ“๊ธ€

WindowScroller ์€ (๋Š”) ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์–ด๋ ค์›€์„ ๊ฒช์€ ๊ฒƒ ์ค‘ ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์˜ ์œ ์šฉ์„ฑ์„ ๋ณด์ง€๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ๋ฐ˜์‘ ์ฐฝ ์œ„์—์ด ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ์™ธ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  ๋ณ„๋„๋กœ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์–ผ๋งˆ๋‚˜ ๋ณต์žกํ•œ ์ง€์— ๋”ฐ๋ผ ๊ทธ๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๋ฐ˜์‘ ์ฐฝ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ์„ ๊ธฐ๊บผ์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€ (๊ท€ํ•˜?)๊ฐ€์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๋Š” PR์„ ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ดˆ๊ธฐ ์‹œ์ž‘์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ณ„๋„๋กœ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋ณต์žกํ•œ ์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฐฝ ์Šคํฌ๋กค๋Ÿฌ๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ react-virtalized ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WindowScroller
https://codesandbox.io/s/vy620pkzzy

๋™์  ์ฝ˜ํ…์ธ ๊ฐ€์žˆ๋Š” WindowScroller
https://codesandbox.io/s/xvl23p7okp

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ค ์กฐ์น˜๋„ ์ทจํ•  ๊ณ„ํš์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ๋‹น์žฅ์€์ด ๋ฌธ์ œ๋ฅผ ๋งˆ๋ฌด๋ฆฌ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์žฅ๊ธฐ ๊ณ„ํš (์ ์–ด๋„ ๋งˆ์Œ ์†์œผ๋กœ๋Š”)์€ ์–ด์จŒ๋“  ๋ณ„๋„์˜ ๋ชจ๋“ˆ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ์ œ์•ˆ์„œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด ๊ธฐ์ฉ๋‹ˆ๋‹ค!

Hu @PascalSenn , ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ˜์‘ ๊ฐ€์ƒํ™” ๋œ WindowScroller๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š” @PascalSenn , ๊ทธ๋ฆฌ๋“œ๋กœ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ €์—๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ๋‹ˆ?

๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

์•ˆ๋…•ํ•˜์„ธ์š”.
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด Grid์˜ ๊ฒฝ์šฐ Lists ์ด์™ธ์˜ ๋‹ค๋ฅธ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์„œ๋ช…์„ ์ œ๊ณตํ•ด์•ผ ํ•จ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ํด๋ฐฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
scrollTo({scrollLeft: number, scrollTop: number}) => https://react-window.now.sh/#/api/FixedSizeGrid

์ด๊ฒƒ์ด ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค ...
์ฐธ๊ณ  : @PascalSenn ์˜ CSS ํŠธ๋ฆญ์„์ฃผ์˜

// This height will override the window.innerHeight set in JSX : height={window.innerHeight}
.window-scroller-override {
  height: 100% !important;
}

๋„์›€์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์— Grid ์ž‘์—… ์ƒ˜ํ”Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. https://codesandbox.io/s/wq301o8qz7

์ฐฝ ์Šคํฌ๋กค๋Ÿฌ๊ฐ€ ์ •๋ง๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ react-virtalized ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

WindowScroller
https://codesandbox.io/s/vy620pkzzy

๋™์  ์ฝ˜ํ…์ธ ๊ฐ€์žˆ๋Š” WindowScroller
https://codesandbox.io/s/xvl23p7okp

์ฐธ๊ณ ๋กœ์ด ์˜ˆ์ œ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์€ window.innerWidth ๋ฐ window.innerHeight ์˜ ์‚ฌ์šฉ์€ ์Šคํฌ๋กค๋ฐ”์˜ ์กด์žฌ๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ € / ์žฅ์น˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์Šคํฌ๋กค๋ฐ” ํฌ๊ธฐ (๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ํ‘œ์‹œํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ฝ˜ํ…์ธ ์ธ์ง€ ์—ฌ๋ถ€)๋Š” ๊ณต์ œ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@bvaughn , ๋กค๋ง ์†๋„๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋„ˆ๋ฌด ๋น ๋ฅธ ์Šฌ๋ผ์ด๋”ฉ๊ณผ ์š”์†Œ์—†์ด ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ๊ฐ€์ƒ ๋ชฉ๋ก์ด ๋งค์šฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@kgregory , ์ด๊ฒƒ์ด InfiniteLoader ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•„์‹ญ๋‹ˆ๊นŒ? ์ œ๊ณตํ•˜๋Š” ์˜ˆ์—์„œ WindowScroller ์˜ onScroll ๋Š” ์™ธ๋ถ€ ๋ฒ”์œ„์—์„œ ์ƒ์„ฑ๋˜๊ณ  List ์ ์šฉ๋œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ InfiniteLoader ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ InfiniteLoader ๋Œ€ํ•œ ์ž์‹ ์ฝœ๋ฐฑ์€ ์ธ์ˆ˜์—์„œ ref ๋ฅผ ๊ฐ€์ ธ์™€ _that_์„ List ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์‹œ๋„ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@mrdanimal InfiniteLoader์—์„œ ๊ฐ€์ ธ์˜จ ์ฐธ์กฐ๋กœ ๋ชฉ๋ก ์ฐธ์กฐ๋ฅผ ์ฐธ์กฐํ•˜๋ ค๋ฉด์ด ๋‹ต๋ณ€์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. https://github.com/bvaughn/react-window/issues/417#issuecomment -583867845

@PascalSenn ์˜ ์ฝ”๋“œ ์ƒŒ๋“œ ๋ฐ•์Šค์—์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ๋‚ด ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ๋œ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์œ ์šฉ ํ•  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ์—ฌ๊ธฐ์— ๊ฒŒ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

FixedSizeList ์˜ˆ์ œ : https://codesandbox.io/s/react-window-with-windowscroller-fixedsizelist-xujgi
VariableSizeGrid ์˜ˆ์ œ : https://codesandbox.io/s/react-window-with-windowscroller-variablesizegrid-7kbwn

DynamicSizeList์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ๊ตฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰