Redux是Facebook提出一个数据状态管理的库,也能够说框架。它搭配React解决了组件之间通讯问题,这个通讯问题,是组件和其它组件之间也能够跨层通讯,不须要一层一层的把,父组件的数据往下传递。这会增长代码复杂度和维护的复杂度。react
若是使用React.createContext的API也能够实现跨层通讯,你能够单独写一个模块去封装Context.Provider和Context.Consumer,只有在根组件使用Context.Provider后,须要共享Context上的数据的组件,均可以经过引入Context.Consumer组件去获取公共的数据。哪一个组件须要顶层组件的数据,就必须引入Context.Consumer。es6
//context.js export default Context = createContext('')
//app.js let store = createStore(reducer) <Context.Provier value={store}> <App /> </Context.Provider>
import Context from './context.js' <Context.Consumer> {(data) => (<div>{data.time}</div>)} </Context.Consumer>
整个Application的数据保存地。这里有一切应用所共享的数据,后台交互和用户输入的数据都在这里管理。Redux提供了一个方法,创造整个应用数据的store,只须要使用es6模块机制,import命名能够输出咱们须要的接口。redux
import { createStore } from 'redux' //建立store必须,外部注入数据和改变整个state的逻辑 let store = createStore(reducer,initalPreLoadState)
描述界面的交互和行为的对象,用户要作什么事,必须发送一个action对象到store的dispatch函数里面,根据提供reducer去匹配action.type,若是没有type匹配对了,会执行接下里的逻辑,更新整个store里面该改变的数据。app
store.dispatch的源代码里,对传入的action是否为对象作了判断,是否有type属性也作了判断。若是action没有问题,那么执行定义传入的reducer(state,action)函数,框架
reducer是一个纯函数,什么样的输入就得出什么样的输出,怎么理解呢? store.dispatch发送了action,固然,这个store.dispatch早就放在了标签的事件里,等着用户去触发。action对象来到store.dispatch函数内存,有了action的数据,执行reducer函数,去匹配类型,执行对应的代码。ide
function add(state=0,action) { switch(action.type){ case 'add': return state + 1 case 'decre': return state - 1 default: return state } }
state和view一一对应,state改变了,view也就改变了。state如何改变,界面的标签上,给定的事件,store.dispatch函数,该函数的参数是action对象,描述要作什么事,触发此函数,传递给整个应用的store,会执行store.dispatch函数里的reducer函数,去更新state,store.subscribe函数监听store的数据发生变化,便会触发此函数去更新React的根组件。函数
redux库提供了核心一个API,createStore函数,能够把整个应用的数据也就是存放在store里面,可是它真的只提供了数据,对于组件之间的通讯,redux库是没有解决的。store里面的数据仍是得从顶层组件往下传,一层一层传。spa
若是要跨组件通讯,顶层组件与任意组件通讯,redux必须借助react的Context的API,结合Redux和React结合成一个库,这样提供的两个API,就能够跨层通讯。code
解决了跨层组件通讯问题。对象