Redux and redux persist complete example using mapstatetoprops and mapDispatchToProps saving objects
app.js
import React from 'react';
import { } from 'react-native';
import { Provider } from 'react-redux';
import { PersistGate } from 'redux-persist/lib/integration/react';
import { persistor, store } from './redux/Store';
import Screen1 from './Components/screen1';
// import Screen2 from './Components/screen2'
// import Index1 from './Components/Screen2';
import Screen5 from './Components/Screen5';
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import 'react-native-gesture-handler';
const App = () => {
const Stack = createStackNavigator();
// const allscreens = () => {
// return (
// );
// };
return (
<Provider store={store}>
<PersistGate persistor={persistor} loading={null}>
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen name="Screen1" component={Screen1} />
<Stack.Screen name="Screen5" component={Screen5} />
</Stack.Navigator>
</NavigationContainer>
</PersistGate>
</Provider>
);
};
export default App;
*******************************************************************************
screen1
index.js
import React, { useEffect, useState } from 'react';
import { View, Text, Button, TextInput, FlatList } from 'react-native';
import style from './styles';
// import { useNavigation } from '@react-navigation/native';
import {
increment,
decrement,
incrementvalue,
decrementvalue,
sendData,
} from '../../redux/actions/AuthActions';
import { connect } from 'react-redux';
// import Screen2 from '../Screen2';
const Screen1 = (props) => {
useEffect(() => {
console.log(props.Myarra);
}, [props.Myarra]);
const [weight, setweight] = useState('')
const [age, setage] = useState(0)
// const gotoscreen2=()=>{
// }
return (
<View style={style.container}>
<Button onPress={() => props.PlusMyvalue()} title="+" />
<TextInput placeholder="enter age" style={style.inputweight} onChangeText={(val)=>setweight(val)}/>
<TextInput placeholder="enter age" style={style.inputage} onChangeText={(val)=>setage(val)}/>
<Button
onPress={() => {
let schooldata = {
WEIGHT: weight,
AGE: age,
};
props.school(schooldata);
}}
title="send data"
/>
<Text style={style.txt}>{props.Mydata}</Text>
{/* <Button onPress={()=>props.mizasMyvalue()} title="-"/> */}
<Button title="dataScreen" onPress={()=>props.navigation.navigate('Screen5')}/>
{/* <FlatList
data={props.Myarra}/> */}
{/* <FlatList
data={props.Myarra}
keyExtractor={(item, index) => index.toString()}
renderItem={({ item }) => <Text>{item.WEIGHT},{item.AGE}</Text>}
/> */}
</View>
);
};
// s
// export default Screen1;
function mapStateToProps(state) {
return {
Mydata: state.auth.count,
Myarra: state.auth.myarray,
};
}
function mapDispatchToProps(dispatch) {
return {
// PlusMyvalue: ()=> dispatch(incrementvalue()),
// mizasMyvalue: ()=> dispatch(decrementvalue()),
school: payload => dispatch(sendData(payload)),
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Screen1);
screen1
styles.js
import { StyleSheet } from "react-native";
const style = StyleSheet.create({
container:{
flex:1,
backgroundColor:'skyblue'
},
txt:{
alignSelf:'center',
fontSize:50
},
input:{
// backgroundColor:'green',
borderWidth:5,
textAlign:'center'
}
})
export default style;
*********************************************************************************
screen5
index.js
import React,{useEffect} from 'react';
import {View, Text,FlatList} from 'react-native';
import styles from './styles';
import { connect } from 'react-redux';
const Screen5 = (props) => {
useEffect(() => {
console.log(props.Myarra);
}, [props.Myarra]);
return (
<View style={styles.container}>
<FlatList
data={props.Myarra}
keyExtractor={(item, index) => index.toString()}
renderItem={({item}) => (
<Text>
{item.WEIGHT},{item.AGE}
</Text>
)}
/>
</View>
);
};
function mapStateToProps(state) {
return {
// Mydata: state.auth.count,
Myarra: state.auth.myarray,
};
}
function mapDispatchToProps(dispatch) {
return {
// PlusMyvalue: ()=> dispatch(incrementvalue()),
// mizasMyvalue: ()=> dispatch(decrementvalue()),
school: payload => dispatch(sendData(payload)),
};
}
export default connect(mapStateToProps, mapDispatchToProps)(Screen5);
screen5
styles.js
import { StyleSheet } from "react-native";
const styles = StyleSheet.create({
container:{
flex:1,
backgroundColor:'yellow'
}
})
export default styles
********************************************************************
Redux folders structure
*********************************************************************
Redux (folder)
actions (folder) AuthActions.js in actions folder
reducers (folder) authReducers.js in reducers folder
rootReducer.js (file)
Store.js (file)
types.js (file)
*********************************************************************
*******************************************************************
AuthActions.js
import {
INCREMENT,DECREMENT, SCHOOL
} from '../types';
// export const LanguageType = (language) => ({
// type: LANGUAGE,
// payload: language,
// });
// export const increment = (num) => ({
// type: INCREMENT,
// payload: num,
// });
// export const decrement = (num) => ({
// type: DECREMENT,
// payload: num,
// });
export const incrementvalue=()=>({
type:INCREMENT
})
export const decrementvalue=()=>({
type:DECREMENT
})
export const sendData=(data)=>({
type:SCHOOL,
payload:data
})
*******************************************************************
authReducers.js
import { INCREMENT, DECREMENT , SCHOOL} from '../types';
const initialState = {
count: 0,
myarray:[]
};
export default function (state = initialState, action) {
switch (action.type) {
case INCREMENT:
console.log(' i am called');
return {
...state,
count:state.count+1
};
case DECREMENT:
console.log(' i am Decrement');
return {
...state,
count:state.count-1,
};
case SCHOOL: // [{asasa},{sasa}]
let DummyArray= [...state.myarray, action.payload]
return{
...state,
myarray: DummyArray
}
default:
return state;
}
}
*******************************************************************
rootReducer.js
import { combineReducers } from 'redux';
import authReducers from './reducers/authReducers';
const rootReducer = combineReducers({
auth: authReducers,
});
export default rootReducer;
*******************************************************************
Store.js
// import AsyncStorage from '@react-native-community/async-storage';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { createStore, applyMiddleware } from 'redux';
import thunk from 'redux-thunk';
import { persistStore, persistReducer } from 'redux-persist';
import rootReducer from './rootReducer';
const persistConfig = {
key: 'root',
storage: AsyncStorage,
whitelist: ['auth'],
blacklist: [''],
};
const persistedReducer = persistReducer(persistConfig, rootReducer);
const store = createStore(persistedReducer, applyMiddleware(thunk));
let persistor = persistStore(store);
export { store, persistor };
*******************************************************************
types.js
export const LANGUAGE = 'LANGUAGE'
export const INCREMENT = 'INCREMENT'
export const DECREMENT = 'DECREMENT'
export const SCHOOL = 'SCHOOL'
*******************************************************************
*******************************************************************
package.json
"dependencies": {
"react": "17.0.2",
"react-native": "0.66.2",
"@react-native-async-storage/async-storage": "^1.15.9",
"@react-native-masked-view/masked-view": "^0.2.6",
"@react-navigation/native": "^6.0.6",
"@react-navigation/stack": "^6.0.11",
"react-native-gesture-handler": "^1.10.3",
"react-native-safe-area-context": "^3.3.2",
"react-native-screens": "^3.9.0",
"react-redux": "^7.2.5",
"redux": "^4.1.1",
"redux-persist": "^6.0.0",
"redux-thunk": "^2.3.0"
},
Comments
Post a Comment