React Native & Javascript - && 문법

리액트에서는 컴포넌트 부분(return 부분)에서 조건문을 사용해야 할 때 주로

 

삼항 연산자 - 조건 ? A : B

논리 연산자(AND) - A && B

논리 연산자(OR) - A || B

 

문법을 많이 사용한다.

 

평소와 같이 특정 조건일 때만 어떤 컴포넌트를 렌더링하고 싶어서 다음과 같은 코드를 작성했다.

 

<Pressable onPress={}>
	<Icon />
	<Text>테스트 중</Text>
	{count && (
    	<Text>{count}</Text>
    )}
</Pressable>

 

그런데 아무 이상이 없다가 갑자기 어느 순간

 

Text Strings must be rendered within a <Text> component

 

이 에러가 발생했다. string은 Text 컴포넌트 안에만 쓰라는 에러인데 난 도저히 Text 컴포넌트가 아닌 곳에 string을 입력한 적이 없었다.

 

예전에 실수로 닫는 꺾쇠(>) 옆에 세미콜론(;)을 붙여 에러가 발생한 적이 있었기 때문에 에러 로그에 나온 파일로 이동해서 눈을 크게 뜨고 찾아보았다.

 

그러나 역시나 이상이 없었다.

 

그러던 중 Pressable 쪽에 이상이 있다는 에러 문구를 읽고 혹시나 해서 count 부분을 수정하니 해결되었다.

 

에러가 발생한 이유는 다음과 같다.

 

count 변수는 number 타입이었는데 count 값으로 0이 아닌 다른 값이 들어갈 때는 내가 의도한 것처럼 count가 0이 아닐 때는 숫자가 잘 출력되었다.

그러나 count가 0이 되었을 때 "0" 만이 결과로 남게 되었고, 그 결과 에러 메시지가 말했 듯 Text컴포넌트가 아닌 곳에서 string을 렌더링하려는 꼴이 되어버린 것이다.

 

개발자 도구의 콘솔 창을 이용해 다음과 같은 코드를 찍어 보았다.

 

const a = 0;
const b = 1;

a && console.log('aaa');
// output: 0

b && console.log('bbb');
//output: bbb
//        undefined


const c = false;
const d = true;

c && console.log('ccc');
// output: false

d && console.log('ddd');
// output: ddd
//         undefined

 

논리 연산자 AND에서 앞에 falsy 값이 있으면 그 값만 출력하게 된다.

앞의 값이 falsy 하지 않으면 뒤의 부분만 실행된다.

 

조건문이 아닌데 조건문처럼 생각해버렸다.

 

 

react navigation - useIsFocused, useFousEffect

RN 개발 중 다음과 같은 상황이 있었다.

 

스크린 A

API로 가져온 데이터를 화면에 그리는 스크린

 

스크린 B

스크린 A에서 버튼을 클릭하면 이동하는 스크린

스크린 A에서 렌더링되는 데이터들 중 일부를 수정하는 스크린

수정을 완료하면 스크린 A로 이동한다.

 

굉장히 흔히 있는 상황이다.

 

문제는 스크린 B에서 데이터를 수정하고 스크린 A로 돌아갔을 때 스크린 A의 데이터를 새로고침해야 했다.

 

리덕스를 사용하기에는 딱 이 부분에서만 사용되는 데이터들이라 굳이 전역 상태를 사용할 필요가 있나 싶었다.

 

그러던 중 react navigation의 useIsFocused와 useFocusEffect라는 hooks을 찾게 되었다.

 

결론적으로는 스크린 A에서 useIsFocused 훅스를 사용해 스크린이 포커싱될 때 데이터를 새로 요청하도록 했다. (데이터가 매우 적음.)

 

처음에는 addListener로 focus 이벤트마다 요청을 보내는 방식을 찾았는데 react navigation 측에서는 가능하면 hooks를 사용하는 쪽이 좋다고 추천했다.

 

useFocusEffect는 사용하지는 않았지만 두 hooks 모두 유용한 것 같다.

'Computer Science > 1일 기록' 카테고리의 다른 글

2022.04.08 (금)  (0) 2022.04.09

React Native  npx react-native init

신규 RN 프로젝트를 생성하는데 타입스크립트 템플릿을 적용함과 동시에 아직 RN 0.68 버전은 불안해서 0.66 버전으로 생성하려고 했다.

 

