管理Web应用全局状态的框架。前端
单页面应用,顾名思义,和传统项目的最明显区别就是项目只有一个页面,页面有一个根元素,咱们写的每个页面是一个大的组件,前端接管路由来渲染不一样的页面组件。react
随着应用的复杂,前端须要存储更多的state,包括缓存的全局数据,本地生成还没有持久化到服务器的数据,也包括 UI 状态,如激活的路由,被选中的标签,是否显示加载动效或者分页器等等。编程
若是是单纯的数据缓存 也没什么须要考虑的东西,放到内存就能够了, 重点是还要让state和view有绑定的关系。state的变化可以触发view的变化。redux
在咱们的项目中,没有用redux以前,咱们都是页面组件管理state,出现如下需求的时候,写起来就比较复杂react-native
纯函数是函数式编程的概念,必须遵照如下一些约束。
不得改写参数
不能调用系统 I/O 的API
不能调用Date.now()或者Math.random()等不纯的方法,由于每次会获得不同的结果api
(1)Web 应用是一个状态机,视图与状态是一一对应的。缓存
(2)全部的状态,保存在一个对象里面。服务器
执行的动做,包括动做所须要的数据,改变store数据的惟一来源,通常是经过store.dispatch() 将 action 传到 store。微信
Action 本质上是 JavaScript 普通对象。框架
flux-standard-action FSA标准
根据action 作更新state的操做。
Action 只是描述了有事情发生了这一事实,并无指明应用如何更新 state。而这正是 reducer 要作的事情。
Store就是保存全局state的容器,保存三个经常使用的api
用户经过View,dispatch 相应的action,store调用reducer获取最新的state,并触发经过subscribe订阅的监听函数,监听函数中咱们经过store的getState方法获取最新的state,更新view。
工做流程图)
simpleredux/index.js
import {createStore} from 'redux'; export function createAction(type, payload) { return { type, payload } } const initialState = { time: new Date().getTime() } function reducer(state = initialState, action) { switch (action.type) { case 'NOW_TIME': return { ...state, time: action.payload } default: return state; } } let store; export function getStore() { if(store) return store; return store = createStore(reducer); }
TestRedux.js
'use strict'; import React, { Component } from 'react'; import { StyleSheet, View, Text } from 'react-native'; import MtButton from '@scfe/react-native-button'; import {getStore, createAction} from '../../simpleredux/index'; const store = getStore(); class TestRedux extends Component { constructor(props) { super(props); let state = store.getState(); this.state = { time: state.time }; store.subscribe(()=>{ let state = store.getState(); this.setState({ time: state.time }); }); } _sendAction() { let action = createAction('NOW_TIME', new Date().getTime()); store.dispatch(action); } render() { return ( <View style={styles.container}> <Text>{this.state.time} </Text> <MtButton text="发出action" onPress={this._sendAction.bind(this)} /> </View> ); } } const styles = StyleSheet.create({ container: { flex: 1, padding: 40 } }); export default TestRedux;
若是以为有收获请关注微信公众号 前端良文 每周都会分享前端开发中的干货知识点。