Store.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import { applyMiddleware, compose, createStore, combineReducers } from 'redux';
  2. import thunk from 'redux-thunk';
  3. import { STORE_REPLACE } from './Constant';
  4. function getReducers(stores) {
  5. const reducers = {};
  6. stores.forEach(item => {
  7. if (reducers[item.key]) return;
  8. reducers[item.key] = item.handle.bind(item);
  9. });
  10. return reducers;
  11. }
  12. function initReducers(stores, project, services) {
  13. const map = {};
  14. stores.forEach(item => {
  15. if (map[item.key]) return;
  16. map[item.key] = true;
  17. item.init.bind(item)(project, services);
  18. });
  19. }
  20. function setReducersStore(store, stores) {
  21. const map = {};
  22. stores.forEach(item => {
  23. if (map[item.key]) return;
  24. map[item.key] = true;
  25. item.setStore.bind(item)(store);
  26. });
  27. }
  28. // redux 基本配置
  29. export function initStore(initState, stores, project, services) {
  30. initReducers(stores, project, services);
  31. const middleware = [thunk];
  32. const composeEnhancers = __DEBUG__ ? window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose : compose;
  33. const cr = combineReducers(getReducers(stores));
  34. const ce = composeEnhancers(applyMiddleware(...middleware));
  35. const store = createStore(cr, initState, ce);
  36. setReducersStore(store, stores);
  37. return store;
  38. }
  39. export function refreshStore(store, stores, project, services) {
  40. initReducers(stores, project, services);
  41. store.replaceReducer(combineReducers(getReducers(stores)));
  42. setReducersStore(store, stores);
  43. store.dispatch({ type: STORE_REPLACE });
  44. }