Skip to content

Latest commit

Β 

History

History
84 lines (55 loc) Β· 4.9 KB

README.md

File metadata and controls

84 lines (55 loc) Β· 4.9 KB

FlatList μ΅œμ ν™”

κ°œμš”

FlatListμ—μ„œ λ§Žμ€ μ–‘μ˜ 데이터λ₯Ό 뢈러올 λ•Œ, μ–΄λ–»κ²Œ μ΅œμ ν™”λ₯Ό μ „ν–‰ν•˜λŠ”μ§€ μ•Œμ•„λ³΄κ³ μž ν•©λ‹ˆλ‹€.

μ΅œμ ν™” 방법 1. memo, useCallback의 μ‚¬μš©

  • react-native ν”„λ‘œμ νŠΈμ—μ„œ FlatList 뢀뢄을 μ‚΄νŽ΄λ³΄λ©΄ 순수 μ»΄ν¬λ„ŒνŠΈλ‘œ λ˜μ–΄ μžˆλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • λ”°λΌμ„œ FlatListλ₯Ό κ°μ‹Έκ³ μžˆλŠ” λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ λ‚΄λ €μ£ΌλŠ” propsλ“€ 쀑 λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μ •μ˜ν•˜λŠ” μ½œλ°±ν•¨μˆ˜λ“€μ„ 읡λͺ…ν•¨μˆ˜κ°€ μ•„λ‹Œ useCallback으둜 감싸주면, λΆ€λͺ¨ μ»΄ν¬λ„ŒνŠΈμ˜ λ Œλ”λ§μœΌλ‘œ μΈν•œ FlatList의 λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ 쀄일 수 μžˆμ–΄ μ΅œμ ν™”μ— 도움이 λ©λ‹ˆλ‹€.
  • λ˜ν•œ FlatList의 μ•„μ΄ν…œμ΄ λ˜λŠ” μ»΄ν¬λ„ŒνŠΈμ— memoλ₯Ό μ μš©ν•˜μ—¬ 순수 μ»΄ν¬λ„ŒνŠΈλ‘œ λ§Œλ“€μ–΄μ£Όμ–΄, λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.
memo μ‚¬μš© μ˜ˆμ‹œ
  • memoλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό λ¦¬ν„΄ν•˜λŠ” κ³ μ°¨ μ»΄ν¬λ„ŒνŠΈ(HOC)μž…λ‹ˆλ‹€. 인자둜 λ“€μ–΄μ˜¨ μ»΄ν¬λ„ŒνŠΈλ₯Ό 순수 μ»΄ν¬λ„ŒνŠΈλ‘œ λ§Œλ“€μ–΄ μ€λ‹ˆλ‹€. 순수 μ»΄ν¬λ„ŒνŠΈλŠ” propsκ°€ λ³€ν•˜κ±°λ‚˜ λ‚΄λΆ€ stateκ°€ λ³€ν•  λ•Œλ§Œ λ¦¬λ Œλ”λ§λ©λ‹ˆλ‹€.
