๋๋์ด ์ง๋ฌธ์ ์ด๋ ๊ฒ ๋ฌผ์๋ค. ๊ทธ๋ฌ๋ ๋๋ ์ฌ์ ํ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ต๋๋ค. ํ๋ฒ ๋ด์ฃผ์ธ์.
๋ค๋ฅธ ์ง๋ฌธ์ ์ถ๊ฐํ๊ณ ์ถ์ต๋๋ค.
๋ด ์ด๋ฏธ์ง ์ปฌ๋ ์
์ด ์ด๋ ๊ฒ ๋ํ๋๊ธฐ๋ฅผ ์ํฉ๋๋ค.
https://m.youtube.com/watch?v=jLtr4tpFKQE&time_continue=15
์์ ๋งํฌ ์์ ์ ๊ฐ์ด ์ด๋ฏธ์ง๋ฅผ flex๋ก ๋ํํ๋ ค๋ฉด ์ด๋ป๊ฒํด์ผํฉ๋๊น?
๋ํ Autosizer ๋์ด์ ๋๋น๊ฐ ์๋ํ์ง ์์ผ๋ฏ๋ก window.innerHeight ๋ฐ window.innerWidth๋ฅผ ์ฌ์ฉํ์ฌ ์๋ํด์ผํ์ต๋๋ค.
๋ธ๋ผ์ฐ์ ๋ฅผ ๋ค๋ฅธ ํฌ๊ธฐ๋ก ๋๋ฆด ๋ ์ด๋ฏธ์ง ๋ชจ์์ด ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ ์์๋๋ก ์คํฌ๋กคํ์ง ์๋ ํ ์์น๊ฐ ๋ณ๊ฒฝ๋์ง ์์์ ์๋ฏธํฉ๋๋ค.
๋งํฌ : https://stackoverflow.com/questions/56253318/react-virtualized-auto-sizer-does-not-work
์๋ ํฌ๊ธฐ ์ธก์ ๊ธฐ ๊ตฌ์ฑ ์์ _definitely_๋์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์๋ํฉ๋๋ค. FAQ๋ฅผ ํ์ธํ์ญ์์ค.
https://github.com/bvaughn/react-window#can -a-list-or-a-grid-fill-100-the-width-or-height-of-a-page
Stack Overflow๋ก๋ถํฐ ๋ง์ ์๋ต์๋ฐ์ง ๋ชปํด ์ฃ์กํฉ๋๋ค.ํ์ง๋ง ์ฌ์ ํ ์ด๋ฐ ์ข ๋ฅ์ ์ง๋ฌธ์ ๋ํ ์ฌ๋ฐ๋ฅธ ์์น๋ผ๊ณ ์๊ฐํฉ๋๋ค (FAQ๋ฅผ ๋จผ์ ์ฝ์๋ค ๊ณ ๊ฐ์ ํ๋ฉด : wink :).
๋น์ ์ด ๊ทธ๊ฒ์ด ํ์คํ ์๋ํ๋ค๊ณ ๋งํ๋ฏ์ด, ๋น์ ์ ๊ทธ๊ฒ์ด ๋๋ฅผ ์ํด ์๋ํ์ง ์๋ ์ด์ ๋ฅผ ์๋ดํด ์ค ์ ์์ต๋๊น?
์ด๋ฏธ FAQ๋ฅผ ์ฝ์์ง๋ง window.innerHeigth / Width๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ ํ์ด์ง์ ์ด๋ฏธ์ง๊ฐ ํ์๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ ๋์ด์ ๋๋น๊ฐ 0์
๋๋ค. ๋๋ ๋ด ์ฝ๋๋ฅผ ๋ถ์ฌ ๋ฃ์๊ณ ๋ฌธ์๊ฐ ๋ง์ด ๋์์ด๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌด์์ด ๋ฌธ์ ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ ์ง๋ฌธ์ ์ ์ดํด ํ์
จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. Pls๋ ๋ ๋ง์ ์ค๋ช
์ ์ํด ์ ์๊ฒ ์๋ ค์ค๋๋ค.
์ฌ๊ธฐ์์ ๊ฐ์ ๋ฌธ์ ์์ ์คํ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์๋์ํค์ง ์๋๋ค. ๋๋ฒ๊น ์์ํ ์ฝ๋ ๋ณ๊ฒฝ :
<AutoSizer>
{({ height, width }) => {
console.log(height, width)
return(<List
className="List"
height={height}
itemCount={1000}
itemSize={35}
width={width}
>
{Row}
</List>)
}}
</AutoSizer>
์ ์ฉ ํจํค์ง ( import AutoSizer from "react-virtualized-auto-sizer";
)์์ AutoSizer๋ฅผ ์ฌ์ฉํ ๋ ์ถ๋ ฅ์ด ์์ต๋๋ค.
react-virtualized
( 'react-virtualized'์์ {AutoSizer} ๊ฐ์ ธ ์ค๊ธฐ)์์ ์ฌ์ฉํ๋ฉด 0 0
๋ฐ 0 1806
์๋ํ์ง ์๋ ์ด์ ๊ฐ ์์ ํ ๋ง์์ ๋ค์ ์ต๋๋ค (
์ฌ๊ธฐ์์ ๊ฐ์ ๋ฌธ์ ์์ ์คํ๋ฉ๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์๋์ํค์ง ์๋๋ค. ๋๋ฒ๊น ์์ํ ์ฝ๋ ๋ณ๊ฒฝ :
<AutoSizer> {({ height, width }) => { console.log(height, width) return(<List className="List" height={height} itemCount={1000} itemSize={35} width={width} > {Row} </List>) }} </AutoSizer>
์ ์ฉ ํจํค์ง (
import AutoSizer from "react-virtualized-auto-sizer";
)์์ AutoSizer๋ฅผ ์ฌ์ฉํ ๋ ์ถ๋ ฅ์ด ์์ต๋๋ค.
react-virtualized
( 'react-virtualized'์์ {AutoSizer} ๊ฐ์ ธ ์ค๊ธฐ)์์ ์ฌ์ฉํ๋ฉด0 0
๋ฐ0 1806
์๋ํ์ง ์๋ ์ด์ ๊ฐ ์์ ํ ๋ง์์ ๋ค์ ์ต๋๋ค (
๊ฐ์ ๋ฌธ์ ! ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
๋ํ ๋๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. react-virtualized์ ํฌํจ ๋ ๋ฒ์ ์ผ๋ก ์ ํํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง๋ง react-window์ ํจ๊ป ๋ ๋ฆฝํ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
์ฌ๊ธฐ์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ด๊ฐ ์ป์ ์ ์์๋ค <AutoSizer />
์์
์ ์ฉ ํจํค์ง์์ react-window
๋ด๊ฐ ์ฌ์ฉํ๋ ค๊ณ ํ ๋๊น์ง ref
์ <List />
. ref๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ์ง ์์์ผ๋ฏ๋ก react-virtualized
์์ AutoSizer๋ฅผ ์ฌ์ฉํ๋๋ก ๋ค์ ์ ํํด์ผํ์ต๋๋ค.
๋ฐ๋ผ์ ์์ค ์ฝ๋์์ ์์์ ๊ณ์ฐ ๋ ๋๋น๊ฐ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋จ์ํ ์์์ ๋ ๋๋งํ์ง ์์ต๋๋ค. ๋๋ ์ฌ์ ํ ์ค์ ๊ตฌํ์ ๊ฐ์ง๊ณ ๋์์ผํ์ง๋ง ๋ด ์ปจํ ์ด๋๊ฐ ํฌ๊ธฐ (๊ณ ์ ๋๋ ํ๋ ์ค ์ฌ์ฉ ์ฌ๋ถ)๊ฐ์๋ ํ ์ถ๋ ฅ์ ๋ ๋๋งํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ ๋๋ ํฌ๋ง
TypeScript๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
export 'AutoSizer' was not found in 'react-virtualized-auto-sizer'
ํธ์ง : ์์ ์ฌํญ์ ์ฐพ์์ต๋๋ค.
@types/react-virtualized-auto-sizer
ํจํค์ง๋ AutoSizer
๊ตฌ์ฑ ์์๋ฅผ ๋ช
์ ์ ์ผ๋ก ์ ์ํ์ง ์์ต๋๋ค.
๋์ ๋ค์์ ๊ธฐ๋ณธ ํด๋์ค๋ก ๋ด ๋ณด๋
๋๋ค.
export default class extends React.Component<AutoSizerProps> {}
๋ค์๊ณผ ๊ฐ์ด AutoSizer
๋ก ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
import AutoSizer from 'react-virtualized-auto-sizer';
๋๋ ๋์ด๊ฐ 0์ด๋ผ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์๊ณ ๋ถ๋ชจ๊ฐ ์๋ํ๋ ค๋ฉด ๊ณ ์ ํฌ๊ธฐ๊ฐ ํ์ํ๋ค๋ ๊ฒ์ด ๋ฐํ์ก์ต๋๋ค.
IMO์ด '๊ธฐ๋ฅ'์ AutoSizer์ ํ์์ฑ์ ์์ ํ ์ ๊ฑฐํฉ๋๋ค. ์ฌ์ฉํ์ง ์๊ณ ์์ด์๊ฒ ๊ณ ์ ๋ ํฌ๊ธฐ๋ฅผ ์ค ์๋ ์๊ธฐ ๋๋ฌธ์ ํจ๊ณผ๋ ๋์ผํฉ๋๋ค.
๋ฌธ์์์
AutoSizer expands to fill its parent but it will not stretch the parent. This is done to prevent problems with flexbox layouts. If AutoSizer is reporting a height (or width) of 0- then it's likely that the parent element (or one of its parents) has a height of 0. One easy way to test this is to add a style property (eg background-color: red;) to the parent to ensure that it is the correct size. (eg You may need to add height: 100% or flex: 1 to the parent.)
์ด ๋์์ ์ฌ์ ์ํ๊ณ AutoSizer๊ฐ ๋ถ๋ชจ๋ฅผ ํด๋น ํฌ๊ธฐ๋ก ๋๋ฆฌ๋๋ก prop์ ์ ๋ฌํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค.
๊ฐ์ ๋ฌธ์ ๋ ์์ต๋๋ค.
๋ด๊ฐ ์ป์ ์ ์์๋ค
<AutoSizer />
์์ ์ ์ฉ ํจํค์ง์์react-window
๋ด๊ฐ ์ฌ์ฉํ๋ ค๊ณ ํ ๋๊น์งref
์<List />
. ref๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ํ์ง ์์์ผ๋ฏ๋กreact-virtualized
์์ AutoSizer๋ฅผ ์ฌ์ฉํ๋๋ก ๋ค์ ์ ํํด์ผํ์ต๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ป๊ฒ ํด๊ฒฐํฉ๋๊น?
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์ด๋ป๊ฒ ํด๊ฒฐํฉ๋๊น?
ํ์ค <AutoSizer />
๋ค์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
import { AutoSizer } from 'react-virtualized'
๋์๊ฒ๋ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. AutoSizer๋ ๋ฐ์ ์ฐฝ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ๋์ด๋ฅผ 0์ผ๋ก ์ค์ ํฉ๋๋ค. ๋ํ react-window๋ก ๊ฐ์ํ ๋ react์์ AutoSizer๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
<div style={{ display: 'flex' }}>
<!-- Other children... -->
<div style={{ flex: '1 1 auto' }}>
<AutoSizer>
{({ height, width }) => (
<Component
width={width}
height={height}
{...props}
/>
)}
</AutoSizer>
</div>
</div>
๋๋ ๋ํฌ๋ค๊ณผ ๊ฐ์ ์ค๋ฅ๋ก ์ด๋ ค์์ ๊ฒช์๊ณ ์ ์ ํ ๋๋ ๊ทธ๊ฒ์ ์๋์ํฌ ์ ์์๋ค.
์ธ๋ถ ์ปจํ
์ด๋์ ๋์ด์ ๋๋น๋ฅผ ์ค์ ํด์ผํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์์ ๋ ๋๋งํ์ง ์์ต๋๋ค.
์ด ์์ ๋ฅผ ํ์ธํ์ญ์์ค https://codesandbox.io/s/crazy-zhukovsky-kteok?file=/src/app.js : 277-312
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋์๊ฒ๋ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. AutoSizer๋ ๋ฐ์ ์ฐฝ๊ณผ ํจ๊ป ์ฌ์ฉํ ๋ ๋์ด๋ฅผ 0์ผ๋ก ์ค์ ํฉ๋๋ค. ๋ํ react-window๋ก ๊ฐ์ํ ๋ react์์ AutoSizer๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.