npx react-native init --version 0.66.4 --template react-native-template-typescript

 

그래서 위와 같이 코드를 입력했는데 0.68 버전으로 생성됐다.

 

찾아보니 typescript 템플릿을 적용할때는 템플릿에 버전을 지정해 RN 버전을 설정해야 한다고 한다.

 

 

npx react-native init --version 0.66.4 --template react-native-template-typescript@6.8.6

 

으로 프로젝트를 생성하니 typescript가 적용된 RN 0.66.4 버전 프로젝트가 잘 생성되었다.

 


​Git

새로운 프로젝트를 위해 새 레포지토리를 생성했다.

 

로컬에서 레포지토리에 코드를 push하고 깃헙에서 Read.me 파일을 생성하니 다시 로컬에서 push를 하기 전에 pull을 해야 했다.

 

그런데

 

힌트: You have divergent branches and need to specify how to reconcile them.
힌트: You can do so by running one of the following commands sometime before
힌트: your next pull:
힌트:
힌트:   git config pull.rebase false  # merge
힌트:   git config pull.rebase true   # rebase
힌트:   git config pull.ff only       # fast-forward only
힌트:
힌트: You can replace "git config" with "git config --global" to set a default
힌트: preference for all repositories. You can also pass --rebase, --no-rebase,
힌트: or --ff-only on the command line to override the configured default per
힌트: invocation.
fatal: Need to specify how to reconcile divergent branches.

 

이러한 에러가 발생하며 pull 이 안 됐다.

 

찾아보니 git pull 전략을 설정해야 한다고 한다.

 

그래서 위 메시지에서 제시된 방법 중 세번째인 fast forward (ff) 방식을 설정했다.

 

git config pull.ff only

 

(참고로 only 키워드는 해당 레포지토리에만 적용하는 것이고 --global을 넣으면 전역적으로 설정할 수 있다.)

 

그런데

 

fatal: 정방향이 불가능하므로, 중지합니다.

 

이런 에러가 발생했다.

 

fast foraward가 안 되는 것이었다.

 

그래서 

 

git pull --rebase

 

로 rebase를 진행하고

 

git config --unset pull.ff

git config pull.rebase true

 

 

로 fast forward 설정한 것을 해제한 후 rebase를 디폴트로 설정했다.

 

merge는 merge할 때마다 추가 커밋이 생겨서 불-편해 rebase로 설정했다.

 


React Native - React Navigation

1.  SafeAreaView

React Navigation을 사용하는 RN 프로젝트를 생성하고 route 세팅을 하고 있었다.

 

그런데 IOS에서 SafeArea가 잘 적용되지 않았다.

 

찾아보니 React Navigation를 사용할 때는 React Native에서 기본 제공하는 SafeAreaView가 아닌 react-native-safe-area-context의 SafeAreaProvider와 SafeAreaView를 사용해야 한다고 한다.

 

이전에는 이러한 문제를 경험해본 적이 없는데 왜 이번에만 이런지 잘 모르겠다.

 

적용 방법은 다음과 같다.

 

import React from 'react';
import { Provider } from 'react-redux';
import store from './src/store';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import { NavigationContainer } from '@react-navigation/native';
import { navigationRef } from './src/utils/RootNavigation';
import AppMain from './src/navigations/AppMain';

const App = () => {
  return (
    <Provider store={store}>
      <SafeAreaProvider>
        <NavigationContainer ref={navigationRef}>
          <AppMain />
        </NavigationContainer>
      </SafeAreaProvider>
    </Provider>
  );
};

export default App;

 

다른 부분은 무시하고 SafeAreaProvider만 확인하면 된다. NavigationContainer보다 상위에서 감싸주기만 하면 된다.

 

이렇게 감싸주고 일반적으로 SafeAreaView를 사용하듯 하위 컴포넌트에서 사용하면 된다. (react-native-safe-area-context의 것을 사용해야 한다.)

 

참고: https://reactnavigation.org/docs/handling-safe-area/

 

https://reactnavigation.org/docs/handling-safe-area/

 

reactnavigation.org

'Computer Science > 1일 기록' 카테고리의 다른 글

2022.04.19 (화)  (0) 2022.04.20

+ Recent posts