详解vuex之store拆分即多模块状态管理(modules)篇

了解vuex的朋友都知道它是vue用来集中管理状态的容器,如果了解过Reduce的朋友可能看见他时就会非常熟悉,都是用来管理全局的状态的,实现不同组件之间相互的数据访问。这里我们不介绍vuex,主要介绍vuex拆分store以及多模块管理。我们知道如果一个项目非常大的话状态就会非常的多,如果不进行分类处理,所有的状态都维护在一个state里面的话,状态管理就会变得非常的混乱,这样非常不利于项目的后期维护。我们现在前端推崇模块化开发,为的就是提高开发效率和维护效率,避免重复工作。那么vuex是怎么样解决这个问题的呢?这个时候我们今天要讲的主角modules就要闪亮登场了。
其实这个用起来是非常简单的,正常情况下,我们在用vuex的时候我们是这样定义的:

states.js //保存应用的状态值

?

1

2

3

export default {

  bookList:["西游记","水浒传","红楼梦","三国演义"]

}

mutations.js //在这个文件中定义对状态值的操作,增删改查。

?

1

2

3

4

5

6

7

8

export default {//这里要注意不要在mutations里面进行异步操作

  ADD_BOOK(state,book){

    state.bookList.push(book);

    return true;

  },

  DELETE_BOOK(state,id){

  }

}

getters.js //将我们在states中定义的值暴露在store.getters对象中,便于我们在组件中可以通过store.getters对象中,便于我们在组件中可以通过store.getters.bookList访问数据

?

1

2

3

4

5

export default {

  bookList:function(state){

    return state.bookList;

  }

}

actions.js //其实这里定义的方法只是将mutation.js中定义的方法进行了一次封装,就是去触发mutations.js中的方法。如果传如的参数需要异步获取的话,我们可以在这里等待异步返回成功后在触发mutations中的方法。在组件中这两个文件定义的方法都可以直接调用,mutations中定义的方法是通过store.dispath(′ADDBOOK′,book)调用的,而actons定义的方法是通过store.dispath(′ADDBOOK′,book)调用的,而actons定义的方法是通过store.commit(‘ADD_BOOK',book),调用的。

?

1

2

3

4

5

6

7

8

export default {//在action中可以进行异步操作。

  add_book({commit},book){

   commit('ADD_BOOK',book);

  },

  delete_book({commit},book){

   commit('DELETE_BOOK',id);

  }

}

这里有时我们还可能会看见一个文件叫mutations_type.js其实这个文件定义的是mutations中的方法名,我自己在用的时候反正没定义这个文件,自己看着办如果喜欢你就定义上。

上面定义的文件定义好了之后,我们就可以将我们定义的这些对象加入到vuex的Store中去了
store.js

?

1

2

3

4

5

6

7

8

9

10

11

12

13

import vue from 'vue'

import vuex from 'vuex'

import states from './state.js'

import mutatons from './mutations.js'

import actons from './actions.js'

import getters from './getters'

vue.use(vuex);

export default new vuex.Store({

          ststes,

          mutatons,

          getters,

          actions

         });

这样我们就写完整了一个store了。我们可以看出这里我们只有一个总模块,那如果我们要将总模块拆分成几个小模块,那应该怎样定义呢?

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import vue from 'vue'

import vuex from 'vuex'

import states from './state.js'

import mutatons from './mutations.js'

import actons from './actions.js'

import getters from './getters'

vue.use(vuex);

export default new vuex.Store({

                modules:{

                     mod1:{

                        states,

                        mutatons,

                        getters,

                        actions

                        },

                     mod2:{}

                  }

         });

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

import vue from 'vue'

import vuex from 'vuex'

import states from './state.js'

import mutatons from './mutations.js'

import actons from './actions.js'

import getters from './getters'

vue.use(vuex);

export default new vuex.Store({

                modules:{

                    mod1:{states,

                       mutatons,

                       getters,

                       actions

                      },

                    mod2:{}

                  }

         });

我自己在做项目的时候我一般将一个子模块的state,mutations,actions,getter写在一个文件中如:

mod1.js

?

1

2

3

4

5

6

export default {

  state:{},

  mutatons:{},

  actions:{},

  getters:{}

}

mod2.js

?

1

2

3

4

5

6

export default {

  state:{},

  mutatons:{},

  actions:{},

  getters:{}

}

然后在将几个mod合并到store中去:

?

1

2

3

4

5

6

7

8

9

10

11

import vue from 'vue'

import vuex from 'vuex'

import mod1 from './mod1.js'

import mod2 from './mod2.js'

vue.use(vuex);

export default new vuex.Store({

                    modules:{

                          mod1:mod1,

                          mod2:mod1

                  }

         });

我感觉这样写的话代码结构更加直观,清晰。而且正常的话一个子模块一般不会有太多的状态和方法。当然如果项目中子模块的状态和方法确实太多,我们还是推荐将state,actions,getters,mutations单独写在不同的文件中,然后将不同的子模块的这些文件放在一个文件夹中,这样就代表一个子状态管理模块。

通过将总的store拆分过后,我们在状态管理和维护的时候就更加清晰了。

在创建出store后,我们需要将store挂载到vue上去

?

1

2

3

4

5

6

import vue from 'vue'

import store from './store'

var vue = new Vue({

 store,

 ····

}).$mount("#app")

之后在组建中就可以使用和管理前面定义的状态了,

?

1

2

3

4

5

6

7

8

9

10

11

12

13

<template>

</template>

<script>

  export default{

       computed{

              bookList:this.$store.mod1.bookList,

       },

       methods:{

             addBook:book=>this.$store.mod1.commit('ADD_BOOK',book);//这里需要注意,如果你是用了子模块的这种方法你需要加上模块名这是mod1,如果没有就不需要加。

             deleteBook:id=>this.$store.mod1.disaptch('DELETE_BOOK',id);

    }   

  }

</script>

总结:

将store进行拆分,有利于我们更好的管理项目中的状态,以及使我们的项目维护更加加单高效。各个模块之间的开发互相不影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值