React-window: ๋ชฉ๋ก ์™ธ๋ถ€์˜ ์Šคํฌ๋กค์„ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2020๋…„ 04์›” 10์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: bvaughn/react-window

์•ˆ๋…•ํ•˜์„ธ์š”, ์ตœ๊ทผ์— ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐ˜์‘ ์ฐฝ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋กค ์ด๋ฒคํŠธ๊ฐ€ ๋ชฉ๋ก ์ž์ฒด์—์„œ ์ˆ˜์‹ ๋˜๋ฉด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ชฉ๋ก์„ div/Tab์œผ๋กœ ๋ž˜ํ•‘ํ•˜๋ฉด ๋ชฉ๋ก์˜ ์Šคํฌ๋กค ๋ง‰๋Œ€๋ฅผ ์ˆจ๊ธฐ๊ณ  ์ƒ์œ„ div๊ฐ€ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ• ์Šคํฌ๋กค ์ œ์–ด? ์ฝ”๋“œ์˜ ์ฃผ์š” ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<div ref={outerRef} style={{overflow:'auto',height:'200px'}} onScroll={scrollCheck}>
        <Tab
            defaultActiveKey='tab1'
            onChange={(key)=>{ console.log("onChange====",key)}}
            >
                <Tab.TabPane tab="hot" tabKey="tab1" >
                    <FixedSizeList
                        className={'demo'}
                        height={200}
                        itemSize={40} 
                        itemData={itemData}
                        width={300}
                        outerRef={outerRef}
                    />
                </Tab.TabPane>
                <Tab.TabPane tab="newest" tabKey="tab2" >
                    <div style={{background: '#368AD9', color: '#fff', padding: '15px' }}>
                        2...
                    </div>
                </Tab.TabPane>
        </Tab>
    </div>

๋ Œ๋”๋ง ํšจ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋‘ ๊ฐœ์˜ ์Šคํฌ๋กค ๋ง‰๋Œ€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

image

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

๋ฐ˜์‘ ์ฐฝ์—์„œ WindowScroller์™€ ๊ฐ™์€ ์˜ˆ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ์˜ ์Šคํฌ๋กค ๋ฆฌ์Šค๋„ˆ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—‰๋ง์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฐ˜์‘ ์ฐฝ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ณ  ์ฝ”๋“œ ์ƒŒ๋“œ ๋ฐ•์Šค ๋˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๊บผ์ด ๊ณต์œ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋ถ€๋ถ„ ์ฃผ์„์„ ๋‹ฌ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋ฐ˜์‘ ๊ฐ€์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ WindowScroller ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๋ฐ˜์‘ ์ฐฝ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ถ€๋ชจ ์Šคํฌ๋กค ์š”์†Œ์— ์ถ”๊ฐ€ํ•˜๊ณ  overflow: hidden์„ ๋ฐ˜์‘ ์ฐฝ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•œ ๋‹ค์Œ ๋ถ€๋ชจ ์Šคํฌ๋กค ๋ฆฌ์Šค๋„ˆ์—์„œ ๋ชฉ๋ก ์Šคํฌ๋กค์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ ์ฐฝ์—์„œ WindowScroller์™€ ๊ฐ™์€ ์˜ˆ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ์˜ ์Šคํฌ๋กค ๋ฆฌ์Šค๋„ˆ๋กœ ๋ฌด์–ธ๊ฐ€๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์—‰๋ง์œผ๋กœ ๋๋‚ฌ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ฐ˜์‘ ์ฐฝ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ณ  ์ฝ”๋“œ ์ƒŒ๋“œ ๋ฐ•์Šค ๋˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๊บผ์ด ๊ณต์œ ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ๋”ฐ๋ผํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€๋ถ€๋ถ„ ์ฃผ์„์„ ๋‹ฌ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‘ ๊ฐ€์ƒํ™”์—์„œ WindowScroller ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://codesandbox.io/s/vy620pkzzy

https://github.com/bvaughn/react-window/issues/30

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