const PhotoView = memo(({photo, onPress, selected}: PhotoViewProps) => {
 //
}
useCallBack μ‚¬μš© μ˜ˆμ‹œ
  • PhotoView의 props인 onPress에 μ „ν•΄μ§€λŠ” onPressPhoto μ½œλ°±ν•¨μˆ˜ μ—­μ‹œ useCallback으둜 κ°μ‹Έμ£Όμ–΄μ„œ,PhotoView의 λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ λ§‰μ•„μ€λ‹ˆλ‹€.
const onPressPhoto = useCallback((photo: Photo) => {
  setPhotoIds(([...draft]) => {
    const idx = draft.indexOf(photo.id);

    if (idx > -1) {
      draft.splice(idx, 1);
    } else {
      draft.push(photo.id);
    }

    return draft;
  });
}, []);

const renderItem: ListRenderItem<Photo> = useCallback(
  ({item}) => (
    <PhotoView
      selected={photoIds.indexOf(item.id) > -1}
      photo={item}
      onPress={onPressPhoto}
    />
  ),
  [photoIds, onPressPhoto],
);

μ΅œμ ν™” 방법 2. FlatListμ—μ„œ μ œκ³΅ν•˜λŠ” props μ‚¬μš©

2-1. removeClippedSubviews

  • SubView(μžμ‹)κ°€ SuperView(λΆ€λͺ¨)의 μ˜μ—­κ³Ό κ²ΉμΉ˜λŠ” μ˜μ—­μ΄ μ—†λ‹€λ©΄ λ„€μ΄ν‹°λΈŒ 계측 λ“œλ‘œμ–΄μ—μ„œ ν•΄λ‹Ή SubViewλ₯Ό 제거(detach)ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 제거된 SubView의 λ©”λͺ¨λ¦¬κ°€ deallocated λ˜μ§„ μ•ŠμŠ΅λ‹ˆλ‹€.

2-2. keyExtractor

  • μ»΄ν¬λ„ŒνŠΈ λ¦¬μŠ€νŠΈμ—μ„œ μ»΄ν¬λ„ŒνŠΈμ˜ μˆœμ„œκ°€ λ°”λ€Œκ±°λ‚˜ μ‚­μ œλ˜λŠ” λ“±μ˜ μž‘μ—…μ„ ν•  λ•Œ μ΅œμ ν™”λœ μž‘μ—…μ΄ 일어날 수 μžˆλ„λ‘ 각 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬λΆ„ν•΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€. λ˜ν•œ λ Œλ”λ§λœ μ•„μ΄ν…œμ˜ 높이λ₯Ό μ €μž₯ν•˜λŠ” ν‚€λ‘œλ„ μ‚¬μš©λ©λ‹ˆλ‹€.

2-3. getItemLayout

  • 리슀트의 높이와 λ„ˆλΉ„λ₯Ό 미리 ν™•μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. getItemLayout이 μ œκ³΅λ˜μ§€ μ•ŠμœΌλ©΄ 각 Cell μ»΄ν¬λ„ŒνŠΈμ— onLayout ν•¨μˆ˜κ°€ μ „λ‹¬λ©λ‹ˆλ‹€. onLayout ν•¨μˆ˜λŠ” λ Œλ”λ§ λ˜λŠ” Cell μ»΄ν¬λ„ŒνŠΈμ˜ 높이λ₯Ό μ €μž₯ν•˜κ³  리슀트 정보λ₯Ό κ°±μ‹ ν•˜λŠ” 무거운 λ‘œμ§μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 각 μ•„μ΄ν…œμ΄ λ Œλ”λ§ 될 λ•Œ λ ˆμ΄μ•„μ›ƒ 계산 과정이 쀄어듀어 μ΅œμ ν™”μ— 도움이 λ©λ‹ˆλ‹€.

2-4 windowSize

  • ν˜„μž¬ viewport 높이λ₯Ό 1둜 작고 μ•„μ΄ν…œμ„ λ Œλ”λ§ν•  λ²”μœ„λ₯Ό κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή λ²”μœ„ 내에 μžˆλŠ” μ»΄ν¬λ„ŒνŠΈλ“€μ€ λ Œλ”λ§μ„ μ‹œλ„ν•˜κ²Œ λ©λ‹ˆλ‹€. 이 숫자λ₯Ό μ€„μž„μœΌλ‘œμ¨ ν•œλ²ˆμ— λ Œλ”λ§λ˜λŠ” μ»΄ν¬λ„ŒνŠΈμ˜ 숫자λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

2-5 maxToRenderPerBatch

  • FlatList λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜κ³  μžˆλŠ” VirtualizedList의 propsμž…λ‹ˆλ‹€. batch λ‹Ή λ Œλ”λ§λ  μ•„μ΄ν…œμ˜ 수λ₯Ό μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2-6 initialNumToRender

  • 처음 λ Œλ”λ§ν•  FlatList μ•„μ΄ν…œμ˜ 개수λ₯Ό μ‘°μ ˆν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ””λ°”μ΄μŠ€ 크기가 μ‘°κΈˆμ”© λ‹€λ₯΄λ―€λ‘œ, ν•œ 화면에 λ“€μ–΄κ°ˆ 수 μžˆλŠ” μ•„μ΄ν…œμ˜ μˆ˜λ„ λ‹¬λΌμ§ˆ 수 있기 λ•Œλ¬Έμ— μ μ ˆν•œ 개수λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μ΅œμ ν™” 방법 3. react-native-fast-image의 μ‚¬μš©

  • FlatListμ—μ„œ Render windowλ₯Ό λ²—μ–΄λ‚œ μ»΄ν¬λ„ŒνŠΈλŠ” μ–Έλ§ˆμš΄νŠΈλ©λ‹ˆλ‹€. μ–Έλ§ˆμš΄νŠΈλœ μ»΄ν¬λ„ŒνŠΈλŠ” λ‹€μ‹œ Render window에 듀어왔을 λ•Œ λ§ˆμš΄νŠΈλ©λ‹ˆλ‹€. FlatList의 μžμ‹ μ»΄ν¬λ„ŒνŠΈκ°€ λ§Œμ•½ 이미지λ₯Ό ν¬ν•¨ν•œλ‹€λ©΄ 맀번 μƒˆλ‘œμš΄ λ„€νŠΈμ›Œν¬ μš”μ²­μ„ ν•˜κ²Œλ©λ‹ˆλ‹€. FastImageλ₯Ό μ μš©ν•˜λ©΄ μΊμ‹œλœ 이미지λ₯Ό μ‚¬μš©ν•˜μ—¬ λΆˆν•„μš”ν•œ λ„€νŠΈμ›Œν¬ μš”μ²­μ„ κ±΄λ„ˆλ›°κ³ , λΉ λ₯Έ 이미지 λ‘œλ”©μœΌλ‘œ JS Thread의 λΆ€ν•˜λ₯Ό κ°μ†Œμ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.