React-window: ๋ฒ„์ „ 2 ๋ณ€๊ฒฝ

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

์ด๊ฒƒ์€ react-window ์˜ ๋‹ค๊ฐ€์˜ค๋Š” ๋ฒ„์ „ 2.0 ๋ฆด๋ฆฌ์Šค์— ๋Œ€ํ•œ ๋‚ด ๊ณ„ํš์„ ๊ณต์œ ํ•˜๊ธฐ์œ„ํ•œ ํฌ๊ด„์  ์ธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์„ ์ˆ˜์šฉ ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ์ดํ•ดํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฒˆ๋“ค ํฌ๊ธฐ, ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ ๋ฌธ์ œ์™€ ๋น„๊ตํ•˜์—ฌ ๊ธฐ๋Šฅ ์š”์ฒญ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๋˜ํ•œ ํ˜„์žฌ ๋ฌธ์„œ๋ฅผ react-window-v1.now.sh ๋„๋ฉ”์ธ์—


๋ชฉ์ฐจ :
  • ๋” ์ ์€ ๊ตฌ์„ฑ ์š”์†Œ ์ง€์›
  • Render Props API ์‚ฌ์šฉ
  • ๋” ์ด์ƒ ์ˆ˜ํ‰ ๋ชฉ๋ก ์ง€์› ์—†์Œ
  • ๊ทธ๋ฆฌ๋“œ ๋งŒ RTL์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • onScroll ์ฝœ๋ฐฑ ํƒ€์ด๋ฐ ๋ณ€๊ฒฝ

    * ๊ธฐํƒ€ ๋ณ€๊ฒฝ / ์ง€์› ์ค‘๋‹จ

๋” ์ ์€ ๊ตฌ์„ฑ ์š”์†Œ

๋ณต์žก์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ตฌ์„ฑ ์š”์†Œ ์ˆ˜ ๋ฅผ

  • SimpleList (์ด์ „ FixedSizeList )

    • ์ด ๊ณ ๋„๋กœ ์ตœ์ ํ™” ๋œ ๋ชฉ๋ก ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํ–‰ ๋†’์ด๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๊ณ  ๋ฏธ๋ฆฌ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • List (์ด์ „ DynamicSizeList )

    • ์ด ๋ชฉ๋ก์€ ๋™์  ํฌ๊ธฐ์˜ ์ฝ˜ํ…์ธ  (์˜ˆ : ์ฑ„ํŒ…, ๋‰ด์Šค ํ”ผ๋“œ)์— ์‚ฌ์šฉ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ResizeObserver API (๋˜๋Š” polyfill)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • Grid (์ด์ „ VariableSizeGrid )

    • ์ด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ˆ˜์ง ๋ฐ ์ˆ˜ํ‰ ์ถ•์„ ๋”ฐ๋ผ ๊ฐ€์ƒํ™”๋˜์–ด์•ผํ•˜๋Š” ํ‘œ ํ˜•์‹ ๋ฐ์ดํ„ฐ (์˜ˆ : ์Šคํ”„๋ ˆ๋“œ ์‹œํŠธ)์— ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ํฌ๊ธฐ ํ–‰๊ณผ ์—ด์„ ์ง€์›ํ•˜์ง€๋งŒ ํฌ๊ธฐ ์ž๋™ ์ธก์ • ๋ฐ ์—…๋ฐ์ดํŠธ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์†Œํ’ˆ ๋ Œ๋”๋ง

react-virtualized ์—์„œ react-window react-virtualized ๋กœ์˜ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋Š” children ๋ฅผ ๋ Œ๋”๋ง ์†Œํ’ˆ (์˜ˆ : children(props) )์ด ์•„๋‹Œ React ์š”์†Œ (์˜ˆ : React.createElement(children, props)) )๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. children(props) ).

