Giới thiệu về cách sử dụng Redux trong ứng dụng React Native
Redux là một containers trạng thái có thể dự đoán được cho các ứng dụng JavaScript. Nếu Redux chưa quen với bạn, ta khuyên bạn nên xem phần giới thiệu của ta về Redux . Trong bài viết này, bạn sẽ học cách duy trì dữ liệu  user  bằng Redux trong ứng dụng React Native. Ứng dụng này là một mạng xã hội giả lập với HomeScreen hiển thị số lượng bạn bè đã kết nối và FriendsScreen bạn bè hiển thị danh sách bạn bè tiềm năng để thêm. Bạn sẽ sử dụng Redux để chia sẻ trạng thái giữa hai màn hình.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần :
- Môi trường phát triển local cho Node.js. Làm theo Cách cài đặt Node.js và Tạo môi trường phát triển local .
- Quen thuộc với việc cài đặt môi trường của bạn để tạo một dự án React Native mới và việc sử dụng trình mô phỏng iOS hoặc Android có thể có lợi.
Hướng dẫn này dựa trên các chủ đề được đề cập trong Cách sử dụng Định tuyến với Điều hướng React trong React Native . Bạn nên đọc hướng dẫn này để biết thêm ngữ cảnh về cách dự án hoạt động, nhưng không bắt buộc.
 Hướng dẫn này đã được xác minh với Node v14.7.0, npm v6.14.7, react v16.13.1, react-native v0.63.2, @react-navigation/native v5.7.3, @react-navigation/stack v5.9.0, redux v4. 0.5 và react react-redux v7.2.1.
 Bước 1 -  Cài đặt  dự án và cài đặt Redux
 Hướng dẫn này sẽ sử dụng version  đã sửa đổi của mã trong Cách sử dụng định tuyến với Điều hướng React trong React Native . Để bắt đầu, hãy sao chép MySocialNetwork :
- git clone https://github.com/do-community/MySocialNetwork.git 
Sau đó, chuyển đến folder dự án:
- cd MySocialNetwork 
Thay đổi nhánh git thành redux-starter :
- git checkout redux-starter 
Tiếp theo, cài đặt các phụ thuộc dự án:
- npm install 
Sau đó, cài đặt redux và react-redux thư viện trong dự án:
- npm install redux@4.0.5 react-redux@7.2.1 
Dự án của bạn hiện đã được cài đặt và các phụ thuộc của bạn đã được cài đặt.
Bước 2 - Tạo hộp giảm tốc
Để kết nối Redux với ứng dụng của bạn, bạn cần tạo một trình giảm bớt và một hành động .
Đầu tiên, bạn sẽ tạo một bộ giảm bớt bạn bè. Bộ giảm là một hàm thuần túy lấy trạng thái trước đó và một hành động làm đối số và trả về trạng thái mới. Công cụ giảm thiểu là công cụ để giữ cho trạng thái hiện tại của bạn bè được cập nhật trong ứng dụng khi nó thay đổi.
 Tạo file  FriendsReducer.js ở cấp cơ sở của dự án:
- nano FriendsReducer.js 
Thêm mã sau:
import { combineReducers } from 'redux';  const INITIAL_STATE = {   current: [],   possible: [     'Alice',     'Bob',     'Sammy',   ], };  const friendsReducer = (state = INITIAL_STATE, action) => {   switch (action.type) {     default:       return state   } };  export default combineReducers({   friends: friendsReducer }); Trong file  này, bạn tạo một biến INITIAL_STATE với những người bạn có thể có để thêm vào mạng xã hội của bạn. Sau đó, bạn đang xuất friendsReducer dưới dạng tài sản được gọi là friends .
Với tính năng giảm thiểu của bạn, bạn cần một cách để thêm bạn bè.
Bước 3 - Tạo một Hành động
 Các hành động là các đối tượng JavaScript đại diện cho  dung lượng  thông tin gửi dữ liệu từ ứng dụng của bạn đến cửa hàng Redux .
 Các hành động có một loại và một trọng tải tùy chọn. Trong hướng dẫn này, kiểu sẽ là ADD_FRIEND và trọng tải sẽ là index  mảng của một người bạn mà bạn đang thêm vào mảng bạn bè current .
 Tạo file  FriendsActions.js ở cấp cơ sở của dự án:
- nano FriendsActions.js 
Thêm addFriend :
export const addFriend = friendsIndex => (   {     type: 'ADD_FRIEND',     payload: friendsIndex,   } ); Khi  user  nhấp vào một người bạn, mã này sẽ truy xuất friendsIndex từ mảng friends.possible .  Đến đây bạn   cần  sử dụng index  đó để di chuyển người bạn này vào mảng friends.current .
 Xem lại FriendsReducer.js :
