React-window: Autosizer๋Š” ๋ฐ˜์‘ ์ฐฝ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š”์ด ์งˆ๋ฌธ์„ ์ด๋ ‡๊ฒŒ ๋ฌผ์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋ฒˆ ๋ด์ฃผ์„ธ์š”.

๋‹ค๋ฅธ ์งˆ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
๋‚ด ์ด๋ฏธ์ง€ ์ปฌ๋ ‰์…˜์ด ์ด๋ ‡๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
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

๐Ÿ’ฌ question

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

๋‚˜์—๊ฒŒ๋„ ๊ฐ™์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. AutoSizer๋Š” ๋ฐ˜์‘ ์ฐฝ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ๋†’์ด๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ react-window๋กœ ๊ฐ€์ƒํ™” ๋œ react์—์„œ AutoSizer๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ž๋™ ํฌ๊ธฐ ์ธก์ •๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ _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๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋‹ค์‹œ ์ „ํ™˜ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์š”์†Œ์— ๊ณ„์‚ฐ ๋œ ๋„ˆ๋น„๊ฐ€์—†๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋‹จ์ˆœํžˆ ์ž์‹์„ ๋ Œ๋”๋งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์‹ค์ œ ๊ตฌํ˜„์„ ๊ฐ€์ง€๊ณ  ๋†€์•„์•ผํ•˜์ง€๋งŒ ๋‚ด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํฌ๊ธฐ (๊ณ ์ • ๋˜๋Š” ํ”Œ๋ ‰์Šค ์‚ฌ์šฉ ์—ฌ๋ถ€)๊ฐ€์žˆ๋Š” ํ•œ ์ถœ๋ ฅ์„ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋•๋Š” ํฌ๋ง

image

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๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์›๋ณธ ๋ฌธ์„œ

ํ”Œ๋ ‰์Šค ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ AutoSizer๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

AutoSizer๋ฅผ flex box์˜ ์ง์ ‘์ ์ธ ์ž์‹์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด div๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

<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

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