react篇之redux的优化

我们第一次使用redux的时候可能是下面的写法和使用方法

//首先是安装 和 引入 redux
npm install redux -S   //安装 
import { createStore } from "redux"  //引入
// 然后就直接在 app.js文件中进行书写了 (我以一个累加器举例)
function reducer(state=0,action){
     if(action.type=='add'){
		return state+1;
	}else{
	    return state-1
	}else{
		return state
	}
}
//当然你也可以使用switch的写法
function reducer(state=0,action){
     switch(action.type){
         case 'add':
             return state+1;
             break;
         case 'decrease':
             return state-1;
             break;
         default:
             return state;
     }
}
//然后就是注册和使用了
let stroe=createStore(reducer);
//拿着这个store 在各个组件中进行使用
//获取数据 store.getState() 
//更改数据  store.dispatch({type:'add'})
//更新页面的数据 可以监听 render函数
function render(){
    ReactDOM.render(<App />, document.getElementById('root'));
}
render()
store.subscribe(render) // store中的数据发生变化 触发render函数

优化1
单独创建一个reducer文件夹 创建一个index.js把reducer放入进去
在app.js中引入使用

// reducer/index.js

```javascript
function reducer(state=0,action){
     switch(action.type){
         case 'add':
             return state+1;
             break;
         case 'decrease':
             return state-1;
             break;
         default:
             return state;
     }
}

export default reducer;
//app.js 引入使用
import reducer from “./reducer”

优化2 如果 state的初始值越来越多的话 建议整一个初始化对象存储

```javascript
// src/reducer/index.js
let initState={count:0}
function reducer(state=initState,action){
     ....逻辑处理省略
}

优化3 如果state 初始数据越来越庞大 也是建议重新 建立一个js文件

// src/reducer/initState.js
export default initState={*******}// 里面的数据用 *** 号代替了
//src/reducer/index.js
import initState from "./initState.js"

优化4:提取 操作封装成一个函数

function reducer(state=initState,action){
     switch(action.type){
         case 'add':
             return state+1;
             break;
         case 'decrease':
             return state-1;
             break;
         default:
             return state;
     }
}
// 现在操作比较简单 还可以 如果往后面越来越复杂的话 建议封装到函数里面
// src/reducer/index.js
function add(state){
  return state+1;
}
function decrease(){
  return state-1;
}
function reducer(state=initState,action){
     switch(action.type){
         case 'add':
             return add(state);
             break;
         case 'decrease':
             return decrease(state);
             break;
         default:
             return state;
     }
}

优化5 提取里面的函数到单独的文件 组成函数库
还是老样子项目越来越大 建议提取到一个专门存储操作的文件

// src/reducer/common.js
function add(state){
    return state+1;
}
function decrease(state){
    return state-1;
}
export {add,decrease};
//src/reducer/index.js
import {add,decrease} from "./common.js"
function reducer(state=initState,action){
     switch(action.type){
         case 'add':
             return add(state);
             break;
         case 'decrease':
             return decrease(state);
             break;
         default:
             return state;
     }
}

优化6:用户的操作不应该定死 而是通过传惨输入进来的
看出来上面的 case ‘add’ 或者 case ‘decrese’ 这样写死明显也不太好
我们可以封装成一个函数让他生成 一个reducer函数 里面的操作 通过传惨来确定执行那个操作

// src/reducer/createReducer.js
function createReducer(initState,json){
    return function reducer(state=initState,action){
        if(json[action.type]){
            return json[action.type](state)// 当然后面的参数就不只是state
        }else{
            return state;
        }
    }
}
export default createReducer;
// src/reducer/index.js
import createReducer from "./createReducer.js" // 创建 生成reducer函数 
import {counterInit} from "./initState"// 初始化 state
import {add,decrease} from "./common.js"  // 初始化函数库
import createReducer  from  "./createReducer"
let reducer=createReducer(stateInit,{add,decrease}) // 创建一个reducer 函数对象
export default reducer;
// src/app.js
import reducer from "./reducer"
let store =createStore(reducer);

优化7: 多人开发篇
如果是多人开发的话 每个人都有自己的 initState 如果这个时候我们在创建一个 reducer函数明显不够用的
这个时候要引入的一个新的东西 combineReducers
假设 我们现在 有俩个 童鞋 一个 a童鞋 一个 b童鞋
a童鞋的reducer 函数

// src/reducer/a.js
import createReducer from "./createReducer.js" // 创建 生成reducer函数 
import {counterInit} from "./initState"// 初始化 state
import {add,decrease} from "./common.js"  // 函数库
import createReducer  from  "./createReducer"
let a=createReducer(stateInit,{******}) // 创建一个reducer 函数对象
export default a;

b童鞋的reducer函数

// src/reducer/b.js
import createReducer from "./createReducer.js" // 创建 生成reducer函数 
import {counterInit} from "./initState"// 初始化 state
import {add,decrease} from "./common.js"  // 函数库
import createReducer  from  "./createReducer"
let b=createReducer(stateInit,{******}) // 创建一个reducer 函数对象
export default b;
// src/reducer/index.js
import {combineReducers} from "redux"
import a from "./a.js"
import b from "./b.js"
export default combineReducers({
    a,b
})

使用的时候
a童鞋的数据 store.getState().a
b童鞋的数据 store.getState().b
// 如果是俩个童鞋定义的方法名一样话 俩者不会冲突报错 会同时执行俩者的操作
好了 到这里暂时就结束了 以后有新的东西 我会继续新增的

发布了236 篇原创文章 · 获赞 80 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yunchong_zhao/article/details/104938142