多实例

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

多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', 'store1.getA'])
  52. },
  53. methods: {
  54. ...store2.mapMutations(['setB', 'store1.setA']),
  55. ...store2.mapActions(['actionB', 'store1.actionA'])
  56. }
  57. })