2018-05-24-redux

声明:本文纯属个人学习笔记,本无意发布,参考文档注于文章结尾;
转载请注明原文地址

redux提供了一套机制来组织管理整个应用状态。

   Redux有三部分组成:store,action,reducer。

   store:维护全局的state,以及将action和reducer结合起来。

   action:用来传递state的信息。(比如:我们在action中处理登陆操作,将返回的user对象传递给对应的reducer.)

   reducer: reducer是简单的处理函数,通过传入旧的state和指示操作的action来更新state,从而达到页面的刷新。

首先安装相关库:

安装redux:npm install --save redux
安装redux绑定库:npm install --save react-redux
安装开发者工具:npm install --save-dev redux-devtools
安装异步action构造器:npm install --save redux-thunk
在集成之前熟悉下一般基于Redux的目录结构:
├── src #开发目录
| |
| ├──constants #ActionTypes和Urls
| |
| ├──actions #actions的文件
| |
| ├──components #内部组件
| |
| ├──containers #容器组件
| |
| ├──reducers #reducer文件
| |
| ├──stores #store配置文件
| |
| └──utils #工具
|
├── node_modules #包文件夹
├── .gitignore
├── index.js #入口文件
└── package.json
  1. 首先创建全局的store。(一般在stores文件中写个配置文件)
import  thunk from 'redux-thunk';
import {applyMiddleware, createStore}from 'redux';
import RootReducer from '../reducers/index';
const middlewares = [thunk];

const createSoreWithMiddleware=applyMiddleware(...middlewares)(createStore);

//配置store信息
export default function configureStore(initialState){
  const store=createSoreWithMiddleware(RootReducer,initialState);
  return store;
}

或者这样


import thunk from 'redux-thunk';
import { createStore, applyMiddleware, compose } from 'redux';
import rootReducer from '../reducers/rootReducer';

let store = createStore(rootReducer, {}, compose(
  applyMiddleware(thunk),
  // window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
  window.devToolsExtension ? window.devToolsExtension() : f => f
));

export default store;
  1. (设定类型type) constans文件夹内新建文件actionType,用来划分事件类别
export const LOGIN_DOING = "LOGIN_DOING";//登录中
export const LOGIN_SUCCESS = "LOGIN_SUCCESS";//登录成功
export const LOGIN_ERROR = "LOGIN_ERROR";//登录失败
export const MAIN_DATA = "MAIN_DATA";//主页数据
export const MAIN_DATA_INDEX = "MAIN_DATA_INDEX";//
export const MINE_DATA = "MINE_DATA";//我的页面数据
  1. (设定预处理消息过程)actions文件夹内,新建xxxAction文件,用来给预处理消息区分各个事件的类别(其他操作比如说数据请求等都是在这些xxxAction文件里面写逻辑代码)
// loginAction
import * as types from '../../constants/actionTypes';

export function login(){
  return{
    type:types.LOGIN_DOING,
    status:'登陆中...'
  }
}

export function login2(status){
  return{
    type:types.LOGIN_DOING2,
    status
  }
}
  1. (设定消息的具体处理过程)reducers文件夹内新建xxxReducer文件,用来处理对应的state的变化(数据拼接的一些操作)
import * as types from  '../../constants/actionTypes';

export default function loginIn(state={ status:'请登陆'},action) {  //这里的loginIn需要在总的reducer中去合并
  switch(action.type){
    case types.LOGIN_DOING:
      return{
        ...state,
        status:'登录中...123'
      }
      break;
    case types.LOGIN_DOING2:
      return{
        ...state,
        status:'LOGIN_DOING2'
      }
      break;
    default:
      return state;
  }
}
  1. 项目内可能并不是只有一个redux操作逻辑,现在给所有的reducer建立一个统一的入口,reducers文件夹内新建index.js文件,作为统一入口;
import { combineReducers }from 'redux';
import loginIn from './loginReducer/loginReducer';

const RootReducer =combineReducers({     //应为一个app不可能只有一个reducer所以这个是用来合并所有的reducer的
  loginIn,
});
export default RootReducer;
  1. 创建项目中的store,用来管理所有的state,store文件夹内新建ConfigureStore.js文件
步骤1
  1. 现在action,reducer,store都存在了,接下来我们在处理视图部分,即Provider.先写Provider外壳,并将整个APP包裹在内;
    src文件夹内,新建Root.js文件,该文件内实现Provider对视图部分的包裹
import React, { Component } from 'react';
import {
  Platform,
  StyleSheet,
  Text,
  View
} from 'react-native';
import RootPage from  './src/components/rootPage/rootPage';
import { Provider }from 'react-redux';
import configureStore from './src/stores/ConfigureStore';
import AppNavigator from './src/components/routers/AppNavigator';
const store=configureStore();//
export default class App extends Component{
  render() {
    return (
      <Provider store={store}>
        <AppNavigator></AppNavigator>
      </Provider>
    );
  }
}
  1. 实现页面(注意此处有很关键的一步,需要在页面内实现组件和store的关联,之所以能够实现不同的组件关联不同的state也是在这一步进行的)
