๊ฐœ๋ฐœ ๊ณต๋ถ€/๋ฐ๋ธŒ์ฝ”์Šค TIL

[ํด๋ผ์šฐ๋”ฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”์ง€๋‹ˆ์–ด๋ง TIL] 240419 - React Native ์บ ํ•‘์•ฑ ๋งŒ๋“ค๊ธฐ ํ”„๋กœ์ ํŠธ (3)

๊ฐ€์šค์ด 2024. 4. 20. 08:43

Intro


3์ผ์ฐจ์—๋Š” Article ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. firebase๋ฅผ ์—ฐ๋™ํ•  ์˜ˆ์ •์ด๋ผ ํ”„๋กœ์ ํŠธ์—์„œ ์ œ๊ณต๋œ API๋Š” ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š์•˜๋‹ค.

 

โœ… Article UI ๊ตฌํ˜„

โžก๏ธ Home UI ๊ตฌํ˜„

โœ… ๋ฌดํ•œ ์Šคํฌ๋กค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

 

 

 

ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์ƒํ™ฉ


ImageBackground

์•„ํ‹ฐํด ํ—ค๋”๋กœ ์“ฐ์ด๋Š” ๊ฐ์ข… ์บ ํ•‘ ์ •๋ณด ๋ฐ•์Šค๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ

์ด๋ฏธ์ง€๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์–ด์„œ react-native์˜ ImageBackground ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค.

import { ImageBackground, ...
} from 'react-native';

<ImageBackground
          source={require('../../assets/articleLogoImg.png')}
          style={styles.articleLogo}
          imageStyle={styles.articleLogoImg}>
          <Text style={styles.articleLogoTitle}>๊ฐ์ข… ์บ ํ•‘ ์ •๋ณด</Text>
          <Text style={styles.articleLogoComment}>
            ์บ ํ•‘ํˆฌ๊ฒŒ๋”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ข… ๊ฟ€ํŒ์œผ๋กœ ์บ ํ•‘์„ ๋” ํ’์„ฑํ•˜๊ฒŒ ์ฆ๊ฒจ๋ณด์„ธ์š”.
          </Text>
        </ImageBackground>

 

 

 

์Šคํฌ๋กค ๋‚ด๋ฆด ๋•Œ ํ—ค๋” ์ˆจ๊ธฐ๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•˜๊ธฐ

 

ํ—ค๋”๊ฐ€ ์‚ฌ์ด์ฆˆ๊ฐ€ ์ปค์„œ ๊ฒŒ์‹œ๊ธ€์ด 1๊ฐœ ๋ฐ˜๋งŒ ๋ณด์ด๋Š” ์ƒํ™ฉ์ด๋‹ค. ์‚ฌ์šฉ์ž์˜ UI/UX๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์ข‹์ง€ ์•Š์•„ ๋ณด์˜€๋‹ค.

ํ—ค๋”์™€ ํ•จ๊ป˜ ์Šคํฌ๋กค์„ ๋‚ด๋ฆฌ๋ฉด sort by๊ฐ€ ๊ฐ€๋ ค์ง€๊ธฐ ๋•Œ๋ฌธ์— UX๊ฐ€ ๋น„ํšจ์œจ์ ์œผ๋กœ ๋ณด์˜€๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์Šคํฌ๋กค์„ ๋‚ด๋ ธ์„ ๋•Œ sort by๋Š” ์œ ์ง€ํ•˜๊ณ  ํ—ค๋”๋งŒ ์‚ฌ๋ผ์ง€๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด๋ณด๊ณ ์ž ํ–ˆ๋‹ค.

 

const [infoVisible, setInfoVisible] = useState(true);

const handleScroll = (event: NativeSyntheticEvent<NativeScrollEvent>) => {
  const currentOffset = event.nativeEvent.contentOffset.y;

  if (currentOffset > 1 && infoVisible) {
    setInfoVisible(false);
  } else if (currentOffset <= 1 && !infoVisible) {
    setInfoVisible(true);
  }
};

 

์Šคํฌ๋กค์ด ๋‚ด๋ ค๊ฐ”๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด contentOffset์ด๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ ธ์™”๋‹ค.

<FlatList
          data={sortedArticles}
          removeClippedSubviews
          showsVerticalScrollIndicator={false}
          renderItem={({ item }) => <ArticleList {...item} />}
          onScroll={handleScroll}
          scrollEventThrottle={20}
        />

 

FlatList์˜ onScroll ์†์„ฑ์„ ํ™œ์šฉํ•ด ์Šคํฌ๋กค์ด ๋‚ด๋ ค๊ฐˆ ๋•Œ handleScroll ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‚ฌ๋ผ์ง€๋ ค๋ฉด Animated ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์€๋ฐ ์ผ๋‹จ ์—ฌ๊ธฐ๊นŒ์ง€ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.

 

 

์ƒ์„ธํŽ˜์ด์ง€ ๊ตฌํ˜„ํ•˜๊ธฐ

 

์นด๋“œ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ ์ƒ์„ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ํ™”๋ฉด์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ๋Š” react-navigation์˜ route ์†์„ฑ์œผ๋กœ params๋ฅผ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค.

 

 

 

์ตœ์‹ ์ˆœ/์ฆ๊ฒจ์ฐพ๊ธฐ์ˆœ ๋ชจ๋‹ฌ์ฐฝ ๊ตฌํ˜„ํ•˜๊ธฐ

 

 

๋ชจ๋‹ฌ์ฐฝ ๊ตฌํ˜„์„ ์œ„ํ•ด react-native-modal ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

์ตœ์‹ ์ˆœ/์ฆ๊ฒจ์ฐพ๊ธฐ์ˆœ ์„ ํƒ ํ›„ Save ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ชจ๋‹ฌ์ด ๋‹ซํžˆ๋ฉด์„œ ๋งŒ์•ฝ์— ์ตœ์‹ ์ˆœ -> ์ฆ๊ฒจ์ฐพ๊ธฐ์ˆœ ๋˜๋Š”, ์ฆ๊ฒจ์ฐพ๊ธฐ์ˆœ -> ์ตœ์‹ ์ˆœ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค๋ฉด ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œ๋˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

 

 

 

์ถ”ํ›„ ์ง„ํ–‰์‚ฌํ•ญ


 

๋‹ค์Œ ์ž‘์—…ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค

  • Home UI ๊ตฌํ˜„
  • Community UI ๊ตฌํ˜„
  • ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ๊ตฌํ˜„