์ด๋ฅผ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋™๊ธฐ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • React๋Š” ๋ฉ”๋ชจ ํ™”๋ฅผ์œ„ํ•œ ๋นŒํŠธ์ธ ์†”๋ฃจ์…˜ (์˜ˆ : React.memo , useMemo , shouldComponentUpdate )์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ํ•ญ๋ชฉ ๋ Œ๋”๋Ÿฌ์— ๋Œ€ํ•œ ์ž์ฒด ์บ์‹ฑ ์ถ”์ƒํ™”๋ฅผ ๊ตฌํ˜„ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • ํ›„ํฌ ๋ฐ ์„œ์ŠคํŽœ์Šค์™€ ๊ฐ™์€ API๋Š” ํ•ญ๋ชฉ ๋ Œ๋”๋Ÿฌ ๋‚ด์—์„œ "๊ทธ๋ƒฅ ์ž‘๋™"ํ•ฉ๋‹ˆ๋‹ค.
  • ํ‚ค๋Š” ๋ Œ๋”๋ง ์†Œํ’ˆ์ด ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ  cloneElement ํ˜ธ์ถœ์—†์ด react-window ๋กœ ๊ด€๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํ–‰ํžˆ๋„ ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ธ๋ผ์ธ ํ•ญ๋ชฉ ๋ Œ๋”๋Ÿฌ์—๋Š” ๋†’์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค "์œ ํ˜•"(ํ•จ์ˆ˜ ์ •์˜)์ด ๋‹ค์‹œ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— React๋Š” ๋ Œ๋”๋ง ๋œ ํŠธ๋ฆฌ๋ฅผ ๊นŠ์ด ๋งˆ์šดํŠธ ํ•ด์ œํ•˜๊ณ  ๋‹ค์‹œ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฌธ์„œ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋” ํŽธ๋ฆฌํ•˜๋”๋ผ๋„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๊ฐ€๋ฅด์ณ์•ผํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋ฒ”์œ„๋ฅผ ๋‹ซ์„ ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ๋ชฉ ๋ Œ๋”๋Ÿฌ๊ฐ€ ๋ถ€๋ชจ์™€ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ณต์žกํ•˜์—ฌ itemData ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • areEqual ๋น„๊ต ๋‚ด๋ณด๋‚ด๊ธฐ์™€ ๊ฐ™์€ API๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์žฅ๋‹จ์ ์„ ๊ณ ๋ คํ•œ ํ›„ react-window ์˜ ๋ Œ๋”๋ง ์†Œํ’ˆ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค . ์ด๊ฒƒ์€ ๋‹ค์Œ ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ์˜ˆ์ œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋‹ค์‹œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

const Example = ({ height, items, toggleItemActive, width }) => (
  <List
    height={height}
    itemCount={items.length}
    itemRenderer={({ index, key, style }) => {
      const item = items[index];
      return (
        <div key={key} onClick={() => toggleItemActive(index)} style={style}>
          {item.label} is {item.isActive ? "active" : "inactive"}
        </div>
      );
    }}
    itemSize={35}
    width={width}
  />
);

๋” ์ด์ƒ ์ˆ˜ํ‰ ๋ชฉ๋ก ์ง€์› ์—†์Œ

์ด์ „์—๋Š” ๋ชฉ๋ก ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๊ฐ€๋กœ ๋ฐ ์„ธ๋กœ ๋ ˆ์ด์•„์›ƒ ๋ชจ๋“œ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ์••๋„์ ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ˆ˜์ง ๋ชฉ๋ก์ด๋ฏ€๋กœ layout="horizontal" ์ง€์›์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.


RTL ์ง€์›

๊ทธ๋ฆฌ๋“œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๊ณ„์† direction="RTL" ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ๋ชฉ๋ก์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ˆ˜์ง ๋ ˆ์ด์•„์›ƒ ๋งŒ ์ง€์›ํ•˜๋ฏ€๋กœ). ์ด ์ ˆ์ถฉ์•ˆ์€ ๋ชฉ๋ก์„ ๋” ์ž‘๊ณ  ์œ ์ง€ํ•˜๊ธฐ ์‰ฝ๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.


onItemsRendered ๋ฐ onScroll ์ฝœ๋ฐฑ ๋ณ€๊ฒฝ

๋ชฉ๋ก ๋ฐ ๊ทธ๋ฆฌ๋“œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํ˜„์žฌ onItemsRendered ๋ฐ onScroll ์ฝœ๋ฐฑ ์†Œํ’ˆ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ฝœ๋ฐฑ์€ ์ปค๋ฐ‹ ๋‹จ๊ณ„ (๋ชฉ๋ก ๋˜๋Š” ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๋ Œ๋”๋ง์„ ์™„๋ฃŒ ํ•œ ํ›„) ์ค‘์— ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋Ÿฌํ•œ ์ฝœ๋ฐฑ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ถ€์ž‘์šฉ (๋ถ„์„ ๋กœ๊น…๊ณผ ๊ฐ™์€)์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์•ˆ์ „ํ•˜๋‹ค๋Š” ์ ์—์„œ ์œ ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค ๋™๊ธฐํ™” ๋œ ์—…๋ฐ์ดํŠธ๋Š” ๋‘ ๋ฒˆ์งธ ( "๊ณ„๋‹จ์‹") ๋ Œ๋”๋ง์—์„œ ์ˆ˜ํ–‰๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. .

๋ฒ„์ „ 2๋Š”์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด onScroll ์ฝœ๋ฐฑ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. onScroll ์ฝœ๋ฐฑ์€ ์ด๋ฒคํŠธ์˜ ๋””์ŠคํŒจ์น˜์ฃผ๊ธฐ ๋™์•ˆ ํ˜ธ์ถœ ๋˜์–ด ๋ชจ๋“  ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ชฉ๋ก ๋˜๋Š” ๊ทธ๋ฆฌ๋“œ์˜ ์ž์ฒด ์—…๋ฐ์ดํŠธ๋กœ ์ผ๊ด„ ์ฒ˜๋ฆฌ (React์— ์˜ํ•ด)๋ฉ๋‹ˆ๋‹ค.

