一名iOSer对react-redux的理解
前言
redux的设计思想
redux概念有图有真相,先来一张redux数据流图,让你有一个整体的把握 action一般是不允许用户直接操作类的state,而是通过触发消息来执行对应的操作来产生一个新的state,用户或后台服务器可以通过store.dispatch(action)来向store发送一个消息(消息至少一个标识该消息的字段type,还可以添加其他字段用于数据传送),store会在内部根据消息的类型type去reducer中执行相应的处理,这个消息我们就叫他为Action,Action本质上是一个JavaScript对象。 实际编码中一般会把整个应用的消息类型统一放在一个文件ActionTypes.js中 export const ADD_TODO = 'ADD_TODO'
Action的结构如下,各个字段的key的名字可以随意命名,但是类型的key一般都是type,数据类型最好为字符串 {
type: ADD_TODO,text: 'Build my first Redux app'
}
随着程序越来越大,你会发现一个组件中的action太多太乱了,所以我们也会把action按业务分类放在各个指定的文件中,但是又有一个问题,若果每个action的字段都有五六个,我们在如下写法岂不是太乱了 store.dispatch({
type: ADD_TODO,text: 'Build my first Redux app'
})
于是乎我们就想起来可以将action对象封装在函数中,这个函数返回一个action对象,这个返回一个action对象的函数我们就称之为ActionCreator,如下所示 export let todo = ()=> {
return {
type: ADD_TODO,text: 'Build my first Redux app'
}
}
我们直接store.dispatch(todo)就好了,看着是不是整洁多了啊 reducer它是一个纯函数,要求有相同的输入(参数)就一定会有相同的输出,它会根据当前的state和action来进行逻辑处理返回一个新的state import { VisibilityFilters } from './actions'
//初始state
const initialState = {
visibilityFilter: VisibilityFilters.SHOW_ALL,todos: []
};
function todoApp(state = initialState,action) {
switch (action.type) {
case SET_VISIBILITY_FILTER:
return Object.assign({},state,{
visibilityFilter: action.filter
})
default:
return state
}
}
注意:reducer函数中一定不要去修改state,而是用Object.assign()函数生成一个新的state对象,如上所示 combineReducers:随着应用变得复杂,把APP的所有状态都放在一个reducer中处理会造成reducer函数非常庞大,因此需要对 reducer 函数 进行拆分,拆分后的每一个子reducer独立负责管理 APP state 的一部分。combineReducers 辅助函数的作用是,把多个不同子reducer 函数合并成一个最终的根reducer ,最后将根 reducer 作为createStore的参数就可以创建store对象了。合并后的 reducer 可以调用各个子 reducer,并把它们的结果合并成一个 state 对象。state 对象的结构由传入的多个 reducer 的 key 决定。 最终,state 对象的结构会是这样的: { reducer1: ... reducer2: ... } 使用方法如下所示 import { combineReducers } from 'redux';
import Strolling from './strollingReducer';
import Foods from './foodsReducer';
import FoodsList from './foodsListReducer';
import FoodCompare from './foodCompareReducer';
import FoodInfo from './foodInfoReducer';
import Search from './searchReducer';
import User from './userReducer';
export default rootReducer = combineReducers({
Strolling,Foods,FoodsList,FoodCompare,FoodInfo,Search,User,})
// export default rootReducer = combineReducers({
// Strolling:Strolling,
// Foods:Foods,
// FoodsList:FoodsList,
// FoodCompare:FoodCompare,
// FoodInfo:FoodInfo,
// Search:Search,
// User:User,
// })
// export default function rootReducer(state = {},action){
// return{
// Strolling: Strolling(state.Strolling,action),
// Foods:Foods(state.Foods,
// FoodsList:FoodsList(state.FoodsList,
// FoodCompare:FoodCompare(state.FoodCompare,
// FoodInfo:FoodInfo(state.FoodInfo,
// Search:Search(state.Search,
// User:User(state.User,action)
// }
// }
//以上三种方式是等价的,key可以设置也可以省略
store一个应用只有一个store,store 就是用来维持应用所有的 state 树 的一个对象。 改变 store 内 state 的惟一途径是对它 dispatch 一个 action,它有三个函数 react-redux基础react-redux是redux作者专门为react native订制的,这样使用起来更方便,我们只需在我们的组件中通过属性props获取dispatch方法,就可以直接向store发送一个action,而不需要再获取store对象,通过store对象的dispatch方法发送。 Provider:有一个store属性,我们要将应用的根标签放到Provider标签中,这样应用的所有标签就可以通过context来获取store对象了,但是我们一般不会通过此法来获取store对象,Provider是为了给connect函数使用的,这样才能从connect函数获取到state和dispatch了。 connect([mapStateToProps],[mapDispatchToProps],[mergeProps],[options])参数一:[mapStateToProps(state,[ownProps]): stateProps] (Function)
参数二:[mapDispatchToProps(dispatch,[ownProps]): dispatchProps] (Object or Function):
参数三:[mergeProps(stateProps,dispatchProps,ownProps): props] (Function)
参数四:[options] (Object) 如果指定这个参数,可以定制 connector 的行为。
redux-redux使用react native 组件的生命周期O哈哈~  【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |