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