onItemsRendered ์ฝœ๋ฐฑ์€ onItemsDisplayed prop๋กœ ๋Œ€์ฒด ๋˜์ง€๋งŒ ์ปค๋ฐ‹์ฃผ๊ธฐ ๋™์•ˆ ๊ณ„์† ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์€ ๋ชฉ๋ก ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์œ ํœด ์šฐ์„  ์ˆœ์œ„๋กœ ์‚ฌ์ „ ๋ Œ๋”๋งํ•˜์—ฌ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„๋ณด๋‹ค ์ ๊ทน์ ์œผ๋กœ ์ตœ์ ํ™”ํ•˜๊ณ  ๋””์Šคํ”Œ๋ ˆ์ด ์ž ๊ธˆ ๊ณผ ๊ฐ™์€ ์‹คํ—˜์  API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๊ธฐํƒ€ ์†Œํ’ˆ ๋ณ€๊ฒฝ / ์ง€์› ์ค‘๋‹จ

์ œ๊ฑฐ ๋  ๋ช‡ ๊ฐ€์ง€ ๋ณด๋ฅ˜์ค‘์ธ ์ง€์› ์ค‘๋‹จ (DEV ๊ฒฝ๊ณ  ํฌํ•จ)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ๋ชฉ๋ก ๋ฐ ๊ทธ๋ฆฌ๋“œ ๊ตฌ์„ฑ ์š”์†Œ์— ๋Œ€ํ•ด innerTagName ๋ฐ outerTagName . (๋Œ€์‹  innerElementType ๋ฐ outerElementType ์‚ฌ์šฉ)
  • ๊ทธ๋ฆฌ๋“œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ์šฐ overscanCount , overscanColumnsCount ๋ฐ overscanRowsCount . (๋Œ€์‹  overscanColumnCount ๋ฐ overscanRowCount ์‚ฌ์šฉ)
  • overscanCount ๋Š” ๋™์  ์˜ค๋ฒ„ ์Šค์บ” ๋ฐฉ์‹์„ ์œ„ํ•ด ๋ชฉ๋ก ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • direction ๋Œ€ํ•œ "horizontal"๋ฐ "vertical"๊ฐ’. (์ด๋“ค์€ layout ๋กœ ์ด๋™๋˜์—ˆ์ง€๋งŒ ๋ฒ„์ „ 2์—์„œ๋Š” ์™„์ „ํžˆ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.)
  • itemData ์†Œํ’ˆ (๋ฐ ํ•ญ๋ชฉ ๋ Œ๋”๋Ÿฌ์— ์ „๋‹ฌ ๋œ ํ•ด๋‹น data ์†Œํ’ˆ)์€ ๋ Œ๋”๋ง ์†Œํ’ˆ API์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • useIsScrolling ์†Œํ’ˆ (๋ฐ ํ•ญ๋ชฉ ๋ Œ๋”๋Ÿฌ์— ์ „๋‹ฌ ๋œ ํ•ด๋‹น isScrolling ์†Œํ’ˆ)์€ ์‚ฌ์ „ ๋ Œ๋”๋ง ๋ฐ ๋””์Šคํ”Œ๋ ˆ์ด ์ž ๊ธˆ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๊ตฌํ˜„ ๋น„์šฉ์ด ๋” ๋งŽ์ด ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.
  • ์Šคํฌ๋กค ์ •๋ ฌ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด์ „์— ๋ช…๋ช… ๋œ "auto"๋Š” ์ด์ œ "minimal"๋กœ ๋ช…๋ช…๋ฉ๋‹ˆ๋‹ค. ์ƒˆ ๊ธฐ๋ณธ๊ฐ’์€ "์ž๋™"์ด ์•„๋‹ˆ๋ผ "์Šค๋งˆํŠธ"์ž…๋‹ˆ๋‹ค.

์œ„์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์†Œํ’ˆ ์ค‘ ์ผ๋ถ€๋Š” ๊ณ„ํš๋œ ๋‹ค๋ฅธ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•  ๋•Œ ์—ฌ์ „ํžˆ ๊ด€๋ จ์ด ์—†์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด์จŒ๋“  ์™„์ „์„ฑ์„ ์œ„ํ•ด ์—ฌ๊ธฐ์— ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‹ help wanted ๐Ÿ’ฌ discussion

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

์ˆ˜ํ‰ ๋ชฉ๋ก์€ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ชจ๋ฐ”์ผ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ปจํŠธ๋กค๊ณผ ๊ฐ™์€ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์บ ๋Ÿฌ์…€์—๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. IMO๋Š” ๋ชจ๋ฐ”์ผ์— ๋ญ”๊ฐ€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

