React-window: 무거운 ν–‰μ΄μžˆλŠ” FixedSizeListμ—μ„œ μŠ€ν¬λ‘€ν•˜λŠ” λ™μ•ˆ 곡백 (8 개의 Material UI μΉ΄λ“œκ°€ 연속)

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

μ•ˆλ…•ν•˜μ„Έμš”,

이 λ†€λΌμš΄ λ„μ„œκ΄€μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€.

FixedSizeListλ₯Ό μ‚¬μš©ν•˜λŠ” λ™μ•ˆ Row ꡬ성 μš”μ†Œκ°€ 무거울 λ•Œ λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€. νŠΈλž™ νŒ¨λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 맀우 λΉ λ₯΄κ²Œ 슀크둀 ν•  λ•Œ 곡백이 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

이 문제λ₯Ό μ„€λͺ…ν•˜κΈ° μœ„ν•΄ 데λͺ¨λ₯Ό λ„£μ—ˆμŠ΅λ‹ˆλ‹€ (μ‹€μ œ μΉ΄λ“œλŠ” 데λͺ¨μ— μ‚¬μš© 된 μΉ΄λ“œλ³΄λ‹€ 훨씬 λ¬΄κ²μŠ΅λ‹ˆλ‹€)-https: //codesandbox.io/s/n746q40970 / https://n746q40970.codesandbox.io/

단일 ν–‰μ—μ„œ 8 개의 머티리얼 UI μΉ΄λ“œλ₯Ό λ Œλ”λ§ν•˜κ³  μŠ€ν¬λ‘€ν•˜λŠ” λ™μ•ˆ 곡백을 λ³Ό 수 μžˆμ§€λ§Œ μΉ΄λ“œλ₯Ό 1 개 λ˜λŠ” 2 개 μ‚¬μš©ν•˜λ©΄ μ΄λŸ¬ν•œ 곡백이 ν‘œμ‹œλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이 μ‹œλ‚˜λ¦¬μ˜€λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 μ•Œμ•„λ‚Ό 수 μžˆμŠ΅λ‹ˆκΉŒ?

감사
Ashish

πŸ’¬ question

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

슀크둀이 처음 μ‹œμž‘λ  λ•Œ μ΄λŸ¬ν•œ μœ ν˜•μ˜ 곡백은 μ•ˆνƒ€κΉκ²Œλ„μ΄ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ‚¬μš©ν•˜λŠ” μ°½ κΈ°μˆ μ„ μ‚¬μš©ν•˜λŠ” 데 ν•„μš”ν•œ μ ˆμΆ©μ•ˆμž…λ‹ˆλ‹€. 슀크둀 ν•Έλ“€λŸ¬λ₯Ό κ°•μ œλ‘œ λ™κΈ°ν™”ν•˜μ§€ μ•ŠλŠ” ν•œ (슀크둀링이 느리고 μ‚¬μš©μžμ—κ²Œ 버벅 거림을 느끼게 ν•  κ²ƒμž…λ‹ˆλ‹€), μš°λ¦¬λŠ” 이것을 μ™„μ „νžˆ ν”Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μˆ˜ν–‰ ν•  μˆ˜μžˆλŠ” μž‘μ—… :

  • ν–‰ λ Œλ”λŸ¬λ₯Ό κ°€λŠ₯ν•œ ν•œ 빨리 λ§Œλ“œμ‹­μ‹œμ˜€. μ–΄λ–€ κ²½μš°μ—λŠ” 슀크둀이 ν™œμ„±ν™”λ˜μ–΄μžˆλŠ” λ™μ•ˆ 더 κ°€λ²Όμš΄ ν‘œν˜„ μ‚¬μš©μ„ κ³ λ €ν•  수 μžˆμŠ΅λ‹ˆλ‹€ ( μ—¬κΈ° μ°Έμ‘°).
  • 이와 같은 λ©”λͺ¨ 기법을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 데λͺ¨λŠ” μ—¬κΈ° λ₯Ό μ°Έμ‘°
  • λ‹€λ₯Έ overscanRowCount κ°’μœΌλ‘œ μ‹€ν—˜ ν•΄λ³΄μ„Έμš”. (λ‹Ήμ‹ μ˜ 경우 2κ°€ 1에 더 잘 μž‘λ™ν• κΉŒμš”?)
  • ν”„λ‘œνŒŒμΌ 러λ₯Ό μ‚¬μš©ν•˜μ—¬ λ Œλ”λ§ μ„±λŠ₯을 ν™•μΈν•©λ‹ˆλ‹€.
  • ν”„λ‘œλ•μ…˜ λͺ¨λ“œμ—μ„œ μ„±λŠ₯을 ν™•μΈν•˜μ‹­μ‹œμ˜€. (μ½”λ“œ μƒŒλ“œ λ°•μŠ€ 데λͺ¨λŠ” 훨씬 느린 DEV λͺ¨λ“œμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.)

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