- nano FriendsReducer.js 
Thêm ADD_FRIEND :
// ...  const friendsReducer = (state = INITIAL_STATE, action) => {   switch (action.type) {     case 'ADD_FRIEND':       // Pulls current and possible out of previous state       // We do not want to alter state directly in case       // another action is altering it at the same time       const {         current,         possible,       } = state;        // Pull friend out of friends.possible       // Note that action.payload === friendIndex       const addedFriend = possible.splice(action.payload, 1);        // And put friend in friends.current       current.push(addedFriend);        // Finally, update the redux state       const newState = { current, possible };        return newState;      default:       return state   } };  // ... Mã này kéo bạn bè hiện tại và có thể ra khỏi trạng thái trước đó. Array.splice() truy xuất bạn bè từ mảng những người bạn có thể có. Array.push thêm bạn bè vào mảng bạn bè hiện tại. Sau khi thay đổi nhiệt được thực hiện, trạng thái được cập nhật.
Bây giờ, bạn có một bộ giảm tốc và một hành động. Bạn cần phải áp dụng bộ giảm tốc cho ứng dụng của bạn .
Bước 4 - Thêm Công cụ giảm vào ứng dụng
 Bạn  cần  cung cấp trạng thái friends của ứng dụng  của bạn  bằng thành phần Provider của React Redux .
 Mở App.js :
- nano App.js 
Provider nhập khẩu, createStore và bạn friendsReducer :
import 'react-native-gesture-handler'; import React from 'react'; import { Provider } from 'react-redux'; import { createStore } from 'redux'; import { StyleSheet } from 'react-native'; import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; import friendsReducer from './FriendsReducer'; import HomeScreen from './HomeScreen'; import FriendsScreen from './FriendsScreen';  // ... Thêm và thay thế mã được đánh dấu bằng createStore và Provider :
// ...  const store = createStore(friendsReducer);  class App extends React.Component {   // ...    render() {     return (       <Provider store={store}>         <NavigationContainer>           <Stack.Navigator>             <Stack.Screen               name="Home"               component={HomeScreen}             />             <Stack.Screen               name="Friends"               component={FriendsScreen}             />           </Stack.Navigator>         </NavigationContainer>       </Provider>     )   } }  Như vậy,  friends có thể truy cập trong ứng dụng của bạn, nhưng bạn vẫn cần thêm họ vào HomeScreen và FriendsScreen .
Bước 5 - Thêm Redux vào màn hình
 Trong bước này, bạn sẽ giúp friends có thể truy cập vào màn hình  của bạn  bằng chức năng mapStateToProps . Chức năng này ánh xạ state từ FriendsReducer đến các props trong hai màn hình.
 Hãy bắt đầu với HomeScreen.js . Mở file  HomeScreen.js :
- nano HomeScreen.js 
Thêm và thay thế các dòng mã được đánh dấu trong HomeScreen.js :
import React from 'react'; import { connect } from 'react-redux'; import { StyleSheet, Text, View, Button } from 'react-native';  class HomeScreen extends React.Component {   render() {     return (       <View style={styles.container}>         <Text>You have (undefined) friends.</Text>          <Button           title="Add some friends"           onPress={() =>             this.props.navigation.navigate('Friends')           }         />       </View>     );   } }  const styles = StyleSheet.create({   container: {     flex: 1,     backgroundColor: '#fff',     alignItems: 'center',     justifyContent: 'center',   }, });  const mapStateToProps = (state) => {   const { friends } = state   return { friends } };  export default connect(mapStateToProps)(HomeScreen); Thay đổi mã này bổ sung thêm react-redux và giúp friends có mặt trên HomeScreen .
 Tiếp theo, thêm giá trị cho bạn bè hiện tại ( this.props.friends.current ):
class HomeScreen extends React.Component {   render() {     return (       <View style={styles.container}>         <Text>You have { this.props.friends.current.length } friends.</Text>          <Button           title="Add some friends"           onPress={() =>             this.props.navigation.navigate('Friends')           }         />       </View>     );   } } HomeScreen của bạn bây giờ sẽ hiển thị số lượng bạn bè hiện tại.  Đến đây bạn  có thể chuyển sang FriendsScreen .
 Mở FriendsScreen.js :
- nano FriendsScreen.js 
Thêm và thay thế các dòng mã được đánh dấu trong FriendsScreen.js :
import React from 'react'; import { connect } from 'react-redux'; import { StyleSheet, Text, View, Button } from 'react-native';  class FriendsScreen extends React.Component {   render() {     return (       <View style={styles.container}>         <Text>Add friends here!</Text>          <Button           title="Back to home"           onPress={() =>             this.props.navigation.navigate('Home')           }         />       </View>     );   } }  const styles = StyleSheet.create({   container: {     flex: 1,     backgroundColor: '#fff',     alignItems: 'center',     justifyContent: 'center',   }, });  const mapStateToProps = (state) => {   const { friends } = state   return { friends } };  export default connect(mapStateToProps)(FriendsScreen); Sự thay đổi mã này bổ sung thêm react-redux và giúp friends có mặt trên FriendsScreen .
 Thêm giá trị cho những người bạn có thể có ( props.friends.possible ):