์ˆ˜ํ‰ ๋ชฉ๋ก์€ ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ชจ๋ฐ”์ผ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ปจํŠธ๋กค๊ณผ ๊ฐ™์€ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์บ ๋Ÿฌ์…€์—๋„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. IMO๋Š” ๋ชจ๋ฐ”์ผ์— ๋ญ”๊ฐ€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@istarkov ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ณต์œ ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ‰ ์œˆ๋„์šฐ์— ๋Œ€ํ•ด _any_ ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ํ›จ์”ฌ ๋œ ์ผ๋ฐ˜์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (์บ ๋Ÿฌ์…€์˜ ๊ฒฝ์šฐ์—๋„ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด "์Šคํฌ๋กค"์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์œˆ๋„์šฐ๋ฅผ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š” ์™ผ์ชฝ / ์˜ค๋ฅธ์ชฝ ํ™”์‚ดํ‘œ ํƒ์ƒ‰์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.) ์ผ๋ถ€๋ฅผ ์ƒ์‡„ํ•˜๊ธฐ ์œ„ํ•ด v2์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๋” ๋‚˜์€ ๊ฒฝ๋กœ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ „ ๋ Œ๋”๋ง, ๋™์  ํฌ๊ธฐ ์กฐ์ • ๋“ฑ์œผ๋กœ ์†Œ๊ฐœ ํ•  ๋ณต์žก์„ฑ์˜

๋” ๊ฐ„๋‹จํ•˜๊ณ , ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ, ๋” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋กœ ์ด์–ด์งˆ์ด ๋” ๊ฐ„๊ฒฐํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์— ์ •๋ง ๊ธฐ์ฉ๋‹ˆ๋‹ค.

ํฐ. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ชฉ๋ก์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ๊ฑฐ์˜ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ชฉ๋ก์„ DynamicList๋กœ ๋Œ€์ฒด ํ•  ๊ณ„ํš์ด์ง€๋งŒ ํ•ญ๋ชฉ์œผ๋กœ ์Šคํฌ๋กค ํ•  ์ˆ˜์—†๋Š” ๋™์  ๋ชฉ๋ก์˜ ๋ฌธ์ œ๋Š” ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ์— ๋งค์šฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ ์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜์‘ ์ฐฝ์€ ๊ท€ํ•˜์˜ ์š”๊ตฌ์— ๋งž์Šต๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ๋™์  ๋ชฉ๋ก ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ชฉ๋ก๊ณผ ๋™์ผํ•œ ์„ฑ๋Šฅ์„ ๋™์  ๋ชฉ๋ก์— ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด scrollToItem์„ ์ง€์›ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋“œ๋กญํ•ด๋„ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ๋ชฉ๋ก์ด ๋Š๋ฆฌ๊ณ  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์Šคํฌ๋กค์ด ์ง€์›๋˜์ง€ ์•Š๋Š” ์ด์ƒํ•œ ์ƒํ™ฉ, ๋ชฉ๋ก์—๋Š” ๊ณ ์ • ๋œ ํ•ญ๋ชฉ ๋†’์ด ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ชฉ๋ก์„ DynamicList๋กœ ๋ฐ”๊ฟ€ ๊ณ„ํš์ด์ง€๋งŒ ํ•ญ๋ชฉ์œผ๋กœ ์Šคํฌ๋กค ํ•  ์ˆ˜์—†๋Š” ๋™์  ๋ชฉ๋ก์˜ ๋ฌธ์ œ

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‚ด์žฌ ๋œ ์ œํ•œ์ด ์•„๋‹ˆ๋ผ ํ˜„์žฌ ๊ตฌํ˜„ ์ค‘ ํ•˜๋‚˜ ์ผ ๋ฟ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์„์ง€ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ํ•ด๊ฒฐํ•  ์‹œ๊ฐ„์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ๋Š” ๋™์  ๋ชฉ๋ก ์„ฑ๋Šฅ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ชฉ๋ก๊ณผ ๋™์ผํ•œ ์„ฑ๋Šฅ์„ ๋™์  ๋ชฉ๋ก์— ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด scrollToItem์„ ์ง€์›ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋“œ๋กญํ•ด๋„ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์  ๋ชฉ๋ก์ด ๋Š๋ฆฌ๊ณ  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์Šคํฌ๋กค์ด ์ง€์›๋˜์ง€ ์•Š๋Š” ์ด์ƒํ•œ ์ƒํ™ฉ, ๋ชฉ๋ก์—๋Š” ๊ณ ์ • ๋œ ํ•ญ๋ชฉ ๋†’์ด ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ๋„ ์ž˜ ๋ ์ง€ ๋งํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๋™์  ๋ชฉ๋ก์ด ๋” ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ฐจ์ด๊ฐ€ ํด ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์„ ์ง€์›ํ•˜๊ณ  ์‹ถ์€๋ฐ, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋ฒ”์œ„๋ฅผ ์ค„์—ฌ์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ณ€์ˆ˜ ๋ชฉ๋ก์— ๋งŒ์กฑํ•œ๋‹ค๋ฉด v2๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค (์ ์–ด๋„ ์กฐ๋งŒ๊ฐ„).

@bvaughn ์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋ฌธ์„œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค!
์ง€๋‚œ ์—ฌ๋ฆ„๋ถ€ํ„ฐ์ด ์ž‘์—…์„ ํ•ด์™”๋‚˜์š”? ;-)