슀크둀이 처음 μ‹œμž‘λ  λ•Œ μ΄λŸ¬ν•œ μœ ν˜•μ˜ 곡백은 μ•ˆνƒ€κΉκ²Œλ„μ΄ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ‚¬μš©ν•˜λŠ” μ°½ κΈ°μˆ μ„ μ‚¬μš©ν•˜λŠ” 데 ν•„μš”ν•œ μ ˆμΆ©μ•ˆμž…λ‹ˆλ‹€. 슀크둀 ν•Έλ“€λŸ¬λ₯Ό κ°•μ œλ‘œ λ™κΈ°ν™”ν•˜μ§€ μ•ŠλŠ” ν•œ (슀크둀링이 느리고 μ‚¬μš©μžμ—κ²Œ 버벅 거림을 느끼게 ν•  κ²ƒμž…λ‹ˆλ‹€), μš°λ¦¬λŠ” 이것을 μ™„μ „νžˆ ν”Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μˆ˜ν–‰ ν•  μˆ˜μžˆλŠ” μž‘μ—… :

  • ν–‰ λ Œλ”λŸ¬λ₯Ό κ°€λŠ₯ν•œ ν•œ 빨리 λ§Œλ“œμ‹­μ‹œμ˜€. μ–΄λ–€ κ²½μš°μ—λŠ” 슀크둀이 ν™œμ„±ν™”λ˜μ–΄μžˆλŠ” λ™μ•ˆ 더 κ°€λ²Όμš΄ ν‘œν˜„ μ‚¬μš©μ„ κ³ λ €ν•  수 μžˆμŠ΅λ‹ˆλ‹€ ( μ—¬κΈ° μ°Έμ‘°).
  • 이와 같은 λ©”λͺ¨ 기법을 μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 데λͺ¨λŠ” μ—¬κΈ° λ₯Ό μ°Έμ‘°
  • λ‹€λ₯Έ overscanRowCount κ°’μœΌλ‘œ μ‹€ν—˜ ν•΄λ³΄μ„Έμš”. (λ‹Ήμ‹ μ˜ 경우 2κ°€ 1에 더 잘 μž‘λ™ν• κΉŒμš”?)
  • ν”„λ‘œνŒŒμΌ 러λ₯Ό μ‚¬μš©ν•˜μ—¬ λ Œλ”λ§ μ„±λŠ₯을 ν™•μΈν•©λ‹ˆλ‹€.
  • ν”„λ‘œλ•μ…˜ λͺ¨λ“œμ—μ„œ μ„±λŠ₯을 ν™•μΈν•˜μ‹­μ‹œμ˜€. (μ½”λ“œ μƒŒλ“œ λ°•μŠ€ 데λͺ¨λŠ” 훨씬 느린 DEV λͺ¨λ“œμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.)

@bvaughn - @ ashishgupta1989 λ‚΄κ°€ 크둬 ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ "μŠ€ν¬λ‘€μ„ λΆ€λ“œλŸ½κ²Œ"발견과 λ‚˜λŠ” μž‘μ—…μ€ μ„±λŠ₯이 μ•„μ£Ό μ’‹μŠ΅λ‹ˆλ‹€. 슀크둀 ν•Έλ“€λŸ¬λ₯Ό λ™κΈ°μ‹μœΌλ‘œ λ§Œλ“œλŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? _this._onScrollVertical ()의 setStateλ₯Ό requestAnimationFrame ()으둜 λž˜ν•‘ν•˜λ €κ³  μ‹œλ„ν–ˆμ§€λ§Œ ν”Œλž˜κ·Έ λ³€κ²½κ³Ό λ™μΌν•œ 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ™μΌν•œ λ™μž‘μ„ μ–»κΈ° μœ„ν•΄ ꡬ성 μš”μ†Œμ— scrollSync ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•  수 있기λ₯Ό

κ·Έλž˜μ„œ 이것은 μž‘λ™ν•©λ‹ˆλ‹€.

return createElement(outerElementType || outerTagName || 'div', {
    ...
    onWheel: function (e) {
        e.preventDefault()
        e.currentTarget.scrollTop += e.deltaY
    },

이 μŠ€νƒ μ˜€λ²„ν”Œλ‘œ λ‹΅λ³€μ—μ„œ μ˜κ°μ„ μ–»μ—ˆμŠ΅λ‹ˆλ‹€ : https://stackoverflow.com/questions/12747746/how-to-disable-smooth-scrolling-in-chrome

이 μˆ˜μ • 사항을 μ—°κ²°ν•˜λŠ” μƒˆλ‘œμš΄ prop scrollSync 둜 ν’€ μš”μ²­μ„ μ œμΆœν•˜λ©΄ 수락 ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

κ³ λ €λ₯Ό μœ„ν•΄ ν’€ μš”μ²­μ„ μ œμΆœν•˜λŠ” 것은 μ–Έμ œλ‚˜ ν™˜μ˜ν•©λ‹ˆλ‹€. 슀크둀 이벀트 ν•Έλ“€λŸ¬λ₯Ό κ°•μ œλ‘œ μ°¨λ‹¨ν•˜λŠ” 것은 API에 λŒ€ν•œ 지원을 μΆ”κ°€ν•˜κ³  싢지 μ•Šμ§€λ§Œ PR을 읽고 κ³ λ €ν•  κ²ƒμž…λ‹ˆλ‹€.

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