오티스의개발일기

[REACT NATIVE] 인스타그램 클론 코딩 (17) navigation을 이용하여 새 게시물 스택 만들기 본문

개발/react-native

[REACT NATIVE] 인스타그램 클론 코딩 (17) navigation을 이용하여 새 게시물 스택 만들기

안되면 될때까지.. 2023. 1. 2. 20:45
728x90

 


< 이전글

2023.01.02 - [개발/react-native] - [REACT NATIVE] 인스타그램 클론 코딩 (16) react-native-paper 사용하여 메뉴바 만들기!

 

[REACT NATIVE] 인스타그램 클론 코딩 (16) react-native-paper 사용하여 메뉴바 만들기!

< 이전글 2023.01.02 - [개발/react-native] - [REACT NATIVE] 인스타그램 클론 코딩 (15) 로그아웃 구현하기 [REACT NATIVE] 인스타그램 클론 코딩 (15) 로그아웃 구현하기 < 이전글 2023.01.01 - [개발/react-native] - [REACT

otis.tistory.com


 


다음글 >

2023.01.04 - [개발/react-native] - [REACT NATIVE] 인스타그램 클론 코딩 (18) 마지막....ㅠㅠ react-native-image-picker 를 사용한 새 게시물 업로드

 

[REACT NATIVE] 인스타그램 클론 코딩 (18) 마지막....ㅠㅠ react-native-image-picker 를 사용한 새 게시물 업

< 이전글 2023.01.02 - [개발/react-native] - [REACT NATIVE] 인스타그램 클론 코딩 (17) navigation을 이용하여 새 게시물 스택 만들기 [REACT NATIVE] 인스타그램 클론 코딩 (17) navigation을 이용하여 새 게시물 스택

otis.tistory.com


 

이전시간에 메뉴바를 만들었다 오늘은 그 메뉴바 안에있는 새 게시물을 클릭했을때 새로운 스택스크린이 생기도록 구현할거다.

 

일단 네비게이션안에 네비게이션 이런 구조로 만들어야한다.

 

백문이 불여일견...그냥 보는게 났다 그럼 시작해보도록 하겠다.

 


# 오늘 작업할 파일목록

  • HomeScreen.js
  • Header.js (/src/screens/home/Header.js)

 

# 0. 폴더 구조



 

 

 

# 1 . HomeScreen.js 수정

 


  
import React from 'react'
import styled from "styled-components/native";
import { useDispatch, useSelector } from "react-redux"; // userDispatch = 데이터 변경시 사용 // useSelector = 데이터 가져올때 사용
import Header from '../screens/home/Header'
import FeedList from './home/FeedList';
import StoryList from './home/StoryList';
import { Provider as PaperProvider } from 'react-native-paper';
import {createStackNavigator} from '@react-navigation/stack'
const MainScreen = ({navigation}) => {
return (
<>
<Header navigation={navigation}/>
<HomeScreenScrollView>
<StoryList></StoryList>
<FeedList></FeedList>
</HomeScreenScrollView>
</>
)
}
const NewFeed = ({}) => {
return (
<View>
<Text>뉴 포스트</Text>
</View>
)
}
const HomeScreen = ({ navigation }) => {
const theme = useSelector((state) => state.themeSlicer.theme);
const dispatch = useDispatch();
const Stack = createStackNavigator();
const screenOption = {
headerShown: false,
}
return (
<SafeAreaView>
<PaperProvider>
<Stack.Navigator initialRouteName="main" screenOptions={screenOption}>
<Stack.Screen name="main" component={MainScreen} ></Stack.Screen>
<Stack.Screen name="newPost" component={NewFeed} ></Stack.Screen>
</Stack.Navigator>
</PaperProvider>
</SafeAreaView>
)
}
export default HomeScreen
const HomeScreenScrollView = styled.ScrollView`
background-color: ${props => props.theme.backgroundColor};
`;
const Text = styled.Text`
color: ${props => props.theme.TextColor};
`;
const View = styled.View`
background-color: ${props => props.theme.backgroundColor};
`
const SafeAreaView = styled.SafeAreaView`
flex: 1;
background-color: ${props => props.theme.backgroundColor};
`;

 

 

보이는것과 같이

HomeScreen.js 에도 네비게이션을 구현하였다.

메인은 그전에 만든 MainScreen 이고 그밑에있는건 오늘 만들 NewFeed 이다.

 

이것들이 동작할수있도록 네비게이션은 push 해줘야하니 Header 의 props 로 보낸 navigation 을 사용해보도록 하겠다.

 

 

 

# 2.Header.js


  
import React from 'react'
import styled, { ThemeProvider } from "styled-components/native";
import { useDispatch, useSelector } from "react-redux"; // userDispatch = 데이터 변경시 사용 // useSelector = 데이터 가져올때 사용
import { darkTheme, lightTheme } from "../../../Theme";
import themeSlicer from "../../slicers/themeSlicer";
import Ionicons from "react-native-vector-icons/Ionicons";
import LightHeaderLogo from '../../../assets/header-logo.png'
import BlackHeaderLogo from '../../../assets/black-header-logo.png'
import ICONS from '../../constants/icons'
import {ROUTES} from '../../constants/routes'
import { Button, Menu, Divider, Provider } from 'react-native-paper';
const Header = ({navigation}) => {
const theme = useSelector((state) => state.themeSlicer.theme);
const dispatch = useDispatch();
const [visible, setVisible] = React.useState(false);
const openMenu = () => setVisible(true);
const closeMenu = () => setVisible(false);
return (
<Container>
<HeaderBox>
<TouchableOpacity>
{
theme.mode === 'dark' ? <Image source={LightHeaderLogo} /> : <Image source={BlackHeaderLogo} />
}
</TouchableOpacity>
<HeaderIconBox>
<Menu
visible={visible}
onDismiss={closeMenu}
anchor={ <TouchableOpacity onPress={openMenu}>
<Ionicons name="add-circle-outline" size={28} color={theme.mode === 'dark' ? 'white' : 'black'} />
</TouchableOpacity>}>
<Menu.Item icon="information" onPress={() => {navigation.push('newPost')}} title="새 게시물"/>
</Menu>
<TouchableOpacity>
<UnderDot />
<Ionicons name="heart-outline" size={28} color={theme.mode === 'dark' ? 'white' : 'black'}/>
</TouchableOpacity>
<TouchableOpacity>
<UnderRedIcon>
<UnderRedIconText>11</UnderRedIconText>
</UnderRedIcon>
<Ionicons name="paper-plane-outline" size={28} color={theme.mode === 'dark' ? 'white' : 'black'} />
</TouchableOpacity>
</HeaderIconBox>
</HeaderBox>
</Container>
)
}
export default Header
const Text = styled.Text`
color: ${props => props.theme.TextColor};
`;
const Image = styled.Image`
width: 175px;
height: 51px;
`;
const TouchableOpacity = styled.TouchableOpacity`
margin-left: 15px;
`;
const Container = styled.View`
padding-right: 10px;
background-color: ${props => props.theme.backgroundColor};
`;
const UnderDot = styled.View`
background-color: red;
position: absolute;
top: 0;
right: 0;
border-radius: 50px;
width: 10px;
height: 10px;
z-index: 100;
`;
const UnderRedIcon = styled.View`
background-color: red;
border-radius: 50px;
position: absolute;
align-items: center;
right: 0;
bottom: 20px;
padding: 5% 20%;
z-index: 100;
`;
const UnderRedIconText = styled.Text`
color: white;
font-weight: 600;
`;
const HeaderBox = styled.View`
flex-direction: row;
align-items: center;
justify-content: space-between;
`;
const HeaderIconBox = styled.View`
flex-direction: row;
align-items: center;
justify-content: space-between;
`;

 

 

위 부모에서 전달 받은 navigation 의 push 를 활용하여 스택을 변경할수있다.

 

정상적으로 동작하는지 확인해보자.

 

 

 

 

문제없이 동작하는걸 볼수있다. 

 

다음시간에는 이 스택을 사용하여 만든 스크린의 ui를 제작하여보겠다.

 

그리고 아마 이것들이 마지막 기능들이 될것같다.

 

그것에 대한 글은 다음시간에 적도록하겠다.

 

 

다들 새해복많이받으시고 좋은일만 생기길 바랍니다

 

 

 

 

 

# 깃허브 주소


https://github.com/1domybest/react-native-ig-clone.git

 

GitHub - 1domybest/react-native-ig-clone

Contribute to 1domybest/react-native-ig-clone development by creating an account on GitHub.

github.com


다음글 >

 

2023.01.04 - [개발/react-native] - [REACT NATIVE] 인스타그램 클론 코딩 (18) 마지막....ㅠㅠ react-native-image-picker 를 사용한 새 게시물 업로드

 

[REACT NATIVE] 인스타그램 클론 코딩 (18) 마지막....ㅠㅠ react-native-image-picker 를 사용한 새 게시물 업

< 이전글 2023.01.02 - [개발/react-native] - [REACT NATIVE] 인스타그램 클론 코딩 (17) navigation을 이용하여 새 게시물 스택 만들기 [REACT NATIVE] 인스타그램 클론 코딩 (17) navigation을 이용하여 새 게시물 스택

otis.tistory.com


 

728x90
Comments