Redux 试图让 state 的变化变得可预测react
react/react-native 将组件的更新交给了状态机(state),想要更新页面活着页面的某个组件就必须得经过改变state的方式。页面越复杂,组件越多,所须要的state就越多,而且随着页面的交互,state也须要不断得变化,而管理这些不断变化的 state 就变的很是困难。终有一刻,不可胜数的 state 会让你以为 state 的变化已然不受控制。redux
"若是你不知道是否须要 Redux,那就是不须要它。"react-native
Redux主要做用是让应用的 state 能够集中管理,从而达到清晰管理每一个 state,因此当你的应用很简单时,彻底不须要使用redux,它会增长你的工做量。网络
Redux 主要是经过限制 state 更新发生的时间和方式来实现 state 的管理。而这些限制条件则反应在三大原则中:app
整个应用的 state 被储存在一棵 object tree 中,而且这个 object tree 只存在于惟一一个 store 中。dom
唯一改变 state 的方法就是触发 action。函数
确保视图和网络请求都不能直接修改 state,它们能够表达想要修改的意图(actio),而后经过这个触发意图(action)来修改 state。spa
为了描述 action 如何改变 state tree ,你须要编写 reducers。3d
Reducer 是纯函数,它接收先前的 state 和 action,并返回新的 state。code
action是一个普通对象,用于指明用户的操做行为,它是把数据从应用传到 store 的有效载荷,是 store 数据的惟一来源。一般将新数据(state)传入action发送给store。
const EAT_APPLE = 'EAT_APPLE' { type: EAT_APPLE, text: 'eat an apple' }
这里定义了一个action对象,它有type
和text
俩个键,其中type
是必需的,用于描述当前action;text
是自定义的,做为承载数据的载体。
Action 建立函数
Action建立函数
就是生成 action 的方法,,调用这个函数会建立action,一般只返回一个简单的action对象。它的做用主要是为了减小重复大量地建立action。
function eat(text) { return { type: EAT_APPLE, text } }
reducer根据action操做来作出不一样的数据响应,指明应用如何更新 state。它是一个纯函数,只作数据处理。
(previousState, action) => newState
它接收俩个参数:action和state,并return一个新的state。
纯函数(一样的输入,一定获得一样的输出):
//使用ES6参数默认值语法初始化state function toEat(state = {behavior: ""}, action) { if (typeof state === 'EAT_APPLE') { return Object.assign({}, state,{ behavior: action.text }} } return state; }
注意:
因为redux单一数据源,因此整个应用只有一个单一的 store,因此当须要拆分数据处理逻辑时,你应该使用 reducer 组合 而不是建立多个 store。
Redux 提供了一个combineReducers方法,用于 Reducer 的合并:
combineReducers({reducer,...})
Redux 应用只有一个单一的 store。
store有如下方法:
createStore(reducer,[preloadedState])
根据传入的reducer建立一个store。这个函数的第二个参数是可选的,用于设置 state 初始状态。
store.getState()
获取当前state的值。
store.dispatch(action)
向store派遣一个action。即向store传值。
store.subscribe(listener)
注册监听器,监听store,一旦store变化,会触发listener。该函数会返回一个函数用于注销该监听器。
一个清晰明了的流程图能帮咱们更好的理解:
从上图能够看出redux处理的是一个单向数据流:
用户行为或者程序调用 store.dispatch(action),向store派遣action;
store在接收到action后,会自动呼起reducer来处理action,而且会传入俩个参数(当前 State 和收到的 Action),这里reducer能够依据数据处理逻辑拆分红多个,可是数据源store只能是一个;
combineReducers函数会将多个多个子 reducer 输出合并成一个单一的 state 树
生成新的UI