728x90
반응형
App.js
import React, { Component } from 'react';
import {
SafeAreaView,
StyleSheet,
ScrollView,
View,
Text,
StatusBar,
} from 'react-native';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import Home from './src/Home'
import Native_Module from './src/Native_Module'
import UI_Test from './src/UI_Test'
import ReduxSample from './src/ReduxSample'
import { createStore, } from "redux";
import rootReducer from './src/redux/rootReducer'
import {Provider} from "react-redux"
// 스토어 생성 및 리듀서 등록
const store = createStore(rootReducer);
/*
// 미들웨어가 있는 경우
const store = createStore(
reducers,
applyMiddleware(
// Middleware will not be applied to this sample.
),
); */
const Stack = createStackNavigator();
class App extends Component{
render(){
return(
<Provider store={store}>
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Home" component={Home} options={{ headerShown: false }} />
<Stack.Screen name="Native_Module" component={Native_Module} options={{ headerShown: false }} />
<Stack.Screen name="UI_Test" component={UI_Test} options={{ headerShown: false }} />
<Stack.Screen name="ReduxSample" component={ReduxSample} options={{ headerShown: false }} />
</Stack.Navigator>
</NavigationContainer>
</Provider>
)
}
}
export default App;
1) 스토어를 만들어서 리듀서를 등록해준다.
2) Provider 에 스토어를 등록해주고 사용한 컨테이너를 감싸준다.
3) 미들 웨어가 있는 경우 , 스토어 생성시 등록해 준다.
rootReducer.js
import { TOGGLE_SWITCH,INCREMENT, DECREMENT } from "./actionType";
// 초깃값 설정
const initialState = {
light: false,
counter: 0
};
function rootReducer(state = initialState, action) {
switch (action.type) {
case TOGGLE_SWITCH:
return {
...state, // 기존의 값은 그대로 두면서
light: !state.light // light 값 반전시키기
};
case INCREMENT:
return {
...state,
counter: state.counter + action.data
};
case DECREMENT:
return {
...state,
counter: state.counter - 1
};
default:
// 지원하지 않는 액션의 경우 상태 유지
return state;
}
}
export default rootReducer;
actionType.js
export const TOGGLE_SWITCH = "TOGGLE_SWITCH";
export const INCREMENT = "INCREMENT";
export const DECREMENT = "DECREMENT";
리듀서와 액션에서 사용할 action의 이름을 정해준다.
action.js
import { TOGGLE_SWITCH,INCREMENT, DECREMENT } from "./actionType";
export function addArticle(payload) {
return { type: "ADD_ARTICLE", payload }
};
export function addTodo(data) {
return {
type: "ADD_TODO",
data
};
}
export function toggleSwitch(){
return {
type : TOGGLE_SWITCH
}
}
export function increment( data ){
return {
type : INCREMENT,
data : data,
}
}
export function decrement(){
return {
type : DECREMENT
}
}
ReduxSample.js
import { connect } from 'react-redux';
import React,{ Component } from 'react';
import {
SafeAreaView,
StyleSheet,
ScrollView,
View,
Text,
StatusBar,
TouchableOpacity
} from 'react-native';
import {increment,decrement} from './redux/action'
class ReduxSample extends Component{
constructor(props){
super(props)
}
render(){
return(
<View style= {{ flex:1, justifyContent:'center',alignItems:'center'}}>
<Text>
리덕스 샘플
</Text>
<TouchableOpacity
style= {{height:50, width:100, backgroundColor:'white',justifyContent:'center',alignItems:'center'}}
onPress = {()=> this.props.increse_data(1)}
>
<Text> 증가 ! </Text>
<Text>{this.props.counter}</Text>
</TouchableOpacity>
<TouchableOpacity
style= {{height:50, width:100, backgroundColor:'white',justifyContent:'center',alignItems:'center'}}
onPress = {()=> this.props.decrese_data()}
>
<Text> 감소 ! </Text>
</TouchableOpacity>
</View>
)
}
}
function mapStateToProps(state) {
// 리듀서 안에 있는 state를 리턴해 온다.
return {
light: state.light,
counter: state.counter
};
}
function mapDispatchToProps(dispatch) {
// action을 이용하여, 리듀서 내부의 함수를 호출해 데이터를 조작한다.
return {
increse_data:(data) => {
dispatch(increment(data));
},
decrese_data:() => {
dispatch(decrement());
}
};
}
export default connect(mapStateToProps, mapDispatchToProps)(ReduxSample);
728x90
반응형
'Redux' 카테고리의 다른 글
redux 사용예제 ( feat. useSelector / useDispatch ) (0) | 2022.10.11 |
---|---|
리덕스 사용예제 1 (0) | 2020.08.15 |
Redux 업데이트 (0) | 2020.08.15 |
리덕스란 (0) | 2020.01.29 |