多实例

允许创建多实例,各store实例彼此互相独立,状态互不干扰,不需要考虑命名空间的问题,而且可以随时动态创建一个新的store,更灵活且移植性更高。相对较于modules,更推荐多实例模式

联合多个store实例

如果需要使用外部store的数据,mpx 也提供的createStore支持传入deps参数,表示注入的外部store。在store内部访问外部store的资源使用如下方式(都是加namespace形式的path访问模式)。由于注入store的各部分(state, getters, mutations, actions)是 以key作为namespace merge在options对应属性内部的,所以deps的key要防止冲突

基础例子

例子:

  1. import {createStore} from '@mpxjs/core'
  2. const store1 = createStore({
  3. state: {
  4. a: 1
  5. },
  6. getters: {
  7. getA(state) {
  8. return state.a
  9. }
  10. },
  11. mutations: {
  12. setA(state, payload) {
  13. state.a = payload
  14. }
  15. },
  16. actions: {
  17. actionA({commit}, payload) {
  18. commit('setA', payload)
  19. }
  20. }
  21. })
  22. const store2 = createStore({
  23. state: {
  24. b: 1
  25. },
  26. getters: {
  27. getB(state, getters) {
  28. // 访问外部store1的数据,按路径访问
  29. return state.b + state.store1.a + getters.store1.getA
  30. }
  31. },
  32. mutations: {
  33. setB(state, payload) {
  34. state.b = payload
  35. }
  36. },
  37. actions: {
  38. actionB({dispatch, commit}, payload) {
  39. // 同理,mutations、actions访问外部store1的方法时,也是按路径访问
  40. commit('store1.setA', payload)
  41. dispatch('store1.actionA', payload)
  42. commit('setB', payload)
  43. }
  44. },
  45. deps: {
  46. store1
  47. }
  48. })
  49. export {store1, store2}

多store注入下的’store.mapGetters、store.mapMuations、store.mapActions’

  1. import {createStore, createComponent} from '@mpxjs/core'
  2. const store1 = createStore({
  3. state: {
  4. a: 1
  5. },
  6. getters: {
  7. getA(state, getters) {
  8. return state.b + state.store1.a + getters.store1.getA
  9. }
  10. },
  11. mutations: {
  12. setA(state, payload) {
  13. state.a = payload
  14. }
  15. },
  16. actions: {
  17. actionA({commit}, payload) {
  18. commit('setA', payload)
  19. }
  20. }
  21. })
  22. const store2 = createStore({
  23. state: {
  24. b: 1
  25. },
  26. getters: {
  27. getB(state) {
  28. return state.b + state.store1.a
  29. }
  30. },
  31. mutations: {
  32. setB(state, payload) {
  33. state.b = payload
  34. }
  35. },
  36. actions: {
  37. actionB({dispatch, commit}, payload) {
  38. commit('store1.setA', payload)
  39. dispatch('store1.actionA', payload)
  40. commit('setB', payload)
  41. }
  42. },
  43. deps: {
  44. // xx: store1
  45. store1
  46. }
  47. })
  48. // 组件内部使用store
  49. createComponent({
  50. computed: {
  51. ...store2.mapGetters(['getB']),
  52. // 对于依赖store1的引入,可以使用以下两种方式,类似的mapMutations、mapActions, mapState
  53. ...store2.mapgetters({
  54. getA: 'store1.getA'
  55. }),
  56. ...store2.mapGetters('store1', ['getA'])
  57. }
  58. })