React-window: ν•œ ν•­λͺ©μ˜ μ†Œν’ˆμ„ λ³€κ²½ν•˜λ©΄ 전체 λͺ©λ‘μ΄ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.

에 λ§Œλ“  2019λ…„ 03μ›” 18일  Β·  17μ½”λ©˜νŠΈ  Β·  좜처: bvaughn/react-window

μ•Ό,

λ©”λͺ¨ 된 예제λ₯Όλ³΄κ³  ν•­λͺ©μ˜ μƒνƒœκ°€ λ³€κ²½λ˜λ©΄ 전체 λͺ©λ‘μ΄ μ—…λ°μ΄νŠΈλ˜λŠ” 것을 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. μ•„λž˜ Gifλ₯Ό μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. 이것은 https://react-window.now.sh/#/examples/list/memoized -list-items의 μ˜ˆμž…λ‹ˆλ‹€.

2019-03-18_13-43-16

ν˜„μž¬ λ‚΄ λͺ©λ‘μ— λ™μΌν•œ λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  ListItem에 ν™•μΈλž€μ΄ 있으며 μ‚¬μš©μžκ°€μ΄ ν™•μΈλž€μ„ μ„ νƒν•˜λ©΄ λͺ¨λ“  ν•­λͺ©μ΄ 마운트 ν•΄μ œλ˜κ³  λͺ…ν™•ν•˜κ²Œ μƒˆλ‘œ λ§ˆμš΄νŠΈλ©λ‹ˆλ‹€. 정말 느리기 λ•Œλ¬Έμ— 큰 λ¬Έμ œμž…λ‹ˆλ‹€.

image

λˆ„κ΅¬λ‚˜ λ‚˜λ₯Ό λ„μšΈ 수 있기λ₯Ό λ°”λžλ‹ˆλ‹€. :)

πŸ’¬ question

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λͺ…ν™•ν•˜κ²Œ λ§ν•˜λ©΄ λͺ¨λ“  λ¬Έμ„œ μ˜ˆμ œμ—μ„œ ν•­λͺ© λ Œλ”λ§μ΄ μƒμœ„ ꡬ성 μš”μ†Œ μ™ΈλΆ€μ—μ„œ μ •μ˜λ˜λŠ” 것을 보여주고 λ©”λͺ¨ ν™” 예제 λŠ” λ‘˜ μ‚¬μ΄μ—μ„œ 데이터λ₯Ό κ³΅μœ ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. (기본적으둜 더 κ°€λ²Όμš΄ κΈ°λ³Έ 제곡 μ»¨ν…μŠ€νŠΈμ™€ κ°™μŠ΅λ‹ˆλ‹€.)

λͺ¨λ“  17 λŒ“κΈ€

λ‚˜λŠ” λ˜‘κ°™μ€ μ‚¬μš© 사둀와 문제λ₯Ό 가지고 있으며 해결책을 찾을 수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

ν•­λͺ©μ„ λ³€κ²½ν•˜λ©΄ μƒˆλ‘œμš΄ itemData 객체λ₯Ό μƒμ„±ν•˜λŠ” μƒˆλ‘œμš΄ items λ°°μ—΄ 이 생성 되기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ©”λͺ¨ ν™” 기술이 λ¬΄νš¨ν™”λ˜κ³  데이터가 λ³€κ²½λ˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ’…λ₯˜μ˜ 변경에 λŒ€ν•΄ ν•­λͺ©μ΄ 더 κ°•λ ₯ ν•΄ μ§€λ„λ‘ν•˜λ €λ©΄ 고유 ν•œ areEqual ν•¨μˆ˜ (λ˜λŠ” shouldComponentUpdate )λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

데λͺ¨μ˜ λͺ©μ μ€ itemData 와 λ©”λͺ¨κ°€ μ–΄λ–»κ²Œ ν•¨κ»˜ μž‘λ™ν•˜μ—¬ λ³΅μž‘ν•œ 값을 μ „λ‹¬ν•˜λŠ”μ§€ λ³΄μ—¬μ£ΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‚΄ shouldComponentUpdate ν•¨μˆ˜λ‘œ ν…ŒμŠ€νŠΈν–ˆμ§€λ§Œ ꡬ성 μš”μ†Œκ°€ λ°˜λ³΅ν•΄μ„œ 마운트 ν•΄μ œλ˜λ©΄μ΄ ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

ꡬ성 μš”μ†Œκ°€ λ°˜λ³΅ν•΄μ„œ 마운트 ν•΄μ œλ˜λŠ” 경우

마운트 ν•΄μ œ 된 ꡬ성 μš”μ†Œλ₯Ό λ©”λͺ¨ ν•  방법이 μ—†μŠ΅λ‹ˆλ‹€. 그것은 λ‚΄ 데λͺ¨μ—μ„œ μΌμ–΄λ‚˜λŠ” 일이 μ•„λ‹™λ‹ˆλ‹€. 그것이 λ‹Ήμ‹ μ˜ μ•±μ—μ„œ μΌμ–΄λ‚˜λŠ” 일이라면 λ‹€λ₯Έ 일이 μΌμ–΄λ‚˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 그리고 λ‚˜λŠ” 무엇에 λŒ€ν•΄ μΆ”μΈ‘ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

@BertelBB 해결책을 μ°Ύμ•˜μŠ΅λ‹ˆκΉŒ?

@ffjanhoeck 정말 μ•„λ‹™λ‹ˆλ‹€. λ‚΄ λͺ©λ‘μ„ μ •λ ¬ / 필터링 ν•  수 μžˆλ‹€λŠ” μ μ—μ„œ λ‚΄ μ‚¬μš© 사둀가 μ‹€μ œλ‘œ μ•½κ°„ λ‹€λ₯΄λ‹€λŠ” 것을 κΉ¨λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. λ‚΄κ°€ ν•œ 일은 λͺ¨λ“  ν•­λͺ©μ— λŒ€ν•œ ν‚€ μ†Œν’ˆμ„ μˆ˜λ™μœΌλ‘œ μ„€μ •ν•˜λ„λ‘ itemData 및 itemKey μ†Œν’ˆμ„ μ „λ‹¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 전체 λͺ©λ‘μ€ μ—¬μ „νžˆ β€‹β€‹μ—…λ°μ΄νŠΈλ˜μ§€λ§Œ μ΄μ „λ§ŒνΌ μ§€μ—°λ˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
https://react-window.now.sh/#/api/FixedSizeList μ—¬κΈ°μ—μ„œ λ‚΄κ°€ μ°Έμ‘°ν•˜λŠ” μ†Œν’ˆμ— λŒ€ν•΄ 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.

@BertelBB μ–΄μ œ 이미 κ·Έ κΈ°λŠ₯을 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€ :)
κ·ΈλŸ¬λ‚˜ λ¬Έμ œλŠ” ν•΄κ²°λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.
λ‹€μŒμ€ μ§€μ—°λœ GIFμž…λ‹ˆλ‹€. λ³΄μ‹œλ‹€μ‹œν”Ό ν•­λͺ©μ„ ν™•μΈν•˜λŠ” 데 λͺ‡ 밀리 μ΄ˆκ°€ κ±Έλ¦½λ‹ˆλ‹€.
λͺ¨λ“  것이 λ©”λͺ¨λ˜κ±°λ‚˜ shouldComponentUpdateλ₯Ό κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

2019-03-20_15-09-49

@ffjanhoeck 예, 같은 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ•ˆνƒ€κΉκ²Œλ„ μ§€κΈˆμ€ 더 μžμ„Ένžˆ μ‚΄νŽ΄λ³Ό μ‹œκ°„μ΄ μ—†μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 더 λ‚˜μ€ 해결책을 찾으면 μ•Œλ € λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€. :)

@ffjanhoeck μœ„μ˜ GIFμ—μ„œ 보여

@bvaughn 예 λ¬Όλ‘ μž…λ‹ˆλ‹€. μ΄λ©”μΌλ‘œ 자격 증λͺ…을 보내

속도 μ €ν•˜λŠ” ν•­λͺ©μ˜ 짧은 λ―Έλ¦¬λ³΄κΈ°μ—μ„œ λΉ„λ‘―λœ 것 κ°™μŠ΅λ‹ˆλ‹€ (κ·Έλ¦Όκ³Ό 보쑰 ν…μŠ€νŠΈκ°€μžˆλŠ” νŒŒλž€μƒ‰ ν…μŠ€νŠΈλŠ” EntityShortPreview ꡬ성 μš”μ†Œλ₯Ό λ‚˜νƒ€λƒ„). κ·ΈλŸ¬λ‚˜ ν•˜λ‚˜μ˜ ν•­λͺ©μ—λŠ” λ¬Έμ œκ°€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” λͺ¨λ“  ν•­λͺ©μ΄ 마운트 ν•΄μ œλ˜κ³  선택 ν•­λͺ©μ— λ§ˆμš΄νŠΈλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.이λ₯Ό μš”μ•½ν•˜λ©΄ 속도가 λŠλ¦½λ‹ˆλ‹€.

그게 λ‚΄ ν˜„μž¬ λŠλ‚Œμž…λ‹ˆλ‹€ : Dν•˜μ§€λ§Œ μ•„λ§ˆλ„ λ‹€λ₯Έ 문제λ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€ :)

μ‚¬μš©μžκ°€ ν•˜λ‚˜μ˜ ν•­λͺ©μ„ μ„ νƒν•˜λ©΄ λ°œμƒν•©λ‹ˆλ‹€.

image

