ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [RN] Navigation 사용하기
    Javascript/React-Native 2022. 7. 31. 13:18
    // install 할 내용들
    
    yarn add @react-navigation/native
    
    expo install react-native-screens react-native-safe-area-context react-native-gesture-handler
    
    yarn add @react-navigation/stack
    // App.js
    
    import React from 'react';
    
    // 1. NavigationContainer import 해주고
    import { NavigationContainer } from '@react-navigation/native';
    import { StatusBar } from 'expo-status-bar';
    
    // 2. Navigator로 화면 그려준 view를 import 한다
    import StackNavigator from './Navigations/StackNavigator'
    
    
    export default function App() {
    
      console.disableYellowBox = true;
    
      return (
      // 3. 일단 감싸주자
        <NavigationContainer>
          <StatusBar style="black" />
          // 4. Navigator 올려주자
          <StackNavigator />
        </NavigationContainer>);
    }
    // StackNavigator
    
    import React from 'react';
    
    // 1. Navigator import 한다
    import { createStackNavigator } from '@react-navigation/stack';
    
    // 2. Navigation 안에서 사용할 Views import 한다
    import DetailPage from '../Pages/DetailPage';
    import MainPage from '../Pages/MainPage';
    
    // 3. Navigator로 사용할 객체 선언한다
    const Stack = createStackNavigator();
    
    const StackNavigator = () => {
        return (
        
    	// 4. 객체 안에 .Navigator 라는 property 나옴
         <Stack.Navigator
    		     // 5. Header 에 대한 내용 정의 하면 된다
                screenOptions={{
                    headerStyle: {
                        backgroundColor: "white",
                        borderBottomColor: "white",
                        shadowColor: "white",
                        height: 100
                    },
                    //헤더의 텍스트를 왼쪾에 둘지 가운데에 둘지를 결정
                    headerTitleAlign: 'left',
                    headerTintColor: "#000",
                    headerBackTitleVisible: false
                }}
    
            >
    
    			// 6. 객체 안에 .Screen 있는데 사용할 Screen들 일단 넣어주자
                <Stack.Screen name="MainPage" component={MainPage} />
                <Stack.Screen name="DetailPage" component={DetailPage} />
            </Stack.Navigator>
    
        )
    }
    
    export default StackNavigator;
    // MainPage.js
    
    import React, { useState, useEffect } from 'react';
    import { StyleSheet, Text, View, Image, TouchableOpacity, ScrollView } from 'react-native';
    
    export default function MainPage({ navigation, route }) {
    	const [state, setState] = useState([])
    	const [cateState, setCateState] = useState([])
    
        const [ready, setReady] = useState(true)
    
    	// 1. View 그릴때 호출 되는 함수이다 
        useEffect(() => {
        
        	// 2. Navigation Title 값 할당
            navigation.setOptions({
                title: '나만의 꿀팁'
            })
    
            setTimeout(() => {
                setState(data.tip)
                setCateState(data.tip)
                setReady(false)
            }, 1000)
        }, [])
        
        return ready ? <Loading /> : (
            <View style={styles.cardContainer}>
                {
    	            // cateState 안에 담긴 상태 변수들 반복문 돌리면서 Card init 한다
                    // 3. Card 그릴때 content, key, navigation 같이 넘겨 준다
                    cateState.map((content, i) => {
                        return (<Card content={content} key={i} navigation={navigation} />)
                    })
                }
            </View>
        
    	)
    }
    // Card.js
    
    import React from 'react';
    import { View, Image, Text, StyleSheet, TouchableOpacity } from 'react-native'
    
    // 1. MainPage이 한테 content, navigation 상속받는다
    export default function Card({ content, navigation }) {
      return (
    
        // 2. Card가 onClick되면 navigation.navigate('DetailPage') 로 이동시킨다
        // 이동 시킬때 매개변수로 content도 같이 넘겨준다 안에는 DetailPage에 뿌려질 내용들이 담겨있다.
    	<TouchableOpacity style={styles.card} onPress={()=>{navigation.navigate('DetailPage',content)}}>
            <Image style={styles.cardImage} source={{ uri: content.image }} />
            <View style={styles.cardText}>
                <Text style={styles.cardTitle} numberOfLines={1}>{content.title}</Text>
                <Text style={styles.cardDesc} numberOfLines={3}>{content.desc}</Text>
                <Text style={styles.cardDate}>{content.date}</Text>
            </View>
        </TouchableOpacity>
      )
    }
    import React,{useState,useEffect} from 'react';
    import { StyleSheet, Text, View, Image, ScrollView,TouchableOpacity,Alert } from 'react-native';
    
    // 1. DetailPage init 될때 route를 같이 받는다 
    // 이유는 StackNavigator.js 에서 Stack.Screen에 DetailPage가 들어갔는데
    // 그렇게 함으로써 이미 route에 들어가 있는 페이지이기 때문이다.
    
    export default function DetailPage({navigation,route}) {
    	
        // 2. 사용할 useState를 init 한다
        const [tip, setTip] = useState({
            "idx":9,
            "category":"재테크",
            "title":"렌탈 서비스 금액 비교해보기",
            "image": "https://storage.googleapis.com/sparta-image.appspot.com/lecture/money1.png",
            "desc":"요즘은 정수기, 공기 청정기, 자동차나 장난감 등 다양한 대여서비스가 활발합니다. 사는 것보다 경제적이라고 생각해 렌탈 서비스를 이용하는 분들이 늘어나고 있는데요. 다만, 이런 렌탈 서비스 이용이 하나둘 늘어나다 보면 그 금액은 겉잡을 수 없이 불어나게 됩니다. 특히, 렌탈 서비스는 빌려주는 물건의 관리비용까지 포함된 것이기에 생각만큼 저렴하지 않습니다. 직접 관리하며 사용할 수 있는 물건이 있는지 살펴보고, 렌탈 서비스 항목에서 제외해보세요. 렌탈 비용과 구매 비용, 관리 비용을 여러모로 비교해보고 고민해보는 것이 좋습니다. ",
            "date":"2020.09.09"
        })
    
        useEffect(()=>{
            navigation.setOptions({
    			// 3. route안에 params 안에 title이 들어있는데
                // 이건 content 의 title 이다
                // 이걸 navBarTitle에 넣어준다
                title:route.params.title,
    
                headerStyle: {
                    backgroundColor: '#000',
                    shadowColor: "#000",
                },
                headerTintColor: "#fff",
            })
            
            // 4. 페이지에 보여줄 내용들을 담는 상태 변수에 상위 view에서 받아온
            // data를 넣어준다
            setTip(route.params)
        },[])
        
        return ( 
            
            // 5. 상태 변수에 들어간 정보들을 화면에 뿌려준다
            <ScrollView style={styles.container}>
                <Image style={styles.image} source={{uri:tip.image}}/>
                <View style={styles.textContainer}>
                    <Text style={styles.title}>{tip.title}</Text>
                    <Text style={styles.desc}>{tip.desc}</Text>
                    <TouchableOpacity style={styles.button} onPress={()=>popup()}><Text style={styles.buttonText}>팁 찜하기</Text></TouchableOpacity>
                </View>
                
            </ScrollView>
        
        )
    }
Designed by Tistory.