Phoenix とExpoで作るスマホアプリ ⑤ expo セットアップ編

[Phoenix とExpoで作るスマホアプリ ①Phoenix セットアップ編 + phx_gen_auth](https://qiita.com/the_haigo/items/76dedef74ffe98230137)
[Phoenix とExpoで作るスマホアプリ ②JWT認証+CRUD編](https://qiita.com/the_haigo/items/e01e671ca117ed2b8648)
[Phoenix とExpoで作るスマホアプリ ③ファイルアップロード編](https://qiita.com/the_haigo/items/f9373d6021bb34c45676)
[Phoenix とExpoで作るスマホアプリ ④多対多のリレーション編]
(https://qiita.com/the_haigo/items/f3ecb242a8fbb9936c4b/) 
[Phoenix とExpoで作るスマホアプリ ⑤ expo セットアップ編](https://qiita.com/the_haigo/items/ef9181ebeb2406ec8903/) <- 本記事

[前回](https://qiita.com/the_haigo/items/f3ecb242a8fbb9936c4b/)は多対多のリレーションを実装しました

今回はexpoのセットアップとベースとなるスクリーン・タブを実装していこうと思います
# Install
以下のコマンドで一発です簡単ですね

```
npm install --global expo-cli
```
# プロジェクト作成
ではプロジェクトを作成していきましょう
以下のコマンドで生成ウィザードが出てきます

```
expo init sns
```
使用するテンプレートを聞かれるので今回はmanaged workflowのblankを選択
typescriptだったりtabsをどう実装しているのかを見たい場合は下の項目を選択してください

更に下にbare workflowもありますが、こちらはexpoではなく素のreact nativeでexpoのツールキットを使用するものなので今回は使用しません

```
- Managed workflow -----
❯ blank                 a minimal app as clean as an empty canvas 
  blank (TypeScript)    same as blank but with TypeScript configuration 
  tabs (TypeScript)     several example screens and tabs using react-navigation

```

# フォルダ構成
フォルダ構成は以下のようにしていきます
atomic designを使用して開発していく場合はcomponentsやscreenの下で
atom,molecules等更にフォルダを作成していきましょう

```
- api サーバーとの通信や外部APIを叩く処理
- assets 画像関連
- components 共通コンポーネント
- context useContext関連
- hooks customHooks関連
- navigation react-navigation関連
- screens 各ページとページ毎のcomponent
  |- Home
   |- atom
   |- molecules
   |- organisms
- App.js main 
```

# 使用するライブラリ
本記事で追加するライブラリになります
他の記事で別のライブラリも追加される可能性があります

- ナビゲーション  
react-navigation   
デファクト
- UIライブラリ  
react-native-elements  
native-baseもありますが、カスタムしやすいのとドキュメントもスッキリしてて読みやすいのでこちらを使用します
- ユーティリティ  
axios  
非同期通信  
form-data  
ファイルとかを送信するのに使用します


```
expo install @react-navigation/native @react-navigation/bottom-tabs
expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view
expo install react-native-elements react-native-vector-icons
expo install axios form-data
```


# Tabの実装
認証機能に取り掛かる前にベースとなるスクリーンとタブを実装していきましょう

```jsx
//[new] screens/HomeScreen.js
import React from "react";
import { View, Text, StyleSheet } from "react-native";

const HomeScreen = () => {
  return (
    <View style={styles.container}>
      <Text>HomeScreen</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    justifyContent: "center",
    alignSelf: "center",
    flex: 1,
  },
});
export default HomeScreen;

```

HomeのところをAccountに変えてAccountScreen.jsも作成しましょう

ベースとなるスクリーンを作成しましたので次にTabを実装します
NavigationContainerを作成してその下にTabやStackのNavigationを配置していきます

```jsx
// [new] navigation/AppNavigator.js
import React from "react";
import { NavigationContainer } from "@react-navigation/native";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import HomeScreen from "../screens/HomeScreen";
import AccountScreen from "../screens/AccountScreen";

const AppNavigator = () => {
  const Tab = createBottomTabNavigator();

  return (
    <NavigationContainer>
      <Tab.Navigator>
        <Tab.Screen name="Home" component={HomeScreen} />
        <Tab.Screen name="Account" component={AccountScreen} />
      </Tab.Navigator>
    </NavigationContainer>
  );
};

export default AppNavigator;
```

これでタブができたので実際に表示しましょう
App.jsで作成したAppNavigatorを表示します
背景が白なのでStatusBarが見えなくなるのでstyleをdarkにします

```jsx
// [edit] App.js
import { StatusBar } from "expo-status-bar";
import React from "react";
import AppNavigator from "./navigation/AppNavigator";

export default function App() {
  return (
    <>
      <StatusBar style="dark" />
      <AppNavigator />
    </>
  );
}
```

これでタブが実装完了しました
動作確認をしてみましょう

# 動作確認
expo start でサーバーを起動させて
iosかandroidお好きな方で確認してみましょう

[![Image from Gyazo](https://i.gyazo.com/9098946d42b76ec560f06783da21542b.gif)](https://gyazo.com/9098946d42b76ec560f06783da21542b)

無事ベースとなるスクリーンとタブが実装されているのが確認できました
今回はここまでになります
次回は認証機能を実装していきます

今回の差分
https://github.com/thehaigo/sns-expo/commit/11eacba9edea7d8eead81e534bf56b417cbf2036

# 参考サイト
https://reactnavigation.org/docs/getting-started
https://reactnativeelements.com/docs/
https://github.com/axios/axios
https://github.com/form-data/form-data#readme
https://docs.expo.io/