// 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
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { StatusBar } from 'expo-status-bar';
import StackNavigator from './Navigations/StackNavigator'
export default function App() {
console.disableYellowBox = true;
return (
<NavigationContainer>
<StatusBar style="black" />
// 4. Navigator 올려주자
<StackNavigator />
</NavigationContainer>);
}
import React from 'react';
import { createStackNavigator } from '@react-navigation/stack';
import DetailPage from '../Pages/DetailPage';
import MainPage from '../Pages/MainPage';
const Stack = createStackNavigator();
const StackNavigator = () => {
return (
<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;
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)
useEffect(() => {
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';
export default function DetailPage({navigation,route}) {
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({
title:route.params.title,
headerStyle: {
backgroundColor: '#000',
shadowColor: "#000",
},
headerTintColor: "#fff",
})
setTip(route.params)
},[])
return (
<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>
)
}