Site icon C1CTech

Understanding Redux With Simple Example

<h3><strong><span style&equals;"color&colon; &num;000080&semi;">Redux<&sol;span><&sol;strong><&sol;h3>&NewLine;<p>Redux is all about having some central store that managing our entire application state or where we store our entire application state&period;<&sol;p>&NewLine;<p>Get <strong>GITHUB<&sol;strong> code from <a href&equals;"https&colon;&sol;&sol;github&period;com&sol;arunk7839&sol;ReactReduxExample"><span style&equals;"color&colon; &num;00ff00&semi;"><strong>HERE<&sol;strong><&sol;span><&sol;a>&period;<&sol;p>&NewLine;<p><amp-youtube layout&equals;"responsive" width&equals;"1200" height&equals;"675" data-videoid&equals;"kBRtJPFpryk" title&equals;"ReactNative Working With Redux"><a placeholder href&equals;"https&colon;&sol;&sol;youtu&period;be&sol;kBRtJPFpryk"><img src&equals;"https&colon;&sol;&sol;i&period;ytimg&period;com&sol;vi&sol;kBRtJPFpryk&sol;hqdefault&period;jpg" layout&equals;"fill" object-fit&equals;"cover" alt&equals;"ReactNative Working With Redux"><&sol;a><&sol;amp-youtube><&sol;p>&NewLine;<h3 id&equals;"gettingstarted"><strong><span style&equals;"color&colon; &num;000080&semi;">Getting Started<&sol;span><&sol;strong><&sol;h3>&NewLine;<ul>&NewLine;<li>You will have to install and configure React Native&period; If you don&&num;8217&semi;t know how then you can visit to my this <span style&equals;"color&colon; &num;00ccff&semi;"><strong><a style&equals;"color&colon; &num;00ccff&semi;" href&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;installing-react-native-on-windows&sol;">tutorial<&sol;a><&sol;strong><&sol;span> &period;<&sol;li>&NewLine;<&sol;ul>&NewLine;<ul>&NewLine;<li>Create a new react native application <strong><span style&equals;"color&colon; &num;0000ff&semi;">ReactReduxExample<&sol;span><&sol;strong> &period;Use this command&colon;<&sol;li>&NewLine;<&sol;ul>&NewLine;<pre style&equals;"padding-left&colon; 30px&semi;"><span style&equals;"color&colon; &num;008000&semi;"> react-native init <strong>ReactReduxExample&NewLine;&NewLine;<&sol;strong><&sol;span><&sol;pre>&NewLine;<h3 id&equals;"integratingredux"><strong><span style&equals;"color&colon; &num;000080&semi;">Integrating Redux<&sol;span><&sol;strong><&sol;h3>&NewLine;<p>To integrate redux in our application we have to install redux and react-redux in our root folder&period;<&sol;p>&NewLine;<pre><strong><span style&equals;"color&colon; &num;0000ff&semi;">cd  ReactReduxExample<&sol;span><&sol;strong>&NewLine;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">npm install  - - save redux<&sol;span><&sol;strong>&NewLine;&NewLine;<strong><span style&equals;"color&colon; &num;008000&semi;">npm install  - - save react-redux<&sol;span><&sol;strong><&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">or<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><strong><span style&equals;"color&colon; &num;008000&semi;">npm install  - - save redux react-redux<&sol;span><&sol;strong><&sol;pre>&NewLine;<h3><&sol;h3>&NewLine;<h3 id&equals;"design"><strong><span style&equals;"color&colon; &num;000080&semi;">Design<&sol;span><&sol;strong><&sol;h3>&NewLine;<p><img class&equals;"aligncenter wp-image-600 size-full" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;07&sol;react-redux-1&period;png" alt&equals;"" width&equals;"1286" height&equals;"794" &sol;><&sol;p>&NewLine;<p>We will cover 5 basic <strong><span style&equals;"color&colon; &num;993366&semi;">React&sol;Redux<&sol;span><&sol;strong> concepts&period; In three sections&colon;<&sol;p>&NewLine;<ul>&NewLine;<li>Actions<&sol;li>&NewLine;<li>Stores&sol;Reducers<&sol;li>&NewLine;<li>Containers and Components<&sol;li>&NewLine;<&sol;ul>&NewLine;<h4><strong><span style&equals;"color&colon; &num;008000&semi;">Actions<&sol;span><&sol;strong><&sol;h4>&NewLine;<p><span style&equals;"color&colon; &num;993366&semi;" data-offset-key&equals;"bf6384f834b84aa98d79db1477a67825&colon;0"><strong class&equals;"&lowbar;u5j6yl">Actions<&sol;strong><&sol;span><span data-offset-key&equals;"bf6384f834b84aa98d79db1477a67825&colon;1"> are payloads of information that send data from your application to your store&period; <&sol;span><&sol;p>&NewLine;<p><span data-offset-key&equals;"37331f0329274a39a33bf732d0dbf32c&colon;0">Actions are plain JavaScript objects&period; Actions must have a <&sol;span><strong><span style&equals;"color&colon; &num;993366&semi;" data-offset-key&equals;"37331f0329274a39a33bf732d0dbf32c&colon;1">type<&sol;span><&sol;strong><span data-offset-key&equals;"37331f0329274a39a33bf732d0dbf32c&colon;2"> property that indicates the type of action being performed&period;<&sol;span><&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">ActionTypes&period;js<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>export const ADD&lowbar;PLACE &equals; 'ADD&lowbar;PLACE'&semi;&NewLine;export const DELETE&lowbar;PLACE &equals; 'DELETE&lowbar;PLACE'&semi;&NewLine;export const SELECT&lowbar;PLACE &equals; 'SELECT&lowbar;PLACE'&semi;&NewLine;export const DESELECT&lowbar;PLACE &equals; 'DESELECT&lowbar;PLACE'&semi;<&sol;code><&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Actions<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>&lbrace;&NewLine; type&colon; ADD&lowbar;PLACE&comma;&NewLine; placeName&colon; placeName&NewLine;&rcub;<&sol;code><&sol;pre>&NewLine;<pre><code>&lbrace;&NewLine; type&colon; DELETE&lowbar;PLACE&NewLine;&rcub;<&sol;code><&sol;pre>&NewLine;<pre><code>&lbrace;&NewLine; type&colon; SELECT&lowbar;PLACE&comma;&NewLine; placeKey&colon; key&NewLine;&rcub;<&sol;code><&sol;pre>&NewLine;<pre><code>&lbrace;&NewLine; type&colon; DESELECT&lowbar;PLACE&NewLine;&rcub;<&sol;code><&sol;pre>&NewLine;<h5 class&equals;"&lowbar;bc4egv"><span style&equals;"color&colon; &num;0000ff&semi;"><strong><span class&equals;"&lowbar;7dnwj3f">Action Creators<&sol;span><&sol;strong><&sol;span><&sol;h5>&NewLine;<p class&equals;"&lowbar;v011fo" data-key&equals;"d5779fee8b834dceb4ca7184bf2f2699"><span class&equals;"&lowbar;2he8v2h"><span data-key&equals;"ff2d9389b0594f2c805bd4ac88eead12"><span style&equals;"color&colon; &num;800080&semi;"><strong class&equals;"&lowbar;u5j6yl">Action creators<&sol;strong><&sol;span> are exactly that—functions that create actions or return actions&period;<&sol;span><&sol;span><&sol;p>&NewLine;<p data-key&equals;"d5779fee8b834dceb4ca7184bf2f2699"><strong><span style&equals;"color&colon; &num;0000ff&semi;">ActionCreator &lpar;places&period;js&rpar;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>import &lbrace; ADD&lowbar;PLACE&comma; DELETE&lowbar;PLACE&comma; SELECT&lowbar;PLACE&comma; DESELECT&lowbar;PLACE &rcub; from '&period;&sol;actionTypes'&semi;&NewLine;export const addPlace &equals; &lpar;placeName&rpar; &equals;&gt&semi; &lbrace;&NewLine; return &lbrace;&NewLine; type&colon; ADD&lowbar;PLACE&comma;&NewLine; placeName&colon; placeName&NewLine; &rcub;&semi;&NewLine;&rcub;&semi;&NewLine;&NewLine;export const deletePlace &equals; &lpar;&rpar; &equals;&gt&semi; &lbrace;&NewLine; return &lbrace;&NewLine; type&colon; DELETE&lowbar;PLACE&NewLine; &rcub;&semi;&NewLine;&rcub;&semi;&NewLine;&NewLine;export const selectPlace &equals; &lpar;key&rpar; &equals;&gt&semi; &lbrace;&NewLine; return &lbrace;&NewLine; type&colon; SELECT&lowbar;PLACE&comma;&NewLine; placeKey&colon; key&NewLine; &rcub;&semi;&NewLine;&rcub;&semi;&NewLine;&NewLine;export const deselectPlace &equals; &lpar;&rpar; &equals;&gt&semi; &lbrace;&NewLine; return &lbrace;&NewLine; type&colon; DESELECT&lowbar;PLACE&NewLine; &rcub;&semi;&NewLine;&rcub;&semi;<&sol;code><&sol;pre>&NewLine;<h4><strong><span style&equals;"color&colon; &num;008000&semi;">Reducers<&sol;span><&sol;strong><&sol;h4>&NewLine;<p>Reducers receive the dispatched actions from the component and corresponding to that action it updates the application state in a pure synchronous function&period;<&sol;p>&NewLine;<p class&equals;"&lowbar;v011fo" data-key&equals;"a6980cf4c8a049f389da1fe85896991d"><span class&equals;"&lowbar;2he8v2h"><span data-key&equals;"2b8fb8cc6f974c78926bea5e4168bffb">The reducer is a pure function that takes the previous state and an action&comma; and returns the new state&period;<&sol;span><&sol;span><&sol;p>&NewLine;<div class&equals;"&lowbar;1y81j11">&NewLine;<div data-key&equals;"fe071e39eac84a31a89eda7123d8f5e5">&NewLine;<pre class&equals;"&lowbar;17r7t1h" data-key&equals;"fe22a8bed6124ae89efd172056a133d3"><strong><span style&equals;"color&colon; &num;0000ff&semi;" data-key&equals;"785d857d9daf4ce9b92400292ad8838c"><span class&equals;"prism-token token punctuation ">&lpar;<&sol;span><span class&equals;"prism-token token 1">previousState<&sol;span><span class&equals;"prism-token token 2 punctuation ">&comma;<&sol;span><span class&equals;"prism-token token 3"> action<&sol;span><span class&equals;"prism-token token 4 punctuation ">&rpar;<&sol;span> <span class&equals;"prism-token token 6 operator ">&equals;&gt&semi;<&sol;span><span class&equals;"prism-token token 7"> newState<&sol;span><&sol;span><&sol;strong><&sol;pre>&NewLine;<&sol;div>&NewLine;<&sol;div>&NewLine;<div data-key&equals;"fe22a8bed6124ae89efd172056a133d3">When there are multiple actions we use switch to identify the corresponding action by its unique type that indicates the type of action being performed&period;<&sol;div>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">Reducer&lpar;Places&period;js&rpar;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>import &lbrace;&NewLine; ADD&lowbar;PLACE&comma;&NewLine; DELETE&lowbar;PLACE&comma;&NewLine; SELECT&lowbar;PLACE&comma;&NewLine; DESELECT&lowbar;PLACE&NewLine;&rcub; from "&period;&period;&sol;actions&sol;actionTypes"&semi;&NewLine;&NewLine;const initialState &equals; &lbrace;&NewLine; places&colon; &lbrack;&rsqb;&comma;&NewLine; selectedPlace&colon; null&NewLine;&rcub;&semi;&NewLine;&NewLine;const reducer &equals; &lpar;state &equals; initialState&comma; action&rpar; &equals;&gt&semi; &lbrace;&NewLine; switch &lpar;action&period;type&rpar; &lbrace;&NewLine; case ADD&lowbar;PLACE&colon;&NewLine; return &lbrace;&NewLine; &period;&period;&period;state&comma;&NewLine; places&colon; state&period;places&period;concat&lpar;&lbrace;&NewLine; key&colon; Math&period;random&lpar;&rpar;&comma;&NewLine; name&colon; action&period;placeName&comma;&NewLine; image&colon; &lbrace;&NewLine; uri&colon;&NewLine; "https&colon;&sol;&sol;c1&period;staticflickr&period;com&sol;5&sol;4096&sol;4744241983&lowbar;34023bf303&lowbar;b&period;jpg"&NewLine; &rcub;&NewLine; &rcub;&rpar;&NewLine; &rcub;&semi;&NewLine; case DELETE&lowbar;PLACE&colon;&NewLine; return &lbrace;&NewLine; &period;&period;&period;state&comma;&NewLine; places&colon; state&period;places&period;filter&lpar;place &equals;&gt&semi; &lbrace;&NewLine; return place&period;key &excl;&equals;&equals; state&period;selectedPlace&period;key&semi;&NewLine; &rcub;&rpar;&comma;&NewLine; selectedPlace&colon; null&NewLine; &rcub;&semi;&NewLine; case SELECT&lowbar;PLACE&colon;&NewLine; return &lbrace;&NewLine; &period;&period;&period;state&comma;&NewLine; selectedPlace&colon; state&period;places&period;find&lpar;place &equals;&gt&semi; &lbrace;&NewLine; return place&period;key &equals;&equals;&equals; action&period;placeKey&semi;&NewLine; &rcub;&rpar;&NewLine; &rcub;&semi;&NewLine; case DESELECT&lowbar;PLACE&colon;&NewLine; return &lbrace;&NewLine; &period;&period;&period;state&comma;&NewLine; selectedPlace&colon; null&NewLine; &rcub;&semi;&NewLine; default&colon;&NewLine; return state&semi;&NewLine; &rcub;&NewLine;&rcub;&semi;&NewLine;&NewLine;export default reducer&semi;<&sol;code><&sol;pre>&NewLine;<h4 data-key&equals;"d5779fee8b834dceb4ca7184bf2f2699"><span class&equals;"&lowbar;2he8v2h" style&equals;"color&colon; &num;008000&semi;"><strong class&equals;"&lowbar;u5j6yl">Store<&sol;strong><&sol;span><&sol;h4>&NewLine;<p class&equals;"&lowbar;v011fo" data-key&equals;"0d125100079c4e03957c5de362f27ec4"><span class&equals;"&lowbar;2he8v2h"><span data-key&equals;"7125999dfe8c4f89a7ac1ab1e747d818">The <span style&equals;"color&colon; &num;800080&semi;"><strong class&equals;"&lowbar;u5j6yl">Store<&sol;strong><&sol;span> is the object that holds  our entire application state&comma; Allows access to state via <strong><span style&equals;"color&colon; &num;800080&semi;">getState<&sol;span><&sol;strong>&lpar;&rpar; &comma; Allows state to be updated via <strong><span style&equals;"color&colon; &num;800080&semi;">dispatch&lpar;action&rpar;<&sol;span><&sol;strong> etc&period;<&sol;span><&sol;span><&sol;p>&NewLine;<p data-key&equals;"0d125100079c4e03957c5de362f27ec4"><strong><span style&equals;"color&colon; &num;0000ff&semi;">configureStore&period;js<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>import &lbrace; createStore&comma; combineReducers &rcub; from 'redux'&semi;&NewLine;&NewLine;import placesReducer from '&period;&sol;reducers&sol;places'&semi;&NewLine;&NewLine;const rootReducer &equals; combineReducers&lpar;&lbrace;&NewLine; places&colon; placesReducer&NewLine;&rcub;&rpar;&semi;&NewLine;&NewLine;const configureStore &equals; &lpar;&rpar; &equals;&gt&semi; &lbrace;&NewLine; return createStore&lpar;rootReducer&rpar;&semi;&NewLine;&rcub;&semi;&NewLine;&NewLine;export default configureStore&semi;<&sol;code><&sol;pre>&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><span style&equals;"color&colon; &num;000000&semi;">We can have more than one reducers in our application &comma;we used <strong><span style&equals;"color&colon; &num;800080&semi;">combineReducers&lpar;&rpar;<&sol;span><&sol;strong> to combine several reducers into one&period; combineReducers&lpar;&rpar; returns a reducer&lpar;<strong><span style&equals;"color&colon; &num;800080&semi;">function<&sol;span><&sol;strong>&rpar; that invokes every reducer inside the reducers object&period;<br &sol;>&NewLine;Here we called it as rootReducer&period;Now we will pass it to <strong><span style&equals;"color&colon; &num;800080&semi;">createStore&lpar;&rpar;&period;<&sol;span><&sol;strong><&sol;span><&sol;span><&sol;p>&NewLine;<&excl;-- WP QUADS Content Ad Plugin v&period; 2&period;0&period;94&period;1 -->&NewLine;<div class&equals;"quads-location quads-ad2" id&equals;"quads-ad2" style&equals;"float&colon;none&semi;margin&colon;0px&semi;">&NewLine;&NewLine;<&sol;div>&NewLine;&NewLine;<p><strong><span style&equals;"color&colon; &num;800080&semi;">createStore<&sol;span><&sol;strong>&lpar;&rpar; returns an object&lpar;<strong><span style&equals;"color&colon; &num;800080&semi;">Store<&sol;span><&sol;strong>&rpar; that holds the complete state of your app&period;<&sol;p>&NewLine;<h5><span style&equals;"color&colon; &num;0000ff&semi;"><strong> Passing the Store<&sol;strong><&sol;span><&sol;h5>&NewLine;<p><span style&equals;"color&colon; &num;800080&semi;">&lt&semi;<strong>Provider<&sol;strong>&gt&semi; <&sol;span>magically make the store available to all container components in the application without passing it explicitly as a prop to every container component&period; You only need to use it once when you render the root component&colon;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">index&period;js<br &sol;>&NewLine;<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>import React from 'react'&semi;&NewLine;import &lbrace; AppRegistry &rcub; from 'react-native'&semi;&NewLine;import &lbrace; Provider &rcub; from 'react-redux'&semi;&NewLine;import App from '&period;&sol;App'&semi;&NewLine;import configureStore from '&period;&sol;src&sol;store&sol;configureStore'&semi;&NewLine;&NewLine;const store &equals; configureStore&lpar;&rpar;&semi;&NewLine;&NewLine;const RNRedux &equals; &lpar;&rpar; &equals;&gt&semi; &lpar;&NewLine; &lt&semi;Provider store&equals;&lbrace;store&rcub;&gt&semi;&NewLine; &lt&semi;App &sol;&gt&semi;&NewLine; &lt&semi;&sol;Provider&gt&semi;&NewLine;&rpar;&semi;&NewLine;&NewLine;AppRegistry&period;registerComponent&lpar;'ReactReduxExample'&comma; &lpar;&rpar; &equals;&gt&semi; RNRedux&rpar;&semi;<&sol;code><&sol;pre>&NewLine;<h4><strong><span style&equals;"color&colon; &num;008000&semi;">Components<&sol;span><&sol;strong><&sol;h4>&NewLine;<p>Components are responsible for rendering data to the screen&period;<&sol;p>&NewLine;<h4><span style&equals;"color&colon; &num;008000&semi;"><strong>Containers<&sol;strong><&sol;span><&sol;h4>&NewLine;<p>Container components are components that are connected with redux&period; They are responsible for retrieving data&comma; and in order to get that data&comma; the component needs to use Redux&&num;8217&semi;s <strong><span style&equals;"color&colon; &num;800080&semi;">connect<&sol;span><&sol;strong> and <span style&equals;"color&colon; &num;800080&semi;"><strong>mapStateToProps<&sol;strong><&sol;span> functions&period;<&sol;p>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">App&period;js<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>import React&comma; &lbrace; Component &rcub; from "react"&semi;&NewLine;import &lbrace; StyleSheet&comma; View &rcub; from "react-native"&semi;&NewLine;import &lbrace; connect &rcub; from "react-redux"&semi;&NewLine;&NewLine;import PlaceInput from "&period;&sol;src&sol;components&sol;PlaceInput&sol;PlaceInput"&semi;&NewLine;import PlaceList from "&period;&sol;src&sol;components&sol;PlaceList&sol;PlaceList"&semi;&NewLine;import PlaceDetail from "&period;&sol;src&sol;components&sol;PlaceDetail&sol;PlaceDetail"&semi;&NewLine;import &lbrace;&NewLine; addPlace&comma;&NewLine; deletePlace&comma;&NewLine; selectPlace&comma;&NewLine; deselectPlace&NewLine;&rcub; from "&period;&sol;src&sol;store&sol;actions&sol;index"&semi;&NewLine;&NewLine;class App extends Component &lbrace;&NewLine; placeAddedHandler &equals; placeName &equals;&gt&semi; &lbrace;&NewLine; this&period;props&period;onAddPlace&lpar;placeName&rpar;&semi;&NewLine; &rcub;&semi;&NewLine;&NewLine; placeDeletedHandler &equals; &lpar;&rpar; &equals;&gt&semi; &lbrace;&NewLine; this&period;props&period;onDeletePlace&lpar;&rpar;&semi;&NewLine; &rcub;&semi;&NewLine;&NewLine; modalClosedHandler &equals; &lpar;&rpar; &equals;&gt&semi; &lbrace;&NewLine; this&period;props&period;onDeselectPlace&lpar;&rpar;&semi;&NewLine; &rcub;&semi;&NewLine;&NewLine; placeSelectedHandler &equals; key &equals;&gt&semi; &lbrace;&NewLine; this&period;props&period;onSelectPlace&lpar;key&rpar;&semi;&NewLine; &rcub;&semi;&NewLine;&NewLine; render&lpar;&rpar; &lbrace;&NewLine; return &lpar;&NewLine; &lt&semi;View style&equals;&lbrace;styles&period;container&rcub;&gt&semi;&NewLine; &lt&semi;PlaceDetail&NewLine; selectedPlace&equals;&lbrace;this&period;props&period;selectedPlace&rcub;&NewLine; onItemDeleted&equals;&lbrace;this&period;placeDeletedHandler&rcub;&NewLine; onModalClosed&equals;&lbrace;this&period;modalClosedHandler&rcub;&NewLine; &sol;&gt&semi;&NewLine; &lt&semi;PlaceInput onPlaceAdded&equals;&lbrace;this&period;placeAddedHandler&rcub; &sol;&gt&semi;&NewLine; &lt&semi;PlaceList&NewLine; places&equals;&lbrace;this&period;props&period;places&rcub;&NewLine; onItemSelected&equals;&lbrace;this&period;placeSelectedHandler&rcub;&NewLine; &sol;&gt&semi;&NewLine; &lt&semi;&sol;View&gt&semi;&NewLine; &rpar;&semi;&NewLine; &rcub;&NewLine;&rcub;&NewLine;&NewLine;const styles &equals; StyleSheet&period;create&lpar;&lbrace;&NewLine; container&colon; &lbrace;&NewLine; flex&colon; 1&comma;&NewLine; padding&colon; 26&comma;&NewLine; backgroundColor&colon; "&num;fff"&comma;&NewLine; alignItems&colon; "center"&comma;&NewLine; justifyContent&colon; "flex-start"&NewLine; &rcub;&NewLine;&rcub;&rpar;&semi;&NewLine;&NewLine;const mapStateToProps &equals; state &equals;&gt&semi; &lbrace;&NewLine; return &lbrace;&NewLine; places&colon; state&period;places&period;places&comma;&NewLine; selectedPlace&colon; state&period;places&period;selectedPlace&NewLine; &rcub;&semi;&NewLine;&rcub;&semi;&NewLine;&NewLine;const mapDispatchToProps &equals; dispatch &equals;&gt&semi; &lbrace;&NewLine; return &lbrace;&NewLine; onAddPlace&colon; name &equals;&gt&semi; dispatch&lpar;addPlace&lpar;name&rpar;&rpar;&comma;&NewLine; onDeletePlace&colon; &lpar;&rpar; &equals;&gt&semi; dispatch&lpar;deletePlace&lpar;&rpar;&rpar;&comma;&NewLine; onSelectPlace&colon; key &equals;&gt&semi; dispatch&lpar;selectPlace&lpar;key&rpar;&rpar;&comma;&NewLine; onDeselectPlace&colon; &lpar;&rpar; &equals;&gt&semi; dispatch&lpar;deselectPlace&lpar;&rpar;&rpar;&NewLine; &rcub;&semi;&NewLine;&rcub;&semi;&NewLine;&NewLine;export default connect&lpar;mapStateToProps&comma; mapDispatchToProps&rpar;&lpar;App&rpar;&semi;<&sol;code><&sol;pre>&NewLine;<h3 id&equals;"applayout"><strong><span style&equals;"color&colon; &num;000080&semi;">App Layout<&sol;span><&sol;strong><&sol;h3>&NewLine;<p>We&&num;8217&semi;ll add all our app related code in a new folder called &&num;8216&semi;<strong><span style&equals;"color&colon; &num;008000&semi;">src<&sol;span><&sol;strong>&&num;8216&semi; in the root of our newly created project&period; Create these folders and files I have created  inside <strong><span style&equals;"color&colon; &num;008000&semi;">src<&sol;span><&sol;strong> directory as shown below with respective code &colon;<&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;008000&semi;"><strong><span data-key&equals;"6b2a1c6e33d5451dab1ead7f65a05809"><img class&equals;"alignnone size-medium wp-image-602" src&equals;"https&colon;&sol;&sol;c1ctech&period;com&sol;wp-content&sol;uploads&sol;2018&sol;07&sol;redux-capture-227x300&period;png" alt&equals;"" width&equals;"227" height&equals;"300" &sol;><&sol;span><&sol;strong><&sol;span><&sol;p>&NewLine;<p><span style&equals;"color&colon; &num;0000ff&semi;"><strong>ListItem&period;js<&sol;strong><&sol;span><&sol;p>&NewLine;<pre><code>import React from "react"&semi;&NewLine;import &lbrace; View&comma; Text&comma; StyleSheet&comma; TouchableOpacity&comma; Image &rcub; from "react-native"&semi;&NewLine;&NewLine;const listItem &equals; props &equals;&gt&semi; &lpar;&NewLine; &lt&semi;TouchableOpacity onPress&equals;&lbrace;props&period;onItemPressed&rcub;&gt&semi;&NewLine; &lt&semi;View style&equals;&lbrace;styles&period;listItem&rcub;&gt&semi;&NewLine; &lt&semi;Image resizeMode&equals;"cover" source&equals;&lbrace;props&period;placeImage&rcub; style&equals;&lbrace;styles&period;placeImage&rcub; &sol;&gt&semi;&NewLine; &lt&semi;Text&gt&semi;&lbrace;props&period;placeName&rcub;&lt&semi;&sol;Text&gt&semi;&NewLine; &lt&semi;&sol;View&gt&semi;&NewLine; &lt&semi;&sol;TouchableOpacity&gt&semi;&NewLine;&rpar;&semi;&NewLine;&NewLine;const styles &equals; StyleSheet&period;create&lpar;&lbrace;&NewLine; listItem&colon; &lbrace;&NewLine; width&colon; "100&percnt;"&comma;&NewLine; marginBottom&colon; 5&comma;&NewLine; padding&colon; 10&comma;&NewLine; backgroundColor&colon; "&num;eee"&comma;&NewLine; flexDirection&colon; "row"&comma;&NewLine; alignItems&colon; "center"&NewLine; &rcub;&comma;&NewLine; placeImage&colon; &lbrace;&NewLine; marginRight&colon; 8&comma;&NewLine; height&colon; 30&comma;&NewLine; width&colon; 30&NewLine; &rcub;&NewLine;&rcub;&rpar;&semi;&NewLine;&NewLine;export default listItem&semi;<&sol;code><&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">PlaceDetail&period;js<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>import React from "react"&semi;&NewLine;import &lbrace; Modal&comma; View&comma; Image&comma; Text&comma; Button&comma; StyleSheet &rcub; from "react-native"&semi;&NewLine;&NewLine;const placeDetail &equals; props &equals;&gt&semi; &lbrace;&NewLine; let modalContent &equals; null&semi;&NewLine;&NewLine; if &lpar;props&period;selectedPlace&rpar; &lbrace;&NewLine; modalContent &equals; &lpar;&NewLine; &lt&semi;View&gt&semi;&NewLine; &lt&semi;Image source&equals;&lbrace;props&period;selectedPlace&period;image&rcub; style&equals;&lbrace;styles&period;placeImage&rcub; &sol;&gt&semi;&NewLine; &lt&semi;Text style&equals;&lbrace;styles&period;placeName&rcub;&gt&semi;&lbrace;props&period;selectedPlace&period;name&rcub;&lt&semi;&sol;Text&gt&semi;&NewLine; &lt&semi;&sol;View&gt&semi;&NewLine; &rpar;&semi;&NewLine; &rcub;&NewLine; return &lpar;&NewLine; &lt&semi;Modal&NewLine; onRequestClose&equals;&lbrace;props&period;onModalClosed&rcub;&NewLine; visible&equals;&lbrace;props&period;selectedPlace &excl;&equals;&equals; null&rcub;&NewLine; animationType&equals;"slide"&NewLine; &gt&semi;&NewLine; &lt&semi;View style&equals;&lbrace;styles&period;modalContainer&rcub;&gt&semi;&NewLine; &lbrace;modalContent&rcub;&NewLine; &lt&semi;View&gt&semi;&NewLine; &lt&semi;Button title&equals;"Delete" color&equals;"red" onPress&equals;&lbrace;props&period;onItemDeleted&rcub; &sol;&gt&semi;&NewLine; &lt&semi;Button title&equals;"Close" onPress&equals;&lbrace;props&period;onModalClosed&rcub; &sol;&gt&semi;&NewLine; &lt&semi;&sol;View&gt&semi;&NewLine; &lt&semi;&sol;View&gt&semi;&NewLine; &lt&semi;&sol;Modal&gt&semi;&NewLine; &rpar;&semi;&NewLine;&rcub;&semi;&NewLine;&NewLine;const styles &equals; StyleSheet&period;create&lpar;&lbrace;&NewLine; modalContainer&colon; &lbrace;&NewLine; margin&colon; 22&NewLine; &rcub;&comma;&NewLine; placeImage&colon; &lbrace;&NewLine; width&colon; "100&percnt;"&comma;&NewLine; height&colon; 200&NewLine; &rcub;&comma;&NewLine; placeName&colon; &lbrace;&NewLine; fontWeight&colon; "bold"&comma;&NewLine; textAlign&colon; "center"&comma;&NewLine; fontSize&colon; 28&NewLine; &rcub;&NewLine;&rcub;&rpar;&semi;&NewLine;&NewLine;export default placeDetail&semi;<&sol;code><&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">PlaceInput&period;js<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>import React&comma; &lbrace; Component &rcub; from "react"&semi;&NewLine;import &lbrace; View&comma; TextInput&comma; Button&comma; StyleSheet &rcub; from "react-native"&semi;&NewLine;&NewLine;class PlaceInput extends Component &lbrace;&NewLine; state &equals; &lbrace;&NewLine; placeName&colon; ""&NewLine; &rcub;&semi;&NewLine;&NewLine; componentDidMount&lpar;&rpar; &lbrace;&NewLine;&NewLine; &rcub;&NewLine;&NewLine; placeNameChangedHandler &equals; val &equals;&gt&semi; &lbrace;&NewLine; this&period;setState&lpar;&lbrace;&NewLine; placeName&colon; val&NewLine; &rcub;&rpar;&semi;&NewLine; &rcub;&semi;&NewLine;&NewLine; placeSubmitHandler &equals; &lpar;&rpar; &equals;&gt&semi; &lbrace;&NewLine; if &lpar;this&period;state&period;placeName&period;trim&lpar;&rpar; &equals;&equals;&equals; ""&rpar; &lbrace;&NewLine; return&semi;&NewLine; &rcub;&NewLine;&NewLine; this&period;props&period;onPlaceAdded&lpar;this&period;state&period;placeName&rpar;&semi;&NewLine; &rcub;&semi;&NewLine;&NewLine; render&lpar;&rpar; &lbrace;&NewLine; return &lpar;&NewLine; &lt&semi;View style&equals;&lbrace;styles&period;inputContainer&rcub;&gt&semi;&NewLine; &lt&semi;TextInput&NewLine; placeholder&equals;"An awesome place"&NewLine; value&equals;&lbrace;this&period;state&period;placeName&rcub;&NewLine; onChangeText&equals;&lbrace;this&period;placeNameChangedHandler&rcub;&NewLine; style&equals;&lbrace;styles&period;placeInput&rcub;&NewLine; &sol;&gt&semi;&NewLine; &lt&semi;Button&NewLine; title&equals;"Add"&NewLine; style&equals;&lbrace;styles&period;placeButton&rcub;&NewLine; onPress&equals;&lbrace;this&period;placeSubmitHandler&rcub;&NewLine; &sol;&gt&semi;&NewLine; &lt&semi;&sol;View&gt&semi;&NewLine; &rpar;&semi;&NewLine; &rcub;&NewLine;&rcub;&NewLine;&NewLine;const styles &equals; StyleSheet&period;create&lpar;&lbrace;&NewLine; inputContainer&colon; &lbrace;&NewLine; &sol;&sol; flex&colon; 1&comma;&NewLine; width&colon; "100&percnt;"&comma;&NewLine; flexDirection&colon; "row"&comma;&NewLine; justifyContent&colon; "space-between"&comma;&NewLine; alignItems&colon; "center"&NewLine; &rcub;&comma;&NewLine; placeInput&colon; &lbrace;&NewLine; width&colon; "70&percnt;"&NewLine; &rcub;&comma;&NewLine; placeButton&colon; &lbrace;&NewLine; width&colon; "30&percnt;"&NewLine; &rcub;&NewLine;&rcub;&rpar;&semi;&NewLine;&NewLine;export default PlaceInput&semi;<&sol;code><&sol;pre>&NewLine;<p><strong><span style&equals;"color&colon; &num;0000ff&semi;">PlaceList&period;js<&sol;span><&sol;strong><&sol;p>&NewLine;<pre><code>import React from "react"&semi;&NewLine;import &lbrace; StyleSheet&comma; FlatList &rcub; from "react-native"&semi;&NewLine;&NewLine;import ListItem from "&period;&period;&sol;ListItem&sol;ListItem"&semi;&NewLine;&NewLine;const placeList &equals; props &equals;&gt&semi; &lbrace;&NewLine; return &lpar;&NewLine; &lt&semi;FlatList&NewLine; style&equals;&lbrace;styles&period;listContainer&rcub;&NewLine; data&equals;&lbrace;props&period;places&rcub;&NewLine; renderItem&equals;&lbrace;&lpar;info&rpar; &equals;&gt&semi; &lpar;&NewLine; &lt&semi;ListItem&NewLine; placeName&equals;&lbrace;info&period;item&period;name&rcub;&NewLine; placeImage&equals;&lbrace;info&period;item&period;image&rcub;&NewLine; onItemPressed&equals;&lbrace;&lpar;&rpar; &equals;&gt&semi; props&period;onItemSelected&lpar;info&period;item&period;key&rpar;&rcub;&NewLine; &sol;&gt&semi;&NewLine; &rpar;&rcub;&NewLine; &sol;&gt&semi;&NewLine; &rpar;&semi;&NewLine;&rcub;&semi;&NewLine;&NewLine;const styles &equals; StyleSheet&period;create&lpar;&lbrace;&NewLine; listContainer&colon; &lbrace;&NewLine; width&colon; "100&percnt;"&NewLine; &rcub;&NewLine;&rcub;&rpar;&semi;&NewLine;&NewLine;export default placeList&semi;<&sol;code><&sol;pre>&NewLine;&NewLine;

Exit mobile version