H
Size: a a a
H
B
B
H
B
B
B
H
B
H
B
H
H
В
let createStore = (reducer, initialState = {}, middlewares = []) => {
let state = initialState;
let subscribers = [];
let store = {
dispatch: (action) => {
next(store, middlewares, action);
},
getState: () => {
return state;
},
subscribe: (subscriber) => {
subscribers.push(subscriber);
}
};
let next = (store, middlewares, action) => {
let [ middleware, ...rest ] = middlewares;
if (middleware) {
middleware(store, (action) => next(store, rest, action), action);
} else {
let prevState = state;
state = reducer(state, action);
subscribers.forEach((subscriber) => subscriber(state, prevState));
}
};
return store;
};
let logger = (store, next, action) => {
console.log(action);
next(action);
};
let store = createStore(
(state, action) => {
switch (action.type) {
case 'ADD_ITEM': {
return {
...state,
items: [ ...state.items, action.payload ]
};
}
default: {
return state;
}
}
},
{items: []},
[logger]
);
store.subscribe(({items}) => console.log(items));
setTimeout(() => {
store.dispatch({
type: 'ADD_ITEM',
payload: {
id: 1,
value: 'Item 1'
}
});
}, 3000);
S
let createStore = (reducer, initialState = {}, middlewares = []) => {
let state = initialState;
let subscribers = [];
let store = {
dispatch: (action) => {
next(store, middlewares, action);
},
getState: () => {
return state;
},
subscribe: (subscriber) => {
subscribers.push(subscriber);
}
};
let next = (store, middlewares, action) => {
let [ middleware, ...rest ] = middlewares;
if (middleware) {
middleware(store, (action) => next(store, rest, action), action);
} else {
let prevState = state;
state = reducer(state, action);
subscribers.forEach((subscriber) => subscriber(state, prevState));
}
};
return store;
};
let logger = (store, next, action) => {
console.log(action);
next(action);
};
let store = createStore(
(state, action) => {
switch (action.type) {
case 'ADD_ITEM': {
return {
...state,
items: [ ...state.items, action.payload ]
};
}
default: {
return state;
}
}
},
{items: []},
[logger]
);
store.subscribe(({items}) => console.log(items));
setTimeout(() => {
store.dispatch({
type: 'ADD_ITEM',
payload: {
id: 1,
value: 'Item 1'
}
});
}, 3000);
H
B