김마드 2021. 6. 28. 11:52

🍔 핵심 내용

 

🥑 기본 RN을 셋업하자.

 

npm install --global expo-cli

expo init 프로젝트명 입력

expo install expo-font

expo install expo-app-loading

npm install @react-navigation/native
expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view
npm install @react-navigation/stack

npm install styled-components

설치 진행

 

 

🍔 코드 리뷰

 

🥑 App.js

import AppLoading from "expo-app-loading";
import React, { useState } from "react";
import { Ionicons } from "@expo/vector-icons";
import * as Font from "expo-font";
import { Asset } from "expo-asset";
import LoggedOutNav from "./navigators/LoggedOutNav";
import { NavigationContainer } from "@react-navigation/native";

export default function App() {
  const [loading, setLoading] = useState(true);
  const onFinish = () => setLoading(false);
  const preload = () => {
    const fontsToLoad = [Ionicons.font];
    const fontPromises = fontsToLoad.map((font) => Font.loadAsync(font));
    const imagesToLoad = [
      require("./assets/logo.png"),
      "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Instagram_logo.svg/840px-Instagram_logo.svg.png",
    ];
    const imagePromises = imagesToLoad.map((image) => Asset.loadAsync(image));
    return Promise.all([...fontPromises, ...imagePromises]);
  };
  if (loading) {
    return (
      <AppLoading
        startAsync={preload}
        onError={console.warn}
        onFinish={onFinish}
      />
    );
  }
  return (
    <NavigationContainer>
      <LoggedOutNav />
    </NavigationContainer>
  );
}

주요 개념

1.  App이 로딩 될때, preloading으로 받아올 데이터들을 미리 다 다운받아 놓는다. (폰트, 이미지, 등)

2. App 로딩이 끝나면 onFinish로 loading을 false로 바꿔주고 return 값을 보내준다.

3. return 값에는 네비게이터가 들어가는데, 이때 컨테이너는 반드시 감싸주어야 한다. (rule 임)

 

 

🥑 navigators/LoggedOutNav.js

import React from "react";
import { createStackNavigator } from "@react-navigation/stack";
import Welcome from "../screens/Welcome";
import LogIn from "../screens/LogIn";
import CreateAccount from "../screens/CreateAccount";

const Stack = createStackNavigator();

export default function LoggedOutNav() {
  return (
    <Stack.Navigator>
      <Stack.Screen name="Welcome" component={Welcome} />
      <Stack.Screen name="Login" component={LogIn} />
      <Stack.Screen name="CreateAccount" component={CreateAccount} />
    </Stack.Navigator>
  );
}

네비게이터 역할을 맡고 있는 파일이다. 해당 네비게이터에서 여러 스크린으로 화면이 뿌려진다. Stack 개념은 화면위에 화면이 쌓이는 개념.

 

🥑 screens/Welcome.js

import React from "react";
import { Text, View } from "react-native";

export default function Welcome() {
  return (
    <View>
      <Text>반갑습니다.</Text>
    </View>
  );
}

 

🥑 screens/LogIn.js

import React from "react";
import { Text, View } from "react-native";

export default function Login() {
  return (
    <View>
      <Text>Login</Text>
    </View>
  );
}

 

🥑 screens/CreateAccount.js

import React from "react";
import { Text, View } from "react-native";

export default function CreateAccount() {
  return (
    <View>
      <Text>CreateAccount</Text>
    </View>
  );
}