redux实现

面试之redux的实现

为啥使用redux略过…

demo地址

一般项目中使用redux时,会和react-redux配合使用,如果不使用react-redux时,redux也可以单独工作,使用react-redux会简化一些操作

reudx包暴露了几个方法

  • createStore
  • combineReducer
  • applyMiddleware
  • bindActionCreators

createStore

其中createStore是其中的核心方法,只使用其中一个就可以单独使用

根据上面的使用流程可以实现以下方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function createStore(reducer, prePayload) {

let currentState = prePayload;
let listeners = [];

function getState() {
return currentState;
}

function dispatch(action) {
currentState = reducer(currentState, action);

for(let i = 0; i < listeners.length; i++) {
listeners[i]();
}
}

function subscribe(func) {
let isSubscribed = false;

if (typeof func === 'function') {
if (!listeners.includes(func)) {
listeners.push(func);
isSubscribed = true;
}
}

return function unSubscribe() {
if (!isSubscribed) {
return;
}

let index = listeners.indexOf(func);
listeners.splice(index, 1);
}
}

dispatch({type: 'INIT'});

return {
getState,
dispatch,
subscribe,
}
}

combineReducer

这个函数的意义是可以整合reducer函数,这样可以方便分模块定义redux
实现原理就是定义一个顶级对象,使用key来区分(key是传入combineReducers的对象的key),当派发一个action时,循环所有的reducer函数,更新所有的模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
export default function combineReducers(reducers) {
const reducerKeys = Object.keys(reducers);

return function combine(state = {}, action) {

let nextState = {};
let isChanged = false;

for(let i = 0; i < reducerKeys.length; i++) {
let key = reducerKeys[i];
let reducer = reducers[key];
let stateForKey = state[key];

nextState[key] = reducer(stateForKey, action);
isChanged = isChanged || nextState !== state;
}

return isChanged ? nextState : state;
}
}
avatar

changzhn`s blog

中国人睡觉时,美国人大多数人在工作