class FriendsScreen extends React.Component {   render() {     return (       <View style={styles.container}>         <Text>Add friends here!</Text>          {           this.props.friends.possible.map((friend, index) => (             <Button               key={ friend }               title={ `Add ${ friend }` }             />           ))         }          <Button           title="Back to home"           onPress={() =>             this.props.navigation.navigate('Home')           }         />       </View>     );   } } Bây giờ khi bạn  chuyển  đến FriendsScreen bạn bè, bạn sẽ thấy tất cả những người bạn có thể có từ trình thu gọn.
 Cuối cùng, thêm hành động addFriend mới của Redux vào FriendsScreen.js :
import React from 'react'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { StyleSheet, Text, View, Button } from 'react-native'; import { addFriend } from './FriendsActions';  class FriendsScreen extends React.Component {   render() {     return (       <View style={styles.container}>         <Text>Add friends here!</Text>          {           this.props.friends.possible.map((friend, index) => (             <Button               key={ friend }               title={ `Add ${ friend }` }               onPress={() =>                 this.props.addFriend(index)               }             />           ))         }          <Button           title="Back to home"           onPress={() =>             this.props.navigation.navigate('Home')           }         />       </View>     );   } }  // ...  const mapDispatchToProps = dispatch => (   bindActionCreators({     addFriend,   }, dispatch) );  export default connect(mapStateToProps, mapDispatchToProps)(FriendsScreen); Hãy thêm hai người bạn vào mạng xã hội và  chuyển  trở lại HomeScreen để xem  user  có bao nhiêu người bạn hiện tại: 
 Cùng với đó, bạn đã chuyển tất cả logic từ App.js vào Redux , điều này làm cho ứng dụng của bạn linh hoạt hơn nhiều, đặc biệt khi bạn thêm nhiều trang và tính năng như xác thực và tích hợp database .
Trước khi kết thúc, ta hãy xóa mã.
Bước 6 - Dọn dẹp
  Đến đây bạn  đang sử dụng Redux , bạn sẽ không cần các đạo cụ mà bạn đã chuyển từ App.js .
 Bạn có thể tiến hành dọn dẹp thêm một bước nữa bằng cách lưu trữ các loại action  của bạn  trong một file  riêng biệt.
 Bạn đang sử dụng chuỗi 'ADD_FRIEND' ở hai nơi: trong action và reducer 'ADD_FRIEND' bạn bè. Điều này rất nguy hiểm, bởi vì nếu bạn thay đổi chuỗi ở một nơi chứ không phải nơi khác, bạn có thể phá vỡ ứng dụng  của bạn . Khi ứng dụng của bạn phát triển, bạn nên giữ tất cả các loại action này trong một file  có tên là types.js .
 Tạo file  types.js ở cấp cơ sở:
- nano types.js 
Thêm mã sau:
export const ADD_FRIEND = 'ADD_FRIEND'; Sau đó, truy cập lại FriendsActions.js để sử dụng ADD_FRIEND mới:
nano FriendsActions.js Thay đổi 'ADD_FRIEND' được trích dẫn thành biến ADD_FRIEND trong action của bạn:
import { ADD_FRIEND } from './types';  export const addFriend = friendsIndex => (   {     type: ADD_FRIEND,     payload: friendsIndex,   } ); Sau đó, hãy truy cập lại FriendsReducer.js để sử dụng ADD_FRIEND mới:
- nano FriendsReducer.js 
Thay đổi niêm yết 'ADD_FRIEND' vào biến ADD_FRIEND trong bạn reducer :
import { combineReducers } from 'redux'; import { ADD_FRIEND } from './types';  // ...  const friendsReducer = (state = INITIAL_STATE, action) => {   switch (action.type) {     case ADD_FRIEND:       // ...      default:       return state;   } }; Điều này làm cho ứng dụng ít mong manh hơn. Khi phát triển các ứng dụng của bạn , bạn nên lưu ý các cơ hội hợp nhất mã và tránh lặp lại chính mình.
Kết luận
 Trong hướng dẫn này, bạn đã đề cập đến redux , bộ reducers , actions và quản lý dữ liệu có thể mở rộng.
Có rất nhiều điều bạn có thể làm với Redux, từ giữ dữ liệu đồng bộ với database , đến xác thực và theo dõi các quyền của user .
Mã nguồn hoàn chỉnh cho hướng dẫn này có sẵn trên GitHub .
Nếu bạn muốn tìm hiểu thêm về React, hãy xem loạt bài Cách viết mã trong React.js của ta hoặc xem trang chủ đề React của ta để biết các bài tập và dự án lập trình.
Các tin liên quan
 

