UNPKG

yylib-quick-mobile

Version:

yylib-quick-mobile

81 lines (79 loc) 3.1 kB
/** * Created by Dio on 2016/8/26. * 基于Redux的动作处理 */ var {connect} = require('react-redux'); var isFunction = require('lodash/isFunction'); var assign = require('lodash/assign'); //通过dispatch扩展组件props对象属性 function _mapDispatchToProps(dispatch) { return { dispatch:dispatch, //发送一个动作指令 sendAction: function() { dispatch(ReduxUtils.createAction.apply(this,arguments)); } } } var ReduxUtils = { //标识封装的动作指令 ACTION_KEY:"__REDUX_SEND_ACTION_DATA__" //标识外部未知的动作指令 , UNKNOW_ACTION_KEY:"__REDUX_SEND_ACTION_UNKNOW__" /** * 将动作与组件进行连接 * @param reactClass React组件 * @param mapStateToProps 新状态映射给组件属性的回调函数 * @param mapDispatchToProps 扩展组件属性的回调函数 */ ,connect:function(reactClass,mapStateToProps,mapDispatchToProps){ return connect(mapStateToProps,function(dispatch){ var _props = _mapDispatchToProps(dispatch); if(isFunction(mapDispatchToProps)){ _props = assign(_props,mapDispatchToProps(dispatch)); } return _props; })(reactClass) } //创建一个动作指令 ,createAction:function(key) { var actionKey = arguments[0];//动作指令标识 if(!actionKey){ console.error('调用sendAction方法,需要将动作指令名称{string}作为第一个参数值'); return {"type": ReduxUtils.UNKNOW_ACTION_KEY}; } //除动作指令标识以外的其它参数 var actionArgs=[]; for(var i=1;i<arguments.length;i++){ actionArgs.push(arguments[i]); } //构建动作指令包 var newAction = {}; newAction.type = ReduxUtils.ACTION_KEY; newAction.actionKey = actionKey; newAction.actionArgs = actionArgs; return newAction; } //监听接收到的动作 ,listen:function(actions) { return function (state={}, action = {type,actionKey,actionArgs:[]}) { if(action.type == ReduxUtils.ACTION_KEY){ //当前动作指令对应的处理函数 var actionFunc = actions[action.actionKey]; if (isFunction(actionFunc)) { //将当前state和本动作相关的参数传递给动作处理函数 var callArgs = [state].concat(action.actionArgs); //获取动作处理函数返回的新状态 var newState = actionFunc.apply(this,callArgs); //如果动作处理函数无返回结果则返回原始状态,否则返回新状态 return newState==undefined?state:newState; } else { return state; } }else{ return state; } } } }; module.exports = ReduxUtils;