์ข€ ๋” ์ง„์ง€ํ•˜๊ฒŒ ๋ง์”€ ๋“œ๋ฆฌ๋ฉด ์ œ๊ฐ€ ํŒฌ์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋ Œ๋”๋ง ์†Œํ’ˆ์ด์ด ๋งฅ๋ฝ์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์˜ค๋Š˜ ์•„์นจ์— ์ผ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ ํ”ผ๊ณคํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ํŒฌ์ด ์•„๋‹ˆ์ง€๋งŒ ๋ Œ๋”๋ง ์†Œํ’ˆ์ด์ด ๋งฅ๋ฝ์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์™œ ํŒฌ์ด ์•„๋‹Œ์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์ˆ˜ํ‰ ๋ชฉ๋ก / ๊ทธ๋ฆฌ๋“œ ์ง€์›์ด AutoSizer (react-virtualized-auto-sizer)์™€ ๊ฐ™์€ ์˜ตํŠธ ์ธ ๊ธฐ๋Šฅ์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ˆ˜ํ‰ ๋ชฉ๋ก์— react-virtualized์™€ react-window๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ react-window API๊ฐ€ ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋” ๊ฐ„๋‹จํ•œ API๋ฅผ ์›ํ•˜๋ฉด์„œ ์ง€์› ์ค‘๋‹จ์˜ ํ•„์š”์„ฑ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๋“œ ์ง€์›์€ ์•„์ง ๊ณ„ํš ์ค‘์ž…๋‹ˆ๋‹ค. ์ˆ˜ํ‰ ์ง€์›์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ง์ด๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

@bvaughn ์ €๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ render props๋ฅผ ์ข‹์•„ํ•˜๊ณ  ์—ฌ๋Ÿฌ๋ถ„์ด ์„ค๋ช…ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ค‘์ฒฉ ๋œ ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ํฌํ•จํ•˜์ง€ ์•Š์„ ์ˆ˜๋„์žˆ๋Š” ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค” ์—ฌ๊ธฐ์—์„œ ๋ชจ๋“  ๊ฒฐํ•จ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ™‚

๋ฒฝ๋Œ ๊ฒฉ์ž๋ฅผ ๊นจ๋‹ฌ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@nikitapilgrim ์•„๋‹ˆ์š”. react-virtualized ์˜ Masonry ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

https://github.com/bvaughn/react-virtualized/blob/master/docs/Masonry.md

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๋ฐ˜์‘ ๊ฐ€์ƒํ™”์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

@nikitapilgrim ์‘. ๐Ÿ‘
React-virtualized๋Š” react-window๊ฐ€ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

react-window์˜ ๋ฒ”์œ„๊ฐ€ ๋Œ€ํญ ์ถ•์†Œ๋˜์–ด ํŒจํ‚ค์ง€๋ฅผ ๋” ์ž‘๊ณ  ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž ์ถฅ๋‹ˆ ๋‹ค. ๐Ÿ˜‰

react-virtualized์˜ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ณ„์†ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ํ›Œ๋ฅญํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค!

์ด react-virtualized babel 7 ๋ฌธ์ œ ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— react-window ๋ฐœ๊ฒฌ ํ–ˆ์Šต๋‹ˆ๋‹ค . react-virtualized Masonry ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ babel ์—…๊ทธ๋ ˆ์ด๋“œ ํ•œ ํ›„์—๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ฐ˜์‘ ๊ฐ€์ƒํ™” ๋ฌธ์ œ๋ฅผ๋ณด๊ณ ํ•˜๋Š” ๊ณณ์ด ์•„๋‹™๋‹ˆ๋‹ค.

@bvaughn์— ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž์‹ ๊ณผ @babangsund๋Š” ๊ฒƒ์„ ์œ„์˜ @nikitapilgrim์— ๋Œ€๋‹ต Masonry ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋„์ž…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค react-window ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ ์—ํ•˜๊ณ  react-virtualized . ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์‹  [email protected] ๋ฐ [email protected] (์˜ˆ : create-react-app ) ์ธ ๊ฒฝ์šฐ react-virtualized ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฐ™์€ ํ† ๋ผ ๊ตฌ๋ฉ์„ ๋‚ด๋ ค๊ฐ€๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•œ ์ •๋ณด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
ยฏ \ _ (ใƒ„) _ / ยฏ

๋ฒ„์ „ 2๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜์žˆ๋Š” ๋™์  ํฌ๊ธฐ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ๋ฐ˜์‘ ๊ฐ€์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
image

์ด๊ฒƒ์ด ๋‚ด ๋ชฉ๋ก์ด ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ชฉ๋ก์œผ๋กœ ๋ณด์ด๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์ธ ์ง€์› ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.

ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค

๋‚˜๋Š” trello์™€ ๊ฐ™์€ ์ œํ’ˆ์— react-window ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์†Œํ’ˆ ๋ Œ๋”๋ง

์ด๊ฒƒ์€ ๋‹จ์ˆœํ•จ๊ณผ ์–ธ๊ธ‰ ๋œ ๋‹จ์ ์„ ํ”ผํ•˜๊ธฐ์œ„ํ•œ ์ข‹์€ ๋ณ€ํ™”์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ api๋Š” react-native์˜ FlatList์™€ ๋” ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. https://github.com/bvaughn/react-window/issues/85 ์—์„œ ํ† ๋ก ์„ ์ฝ์—ˆ๋˜ ๊ฒƒ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค

๋” ์ ์€ ๊ตฌ์„ฑ ์š”์†Œ
๋” ์ด์ƒ ์ˆ˜ํ‰ ๋ชฉ๋ก ์ง€์› ์—†์Œ

์ €๋Š” horizontal ์ง€์› ๋ฐ VariableSizeList ์ œ๊ฑฐ์— ๋Œ€ํ•ด ์ ๊ทน ํˆฌํ‘œํ•ฉ๋‹ˆ๋‹ค. ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์˜ ๊ตฌํ˜„์€ ์œ ์ง€ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ๋ถ€๋‹ด์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์žฌ๊ณ ํ•˜๊ณ  ์œ ์ง€ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ณ€ํ™”์— ๋Œ€ํ•œ ๊ฐ•ํ•œ ์˜๊ฒฌ์€ ์—†์Šต๋‹ˆ๋‹ค. overscanCount ์ œ๊ฑฐ๋Š” ์•ฝ๊ฐ„ ๊ฑฑ์ •๋˜์ง€๋งŒ ์•„์ง ์‚ฌ์šฉ์ž ์ง€์ • ๊ฐ’์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ง๋ฉดํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @bvaughn! ์ด ํŒจํ‚ค์ง€์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ง์žฅ์—์„œ ๋‚ด ํ”„๋กœ์ ํŠธ์— ๋ฒ„์ „ 2๋ฅผ ํ†ตํ•ฉํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ธ์ œ ์ถœ์‹œ ๋ ์ง€์— ๋Œ€ํ•œ ์•ผ๊ตฌ์žฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฐ์‚ฌ ๋“œ๋ฆฌ๋ฉฐ ํ–ฅํ›„ ์ถœ์‹œ ๊ณ„ํš์„ ๊ณต์œ ํ•˜๋ฉด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ค„์ด๋Š” ๋ฐ ํฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค.

์ตœ์‹  react-window ์ด์ƒ ๋ฒ„์ „ 2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WindowScroller ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” "๊ฐ„๋‹จํ•œ"๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด์ด ๋ฒ„์ „ 2์˜ ๊ฒฝ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚œ ๊ฒƒ์ผ๊นŒ ์š”? ์•„๋‹ˆ๋ฉด ๋‚˜์ค‘์— ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์ปจํ…์ŠคํŠธ์—๋Š” ๋‚ด ๋ ˆ์ด์•„์›ƒ์— ๋ฐ”๋‹ฅ ๊ธ€์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ DynamicSizeList ์™€ ๊ฐ™์€ ํ˜„๋Œ€์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ๋ฒˆ์งธ ์Šคํฌ๋กค ๋ง‰๋Œ€๊ฐ€ ๋„์ž…๋ฉ๋‹ˆ๋‹ค (ํ•˜๋‚˜๋Š” ํŽ˜์ด์ง€ ์šฉ, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ์ œํ’ˆ ๋ชฉ๋ก ์šฉ).

ํ›Œ๋ฅญํ•œ ํŒจํ‚ค์ง€. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์  ๋†’์ด ๋ชฉ๋ก์„ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ Œ๋”๋ง ๋œ ํ–‰ ๋†’์ด๋ฅผ ์ƒ์œ„ ๋ชฉ๋ก์— ๋‹ค์‹œ ์ „๋‹ฌํ•˜๊ธฐ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๋…ผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒˆ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋…ผ๋ฆฌ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ž‘์—… ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ

์ด๋ฏธ ์ฐฝ ์Šคํฌ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/bvaughn/react-window/issues/30#issuecomment -428868071

์Šคํฌ๋กคํ•˜๋Š” ๋ฐฉ๋ฒ• ์ขŒ์šฐ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋ฌดํ•œ ์Šคํฌ๋กค !!!

react-virtualized ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  WindowScroller ์„ (๋ฅผ) ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋’ค์— ๋ชฉํ‘œ ๋•Œ๋ฌธ์— react-window ๊ทธ๊ฒƒ์„์— ๋น„ํ•ด ํ›จ์”ฌ ํšจ์œจ์ ์ด๊ณ  ์ ์€ ์ฝ”๋“œ ๋งŒ๋“  react-virtualized ์ •๋„, ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋Š” WindowScroller ์—์„œ react-virtualized . ๋Œ€์‹  react-virtualized-auto-sizer ์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

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

@prabusamvel ํ  ..
๋ณ„๋„ ํŒจํ‚ค์ง€์˜ ์žฅ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ƒˆ๋กœ์šด DynamicSizeList๋ฅผ ๊ฐ€์ง€๊ณ  ๋†€์•˜์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ๋ฉ‹์ง€๋‹ค! ๋‚˜๋Š” ๋ฐฉํ–ฅ ์œ ํ˜•์— 'ttb'์™€ 'btt'(์œ„์—์„œ ์•„๋ž˜๋กœ, ์•„๋ž˜์—์„œ ์œ„๋กœ)๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒƒ์ด ํฐ ํ–ฅ์ƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์œ„์ชฝ์œผ๋กœ ์Šคํฌ๋กค๋˜๋Š” ๋ชฉ๋ก์„ ๊ตฌํ˜„ํ•˜๋Š” ๊นจ๋—ํ•œ ๋ฐฉ๋ฒ•์€ ์—†์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฐฉํ–ฅ์€ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

@toddmacintyre ์ด ๋ฒ„์ „์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 2. ๋ˆ„๊ตฌ๋“ ์ง€ ๋‚˜๋ฅผ ์•ˆ๋‚ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@muhammedmagdi npm install react-window@next

๋ฒ„์ „ 2๊ฐ€ ์—ฌ๊ธฐ ์‚ฌ์–‘์—์„œ ์š”๊ตฌํ•˜๋Š” DOM ๊ตฌ์กฐ๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ›Œ๋ฅญ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. # 217์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋ฌธ์ œ์ด๋ฏ€๋กœ https://www.w3.org/TR/wai-aria-1.1/#grid . ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๋ฒ„์ „ 2์— ๋Œ€ํ•œ ์ œ์•ˆ์€ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@mjurkowski @bvaughn yarn add react-window@next ์„ค์น˜ 1.6.0-alpha.1 . ๋˜ํ•œ ๋™์  ๋ชฉ๋ก ์ƒŒ๋“œ ๋ฐ•์Šค ์˜ˆ์ œ https://react-window-next.now.sh/#/examples/list/dynamic -size๋ฅผ ์‹คํ–‰ํ•˜๋ ค๊ณ ํ•˜๋ฉด Error importing GitHub repository: Could not find package.json

๊ทธ๋ฆฌ๋“œ์—์„œ๋„ index ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? :)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ถ€์—๋Š” ๊ฐ€๋ณ€ ๋„ˆ๋น„ ์—ด ํ—ค๋”๊ฐ€์žˆ๋Š” ๊ทธ๋ฆฌ๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๋“œ์™€ ๊ฒฐํ•ฉ ๋œ ์ˆ˜ํ‰ ๊ฐ€๋ณ€ ํฌ๊ธฐ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๊ณ  ๋‘˜์˜ ์Šคํฌ๋กค์„ ๋™๊ธฐํ™”ํ•˜์—ฌ์ด๋ฅผ ๋‹ฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋กœ ๋ชฉ๋ก์„ ์ œ๊ฑฐํ•˜๋ฉด ํ•ด๋‹น UI๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (๋˜๋Š” ์—ด ๋จธ๋ฆฌ๊ธ€ ๊ทธ๋ฆฌ๋“œ์— ๋‹จ์ผ ํ–‰์ด์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๊ทธ๋ฆฌ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ ์–ด๋„ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ œํ’ˆ์€ ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜ํ‰ ๋ฐ ์ˆ˜์ง์ด ๋ชจ๋‘ ํ•„์š”ํ•˜๋ฏ€๋กœ https://www.npmjs.com/package/react-infinite-grid-scroller์—์„œ ์ง์ ‘ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค

ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค.

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

API๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<Grid
    // First 2 columns are sticky
    stickyLeft={2}
    // Last column is not sticky (default value)
    stickyRight={0}
    // First and last rows are sticky
    stickyTop={1}
    stickyBottom={1}
/>

๋ˆ์ ์ž„์ด ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ณ ์ • ๋œ ์…€๋งŒ ์ถ•์—์„œ ์ฐฝ ๋ฐ–์—์žˆ๋Š” ๊ฒฝ์šฐ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์…€์„ ๋งˆ์šดํŠธ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ position: sticky ๋Œ€์‹  absolute ๋ฐ ์‚ฌ์šฉ margin-x ๋Œ€์‹  left ๋ฐ top ๋ˆ์ ํ•˜์ง€ ์•Š์€ ์ถ•์˜

์ด๋Ÿฌํ•œ ํ›Œ๋ฅญํ•œ ๊ธฐ๋Šฅ์˜ ๋น„์šฉ์€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

  • ์„ค์น˜ ๊ณต๊ฐ„์ด ์ตœ์†Œํ™” ๋จ
  • ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Œ (๋ช‡ ๊ฐœ์˜ ์ถ”๊ฐ€ ํ–‰ / ์—ด๋งŒ ๋ Œ๋”๋ง)
  • ๋ธŒ๋ผ์šฐ์ € ์ง€์›์€ ํ›Œ๋ฅญํ•˜๋ฉฐ position: sticky ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ผ๋ฐ˜ ๋ฒ„์ „์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์ง€์›ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๊ตฌ์ฒด์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ํฌ์ธํŠธ 1 ๋งŒ ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์…€์„ ๋ Œ๋”๋งํ•ด์•ผํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๊ณ  ์ •์„ฑ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ๊บผ์ด ๋„์™€ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

ํฌ๊ธฐ ์ž๋™ ์ธก์ • ๋ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

"์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ๊ฒƒ์ด Autosizer์™€ ๊ฐ™์€ ์ถ”๊ฐ€ ์ฝ”๋“œ ๋ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๋ฐ˜๋“œ์‹œ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์ ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ž˜ ๊ณ ๋ คํ•˜๊ณ  ํ•„์š”ํ•œ ์†”๋ฃจ์…˜์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹ค์ด๋‚˜๋ฏน ์ปฌ๋Ÿผ์ด์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๊ฐ€์ ธ ์˜ค๋Š” ๋ชจ๋“  ์ˆ˜ํ•˜๋ฌผ์— ๋Œ€ํ•ด ๋ฐ˜์‘ ๊ฐ€์ƒํ™”๋ฅผ ์›ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ž˜ ๊ณ ๋ คํ•˜๊ณ  ๋™์  ์—ด์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์†”๋ฃจ์…˜์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์™„์ „ํžˆ ์ดํ•ด๋˜์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋Š” ๋งŽ์€ ๋…ธ๋ ฅ ์ด ํ•„์š”ํ•˜๋ฉฐ์ด ๋„์„œ๊ด€์€ ์‚ฌ๋ž‘์˜ ๋…ธ๋™์ด์—ˆ์Šต๋‹ˆ๋‹ค (์œ ๋ฃŒ ๋…ธ๋ ฅ์ด ์•„๋‹˜). ๋ถˆํ–‰ํ•˜๊ฒŒ๋„ ๋‚œ, ๋‚ด ์•„๋ž˜๋กœ ๋ฒ”์œ„ v2์˜ ๋…ธ๋ ฅ์„ ์™„๋ฃŒ ํ˜ผ์ž ์•„๋ฌด๊ฒƒ๋„ ๋” ๊ณต๊ฒฉ์ ์œผ๋กœ ํ•  ์‹œ๊ฐ„์ด ์—†์—ˆ์–ด์š”. ๐Ÿ˜ž

์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ž˜ ๊ณ ๋ คํ•˜๊ณ  ๋™์  ์—ด์ด ํ•„์š”ํ•œ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์†”๋ฃจ์…˜์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์™„์ „ํžˆ ์ดํ•ด๋˜์—ˆ์ง€๋งŒ ์‹ค์ œ๋กœ ๋Š” ๋งŽ์€ ๋…ธ๋ ฅ ์ด ํ•„์š”ํ•˜๋ฉฐ์ด ๋„์„œ๊ด€์€ ์‚ฌ๋ž‘์˜ ๋…ธ๋™์ด์—ˆ์Šต๋‹ˆ๋‹ค (์œ ๋ฃŒ ๋…ธ๋ ฅ์ด ์•„๋‹˜). ๋ถˆํ–‰ํžˆ๋„ ๋‚˜๋Š” ๋” ๊ณต๊ฒฉ์ ์ธ ๊ฒƒ์€ ๋งํ•  ๊ฒƒ๋„์—†๊ณ  ๋‚˜์˜ _scoped down_ v2 ๋…ธ๋ ฅ์„ ๋งˆ์น  ์‹œ๊ฐ„์กฐ์ฐจ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ž

์˜ˆ. ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ๊ทธ๋Ÿฌํ•œ ๋…ธ๋ ฅ์ด ์ง€์—ญ ์‚ฌํšŒ๋ฅผ ์ด๋Œ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฉ‹์ง€ ๊ฒ ์ง€๋งŒ ์ œ ๊ฒฝํ—˜์œผ๋กœ๋Š” ๊ฒฐ์ฝ” ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ €๋Š” DynamicSizedList์™€ ํ•จ๊ป˜ WindowScroller ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ just-in-time ๋ Œ๋”๋ง์œผ๋กœ ์ธํ•ด scrollTo๊ฐ€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ ๋ฒ„์ „์—์„œ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š”์ด ๋…ธ๋ ฅ์„ ๋งˆ์น  ์‹œ๊ฐ„์ด๋‚˜ ์—๋„ˆ์ง€๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐ›์•„ ๋“ค์˜€๋‹ค. ๋ˆ„๊ตฌ๋“ ์ง€ ๋‚ด๊ฐ€ ์‹œ์ž‘ํ•œ ์ง€์ ์— ๋“ค์–ด๊ฐ€์„œ ๋๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹น์‹ ์˜ ๋„์›€์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ( List ๋ฐ Grid ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ฌธ์ œ # 6์„ ์ฐธ์กฐํ•˜์—ฌ Just-In-Time ์ธก์ •์„ ์ง€์›ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.)

์•ˆ๋…•ํ•˜์„ธ์š” @bvaughn ,
์ž„์˜์˜ ๋ฉ”๋ชจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌํฌ์— ๋Œ€ํ•œ ํ† ๋ก  ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๋ชฉ๋ก์— ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผํ•˜๊ฑฐ๋‚˜ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์€ ๊ฒƒ์ด ์žˆ์œผ๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ์ง„ํ–‰ํ•  ๋•Œ ๋ชฉ๋ก์„ ์™„์„ฑํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ๋ฌผ๊ฑด ๊ฐ™๋„ค์š”

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