데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      [DEVOCEAN 스쿨] RN(React Native) 스터디 6주차

      Teus 23.06.13
      1,618 9 0

      안녕하세요 Teus입니다.


      올해부터 DEVOCEAN을 통해서 스터디를 진행하고 있습니다!

      제가 준비한 주제는 React를 활용해서 크로스플랫폼을 플랫폼 어플리캐이션을 만드는 React Native입니다!

      이번주는 6주차에 진행한 스터디 내용을 다루는 포스팅 입니다!

      0cbd9a2f86d449cc463116509a8bf621b9084ec7ef8e846264337fd35bdcc355.png

      0. 스터디 운영

      이번주도 역시 아이스브레이킹 -> Figma 공유 -> 조별토의 -> 마무리 토의 순서로 진행되었습니다.

      지난주에 대비해서 바뀐거는 없네요 :)

      바뀐건 바로 아이스브레이킹!

      이번주는 PSJ님이 진행을 해 주셨고, 이번주는 라이어 게임임 이었습니다 :)

      IMG_2858.JPEG

      (라이어게임 규칙을 설명해주시는 PSJ님)


      IMG_2859.JPEG

      (명탐정 태웅님의 라이어 색출작업중....)


      그리고 이번주에는 FireBase를 활용한 사진앱 만들기 9장의 초반부를 읽고 토의를 진행 하였습니다.

      IMG_2860.JPEG

      (9장 초반주에 대한 내용을 Figma를 이용한 토의시간)


      자 그러면 이번주에 배운 내용을 리뷰해 보겠습니다.


      1. JSX의 동적 Property 할당

      일반적으로 HTML에서는 Tag의 Property를 할당할 때 key:value 형태로 keyword argument 방식으로 property 를 설정해 줍니다.

      React에서 사용하는 JSX의 경우, 외부에서 만든 변수를 동적으로 사용할 수가 있습니다.

      이때 JSX의 특이한 문법으로, {} 안에서 {}를 한번더 사용하여, 변수를 바로 keyword argument로 넣어줄 수가 있습니다.

      (...)
      function CameraButton() {
        const insets = useSafeAreaInsets();
      
        //여기서 선언된 bottom은 platform에 따라서 바뀔 뿐
        //해당 변수가 어떤 keyword props인지 정의되지 않음
        const bottom = Platform.select({
          android: TABBAR_HEIGHT / 2,
          ios: TABBAR_HEIGHT / 2 + insets.bottom - 4,
        });
      
        return (
          //JSX내부에서 {}을 한번 사용하면 javascript의 변수를 가지고 오지만
          //여기서 {}를 한번더 사용하여, bottom = {bottom}의 결과를 만들어냄
          <View style={[styles.wrapper, {bottom}]}>
            <Pressable
              android_ripple={{
                color: '#ffffff',
              }}
              style={styles.circle}>
              <Icon name="camera-alt" color="white" size={24} />
            </Pressable>
          </View>
        );
      }
      (...)


      2. Component간 렌더링 우선순위

      Component가 존재할 때, 두개이상의 Component가 같은 위치에 있으면 하나의 Component가 다른 Component를 가리게 됩니다.

      이때 사용자가 원하는 순서를 설정할 수 있어야 하며, 이때 react native같은 경우 style에서 zIndex라는 것을 통해 결정하게 됩니다.

      zIndex는 단순하게 생가해서 3차원 좌표계의 z축이랑 비슷합니다.

      zIndex가 낮으면 바닥에 깔리고, zIndex가 높으면 가장 위에 존재하여 시각적으로 보이게 됩니다.

      (...)
      function MainTab() {
        return (
          <>
            <View style={styles.block}>
              <Tab.Navigator
                screenOptions={{
                  headerShown: false,
                  tabBarShowLabel: false,
                  tabBarActiveTintColor: '#6200ee',
                }}>
              (...)
              
      const styles = StyleSheet.create({
        block: {
          flex: 1,
          zIndex: 0,
        },
      });
      (...)


      3. React Native의 Modal

      갑자기 헛소리 한번 하고가면

      라떼는 말이다... 으이! Modal 구현할라면 CSS로 다 만들고 그래쒀 마!

      image.png

      (출처 :링크)


      하지만 요즘은 아니죠?

      React Native에서는 Modal이라는 Component를 지원합니다.

      그래서 이 Modal Component에 Props를 변경하는것 만크로 편하게 Modal을 사용할 수 있습니다

      //custom Modal Component를 정의함
      function UploadModeModal({visible, onClose}) {
        return (    
          //React Native에서 지원하는 Modal Component 사용
          <Modal
            //visible prop을 통해서 Modal popup/exit 여부 사용
            visible={visible}
            transparent={true}
            animationType="fade"
            onRequestClose={onClose}>
            //Modal 내부에서 보여질 내용을 정의
            <Pressable style={styles.background} onPress={onClose}>
              <View style={styles.whiteBox}>
                <Pressable
                  (첫번째 선택지...)
                </Pressable>
                <Pressable
                  (두번째 선택지...)
                </Pressable>
              </View>
            </Pressable>
          </Modal>
        );
      }

      visible이 useState로 만들어진 prop이면, visible 값이 변할때 마다 Modal이 사라졌다, 생겼다 하는것을 예상해 볼 수 있습니다 :)


      4. React Native의 ActionSheetIOS

      하지만 Modal을 사용하는 스타일은 주로 Android에서 아용하며, IOS에서는 Modal보다는 ActionSheet를 사용하게 됩니다.

      (물론 IOS에서도 Modal을 사용해도 문제는 없습니다)

      image.png

      IOS의 Action Sheet


      ActionSheetIOS 역시 React Native에서 built-in으로 지원하는 Component이며, 사용방법은 간단한편 입니다.

      const onPress = () => {
          //Modal을 키는 버튼을 눌렀을때, android의 경우 Modal만 보여지게
          //visible props를 변경하고 함수를 종료
          if (Platform.OS === 'android') {
            setModalVisible(true);
            return;
          }
          
          //IOS의 ActionSheet를 활성화 하는 부분
          ActionSheetIOS.showActionSheetWithOptions(
            {
              options: ['카메라로 촬영하기', '사진 선택하기', '취소'],
              cancelButtonIndex: 2,
            },
            //버튼을 위부터 순서대로 btnindex를 증가시키고, 이에따른 callback을 정의
            (buttonIndex) => {
              if (buttonIndex === 0) {
                console.log('카메라 촬영');
              } else if (buttonIndex === 1) {
                console.log('사진 선택');
              }
            },
          );
      };


      5. React Native의 Keyboard

      Mobile 환경 특성상 키보드가 물리키가 아닌 소프트웨어 키보드를 사용합니다.

      때문에 소프트웨어 키보드가 popup 되었을 경우 화면의 구성이 바뀔 필요성이 존재합니다.

      이때 React Native에서는 Keyboard라는 Event 객체를 통해서 eventlistener 와 비슷한 방식으로 활용할 수가 있습니다.

        const animation = useRef(new Animated.Value(width)).current;
        const [isKeyboardOpen, setIsKeyboardOpen] = useState(false);
      
        /*
          등록 가능한 event name
          keyboardWillShow
          keyboardDidShow
          keyboardWillHide
          keyboardDidHide
          keyboardWillChangeFrame
          keyboardDidChangeFrame
        */
        useEffect(() => {
          //keyboard가 등장하면 isKeyboardOpen props을 변경함
          const didShow = Keyboard.addListener('keyboardDidShow', () =>
            setIsKeyboardOpen(true),
          );
          const didHide = Keyboard.addListener('keyboardDidHide', () =>
            setIsKeyboardOpen(false),
          );
      
          return () => {
            //component가 사라지면 위 keyboard event들을 제거함
            didShow.remove();
            didHide.remove();
          };
        }, []);
        
        //useRef의 value를 사용한 키보드 표시에 따른 animation 구현
        useEffect(() => {
          Animated.timing(animation, {
            toValue: isKeyboardOpen ? 0 : width,
            useNativeDriver: false,
            duration: 150,
            delay: 100,
          }).start();
        }, [isKeyboardOpen, width, animation]);
        
      return (
          <View style={styles.block}>
            <Animated.Image
              source={{uri: res.assets[0]?.uri}}
              //animation 값을 사용해서 height를 조정시킴
              style={[styles.image, {height: animation}]}
              resizeMode="cover"
            />
            (...)


      6. 6주차를 마치며...

      벌써 스터디의 중간이 지나고 있습니다.

      이번주 역시 조별 토의 이후에, 각 조별로 진행사항을 공유 하였습니다.


      1조 : 이제 토의 다 했구, 이번주부터 슬슬 코드 짜볼거에요!

      IMG_2868.JPEG

      (디자이너 태웅님 ,핸드메이드 와이어프레임 만드는중...)


      2조 : 코드는 짜고있는데, 이쁘게 만들기 너무 어렵다....

      IMG_2865.JPEG

      (2조는 식단화면 다 짜고, 이제 운동 관리할 내용 짜는중...)


      3조 : 진짜 크게한번 놀아볼라고 디자이너, 백앤드 개발자 산채로 잡아옴..

      IMG_2869.JPEG

      (다같이 모여서 조별 진행사항 이야기 하는중)


      다음 주차까지 진행하면 React Native 자체를 활용하는 내용은 끝이 납니다.

      이후에는 React Native를 좀더 효율적으로 활용하기 위한 라이브러리 활용 부분의 내용이 이어집니다.

      다음 포스팅으로 또 찾아뵙겠습니다!


      모두 즐거운 하루 되시기 바랍니다!

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      Teus 님의 최신 블로그

      더보기
      동영상 기고하기