[快速上手RN] 4. React native 集成redux

系列教程

[快速上手RN] 0.React Native 快速启动项目
[快速上手RN] 1. React native 项目集成UI Kitten
[快速上手RN] 2. React native 项目色彩主题色编辑及使用
[快速上手RN] 3. React native 制作底部导航栏 Bottom Tab Bar
[快速上手RN] 4. React native 集成redux

1.目标

redux是一个状态管理工具,我们使用它也是为了方便多页面,多组件通信,以及能保证数据流的干净整洁
接下来我们将实现跨页面的加减法组件,能够在A页面和B页面共同查看和管理一个数据(状态)

2.安装依赖

  1. react-redux
  2. redux

code

npm install redux react-redux --save

3.目录设计

  • store
    • index.js
    • reducers.js
    • counter
      • action.js
      • actionType.js
      • reducers.js

3.文件代码

3.1 store/index.js

import { createStore } from "redux";
import rootReducer from './reducers'
const configureStore = preloadedState => {
    return createStore(rootReducer)
}

const store = configureStore();
export default store;

3.2 store/reducers.js

import { combineReducers } from "redux";
import counter from './counter/reducer' // 后续如果有新的reducer,也同样方式引入
export default combineReducers({
    counter
})

3.3 store/counter/actionTypes.js

我们需要先定义操作的类型
分别为 新增、删除、重置

export const ADD = 'ADD';
export const SUB = 'SUB';
export const RESET = 'RESET';

3.4 store/counter/action.js

在这个文件,我们将export出操作函数
为何弄的相对繁琐而不是写到一个文件,这是为了能够降低耦合度以及清晰数据流,使用时也能统一使用这里export出的操作函数,而不是直接dispatch对应的type

import { ADD, SUB,  RESET } from './actionTypes';

const addCount = () => ({ type: ADD });
const subCount = () => ({ type: SUB });
const resetCount = data => ({ type: RESET, data });

export {
    addCount,
    subCount,
    resetCount
}

3.5 store/counter/reducer.js

我们从./actionTypes.js引用type,用于判断需要做哪布操作
reducer接收2个参数

  1. state: 我们需要维护的数据object,写state = defaultState是为了初始化该值为defaultState
  2. action: 我们接收到的操作内容,包含2个值
    1. type: 需要执行的操作,比如这次的新增、减少、重置
    2. data: 接收到的数据,比如这次的重置,我们将重置一个指定的值,那么就会用到它
import { ADD, SUB, RESET } from './actionTypes';

const defaultState = {
  count: 0
}

function counter(state = defaultState, action) {
  switch (action.type) {
    case ADD:
      return { ...state, count: state.count + 1 };
    case SUB:
      return { ...state, count: state.count + 1 };
    case RESET:
	  return { ...state, count: action.data };
    default:
      return state;
  }
}

export default counter;

3.6 在App.js中注入

我们需要从react-redux中引入Provider组件,并将我们的业务组件包裹其中,然后传入store参数

Code
--------注意---------
需要将AppNavigator的部分,修改为你的业务组件

import React from "react";
import { Provider } from "react-redux";
import store from "./src/store";
import AppNavigator from "./src/navigator/AppNavigator";

const App = () => { 
  return (
    <Provider store={store}>
        <AppNavigator />
    </Provider>
  );
};
export default App;

至此,我们已经成功将redux集成到我们的react-native项目中了
下一步,我们将使用它们

4.在页面中使用

如果你还没有开发自己的页面组件,那么建议你看下系列文章的上一篇~

打开你的页面组件,并从react-redux引入connect后按照以下代码实现
细节请看注释

import React from "react";
import { connect } from "react-redux";
import { Button, Text, View } from "react-native";
import { addCount, subCount, resetCount } from "../../store/counter/action";
function mapStateToProps(state) {
  return {
    counter: state.counter, // 我们reducers中的counter
  };
}

function mapDispatchToProps(dispatch) {
  // 我们在此拿到之前在action.js定义的操作函数来使用
  return {
    addCount: () => dispatch(addCount()),
    subCount: () => dispatch(subCount()),
    resetCount: (data) => dispatch({ ...resetCount(), data }),
  };
}

const HomeScreen = (props) => {
  /**
   * 函数组件中的props,这时便包含了一下内容
   * {
   *    counter: {
   *      count: 0
   *    },
   *    addCount: Function,
   *    subCount: Function,
   *    resetCount: Function,
   *    ...props
   * } 
   */
  return (
    <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>{props.counter.count}</Text>
      <Button
        title="ADD"
        onPress={() => {
          props.addCount();
        }}
      />
      <Button
        title="SUB"
        onPress={() => {
          props.subCount();
        }}
      />
      <Button
        title="RESET"
        onPress={() => {
          props.resetCount(5); //每次点击设置值为5
        }}
      />
    </View>
  );
};

// 重点: 使用connect组件对HomeScreen进行包装,以便组件内能调用dispatch以及读取state
export default connect(mapStateToProps, mapDispatchToProps)(HomeScreen);

同样的方式可以在其他页面组件使用,这时操作的便是同一份数据了

5. 最终效果参考

在这里插入图片描述

完成,如有帮助请点赞关注~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值