//
import React,{ Component }from 'react';
import {
  View,
  Text,
  StyleSheet
}from 'react-native';
import {
  NavigationActions
}from 'react-navigation';
import * as LoginAction from '../../action/loginAction/loginAction';
import { connect} from 'react-redux';
class LoginPage extends Component{
  onLogin() {
    const resetAction = NavigationActions.reset({
      index: 0,
      actions: [
        NavigationActions.navigate({ routeName: 'TabBar'})
      ]
    });
    this.props.navigation.dispatch(resetAction);

    // this.props.navigation.navigate('Work');
  }
  render() {
    const {status,login,login2}=this.props;//这个必须有,是将xxxAction里面定义的方法注入进来,这样在页面中才可以使用,(有两种写法)

           //例如这个页面中的点击登录1和点击登录2中的onPress
           //还有status,初始状态在xxxAction中可以不用赋值,请看步骤3中的login2的status,在loginAction中并没有给初始值,它的初始值会来自对应的xxxReducer中的status,(这里的话可以参考步骤4的loginReducer)
    return (
      <View style={styles.container}>
        <Text style={styles.instructions}>
          状态:{status}
        </Text>
        <Text style={styles.welcome} onPress={()=>login()}>
          点击登录1
        </Text>
        <Text style={styles.welcome} onPress={()=>login2()}>
          点击登录2
        </Text>
        <Text onPress={()=>this.onLogin()}>
          点击切换导航
        </Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({这里的样式省略...});
export default connect(//写法一:
  (state)=>({
    status:state.loginIn.status      //注意看这里面的写法不一样哦,对应的上面的const {status,login,login2}=this.props;的写法也不一样呐
  }),
  (dispatch)=>({
    login:()=>dispatch(LoginAction.login()),
    login2:()=>dispatch(LoginAction.login2())
  })
)(LoginPage);
写法二:(这是来自另一个页面的,和写法一的页面并无关联,注意⚠️这里只是展示方法)
export default connect(
  (state) => {
    const {Announcement} = state;
    return {
      Announcement
    };
    //就是这里,对应的上面的引用写法是不一样的呐,如下所示
    //let {isLoad, list, refreshState} = this.props.Announcement;
  },
  {
     getAnnouncementList, 
     clearAnnouncementListContent, 
     setAnnouncementListRefreshState
}
)(Announcement);
  1. 嗯是的基本这样就结束了哈,等我精进了再来补充哈

需要注意的几个地方:

export  default connect(
  (state)=>({
    status: state.homepage.status
  }),
  (dispatch)=>({
    homepage : ()=>dispatch(mainAction.mainIndex())
  })
)(Main);

在页面中的connect方法里面:state和dispatch:return的是一个纯对象


export function mainIndex(status) {
  return{
    type:types.MAIN_DATA_INDEX,
    status
  }
}

虽然xxxAction中return的status来自redux但是也要在函数里面传入参数status


const status = {
  status: '您已经登录了哦',
  user: 'Linth',
  account: '1314'
}

export default function homepage(state = status,action){
  switch (action.type){
    case types.MAIN_DATA_INDEX:
      state.status = '欢迎回来'
      return {
        ...state
      };
      break;
    default:
      return state;
  }
}

⚠️注意xxxReducer中return 的state前面要加上...就像上面这段代码展示的这样。

本文参考文章:
React Native集成Redux框架讲解与应用
react-native项目中从零开始使用redux

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 本文将开始详细分析如何搭建一个React应用架构。 一. 前言 现在已经有很多脚手架工具,如create-reac...
    字节跳动技术团队阅读 4,186评论 1 23
  • 本文主要是以我的另一篇文章的思维过程来操作,希望大家使用后可以记住整个过程,从而活学活用,使用到自己的项目中. 参...
    nextChallenger阅读 31,375评论 13 41
  • 前言 本文 有配套视频,可以酌情观看。 文中内容因各人理解不同,可能会有所偏差,欢迎朋友们联系我讨论。 文中所有内...
    珍此良辰阅读 11,796评论 23 111
  • 学习必备要点: 首先弄明白,Redux在使用React开发应用时,起到什么作用——状态集中管理 弄清楚Redux是...
    贺贺v5阅读 8,803评论 9 58
  • “月亮吊在天上如同死老妪戴过的耳环”绿色的和平夜里枕着板斧被屠杀 人是美的穿过肉体的夜色是美的 活物装在麻袋里是丑...
    勒普兰斯阅读 199评论 0 0