123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- <header>cart reducer</header>
- <body>
- <div id="testDiv">
- Test
- </div>
- <script>
- function cartReducer(state = {}, action) {
- switch (action.type) {
- case 'CART_ADD':
- if (action.count >= 0) {
- let newState = { ...state };
- let { count } = state[action.good._id] ?? { count: 0 };
- newState[action.good._id] = { count: action.count + count, good: { ...action.good } }
- return newState;
- }
- case 'CART_SUB':
- if (action.count >= 0) {
- let newState = { ...state };
- let { count } = state[action.good._id] ?? { count: 0 };
- if (count >= action.count) {
- newState[action.good._id] = { count: action.count - count, good: { ...action.good } }
- return newState;
- }
- }
- break;
- case 'CART_DEL':
- {
- let newState = { ...state };
- delete newState[action.good._id];
- return newState;
- }
- case 'CART_SET':
- {
- let newState = { ...state };
- newState[action.good._id] = { count: action.count, good: { ...action.good } };
- return newState;
- }
- case 'CART_CLEAR':
- return {};
- }
- return state;
- }
- function createStore(reducer) {
- let state = reducer(undefined, {})
- let cbs = []
- const getState = () => state
- const subscribe = cb => (cbs.push(cb),
- () => cbs = cbs.filter(c => c !== cb))
- function dispatch(action) {
- if (typeof action === 'function') {
- return action(dispatch, getState)
- }
- const newState = reducer(state, action)
- if (newState !== state) {
- state = newState
- for (let cb of cbs) cb()
- }
- }
- return {
- getState,
- dispatch,
- subscribe
- }
- }
- const actionCartAdd = (good, count = 1) => ({ type: 'CART_ADD', count: count, good: good });
- const actionCartSub = (good, count = 1) => ({ type: 'CART_SUB', count, good });
- const actionCartDel = (good) => ({ type: 'CART_DEL', good });
- const actionCartSet = (good, count = 1) => ({ type: 'CART_SET', count, good });
- const actionCartClear = () => ({ type: 'CART_CLEAR' });
- const store = createStore(cartReducer)
- store.subscribe(() => {
- console.log(store.getState())
- });
- store.dispatch(actionCartAdd({ _id: 'пиво', price: 50 }))
-
- store.dispatch(actionCartAdd({ _id: 'чипсы', price: 75 }))
-
-
-
-
- store.dispatch(actionCartAdd({ _id: 'пиво', price: 50 }, 5))
-
-
-
-
- store.dispatch(actionCartSet({ _id: 'чипсы', price: 75 }, 2))
-
-
-
-
- store.dispatch(actionCartSub({ _id: 'пиво', price: 50 }, 4))
-
-
-
-
- store.dispatch(actionCartDel({ _id: 'чипсы', price: 75 }))
-
-
-
- store.dispatch(actionCartClear())
- </script>
- </body>
|