@ffjanhoeck λ˜‘κ°™μ€ λ¬Έμ œκ°€ λ°œμƒν–ˆκ³  λͺ‡ 가지 쑰사 끝에 원인을 νŒŒμ•…ν•  μˆ˜μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이름이 μ§€μ •λœ ꡬ성 μš”μ†Œ λŒ€μ‹  ν•­λͺ© λ Œλ”λŸ¬λ‘œ 읡λͺ… ν•¨μˆ˜ λ₯Ό μ‚¬μš©ν•˜κ³  있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. μ €λŠ” React μ „λ¬Έκ°€λŠ” μ•„λ‹ˆμ§€λ§Œ μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”λ§κ°„μ— 인식 ν•  μˆ˜μžˆμ„ μ •λ„λ‘œ λ™μΌν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 이것이 React의 쑰정을 엉망이라고 μƒκ°ν•©λ‹ˆλ‹€.

여기에 문제λ₯Ό μ„€λͺ…ν•˜λŠ” CodeSandbox 예제λ₯Ό λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€ : https://codesandbox.io/s/qx4088mn36

λ‚˜λŠ” 이것이 μ—¬κΈ° λŒ€ν™”μ™€ 관련이 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€ : https://github.com/bvaughn/react-window/issues/85#issuecomment -436329610

였늘 아침에 ν›‘μ–΄ λ³Έ 후에도 그게 μ œκ°€λ³΄κ³ μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€. (이메일을 μž‘μ„±ν–ˆμ§€λ§Œ μ€‘λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.) 인라인 ν•¨μˆ˜λ₯Ό μΈμŠ€ν„΄μŠ€ μ†Œν’ˆμœΌλ‘œ μ΄λ™ν•˜λ©΄ μž‘μ—… 속도가 λΉ¨λΌμ‘ŒμŠ΅λ‹ˆλ‹€ (ν•˜μ§€λ§Œ μž¬ν˜„ μ‚¬λ‘€μ˜ 크기둜 인해 좔적 ν•  μ‹œκ°„μ΄ μ—†μ—ˆλ˜ λͺ‡ 가지 λ‹€λ₯Έ λ¬Έμ œλ„ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€).

μ»΄ν¬λ„ŒνŠΈκ°€ λ Œλ”κ°„μ— λ™μΌν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 이것이 React의 쑰정을 μ—‰λ§μœΌλ‘œ λ§Œλ“ λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λ§žμŠ΅λ‹ˆλ‹€. πŸ‘

흠. 이 문제λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ props ν™•μ‚° / κΈ°λŠ₯적 ꡬ성 μš”μ†Œ κΈ°λŠ₯이 λΆ€μ‘±ν•œ ReasonReactλ₯Ό μ‚¬μš©ν•˜μ—¬ ν”„λ‘œμ νŠΈλ₯Ό μž‘μ„±ν•˜κ³  있기 λ•Œλ¬Έμ— 이것은 λΆˆν–‰ν•œ μΌμž…λ‹ˆλ‹€. λ‚˜λŠ” 이것이 μ–΄λ–€ 식 μœΌλ‘œλ“  react-window의 λ¬Έμ œκ°€ μ•„λ‹ˆλΌ ReasonML의 μœ ν˜• μ‹œμŠ€ν…œμ˜ μ œν•œ μ‚¬ν•­μ΄λΌλŠ” 것을 μ•Œκ³  μžˆμ§€λ§Œ λ‹€λ₯Έ μ‚¬λžŒ 이이 μŠ€λ ˆλ“œλ₯Ό μš°μ—°νžˆ λ°œκ²¬ν•˜λŠ” 경우 μ–ΈκΈ‰ ν•  κ°€μΉ˜κ°€ μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

λͺ…ν™•ν•˜κ²Œ λ§ν•˜λ©΄ λͺ¨λ“  λ¬Έμ„œ μ˜ˆμ œμ—μ„œ ν•­λͺ© λ Œλ”λ§μ΄ μƒμœ„ ꡬ성 μš”μ†Œ μ™ΈλΆ€μ—μ„œ μ •μ˜λ˜λŠ” 것을 보여주고 λ©”λͺ¨ ν™” 예제 λŠ” λ‘˜ μ‚¬μ΄μ—μ„œ 데이터λ₯Ό κ³΅μœ ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€. (기본적으둜 더 κ°€λ²Όμš΄ κΈ°λ³Έ 제곡 μ»¨ν…μŠ€νŠΈμ™€ κ°™μŠ΅λ‹ˆλ‹€.)

μ’‹μ•„μš”, μ œκ°€ μ‚΄νŽ΄ λ³Όκ²Œμš”! :)

μ†”λ£¨μ…˜μ΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€! κ°μ‚¬ν•©λ‹ˆλ‹€. 쒋은 ν•˜λ£¨ λ˜μ„Έμš”

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