vuex modules

叁歲伎倆 2021-07-24 15:28 463阅读 0赞
  1. export default new Vuex.Store({
  2. //存储数据
  3. state:{
  4. },
  5. //方法
  6. mutations:{
  7. },
  8. //计算属性
  9. getters:{
  10. },
  11. //异步方法,(如ajax)
  12. actions:{
  13. },
  14. //模块
  15. modules:{
  16. 可以存放其他store
  17. 格式为:
  18. (1)名称:{state:{xx},mutations:{xx},getters:{xx},actions:{xx}}
  19. 其中:
  20. 模块的actions.js函数中
  21. function({rootState}){xxx} 可以使用rootState访问根结点的state
  22. 模块的getters.js函数中
  23. function({state, getters, rootState}){xxx} 第三个参使访问根节点的state
  24. 若为mod文件
  25. (1)文件中export default{state:{xx},mutations:{xx},getters:{xx},actions:{xx}}
  26. 在组件中调用:
  27. 不使用命名空间(即模块还有一个属性:namespaced: true,);
  28. 第一种:
  29. state: $store.state.模块名.键名
  30. getters:$store.getters('方法名')
  31. actions:$store.dispatch('方法名')
  32. mutations:$store.commit('方法名')
  33. (1)引入辅助函数
  34. import {mapState,mapActions,mapGetters,mapMutations} from 'vuex'
  35. 获取模块内的
  36. state:computed:{...mapState(['模块名'])}; 模块名.键名调用
  37. 或者采用带有命名空间的state写法
  38. getters:computed:{...mapGetters(['函数名',...])}
  39. mutations:methods:{...mapMutations(['函数名',...])}
  40. actions:methods:{...mapActions(['函数名',...])}
  41. 使用命名空间(即模块还有一个属性:namespaced: true,);
  42. 方式一:
  43. 调用基础上加上当前模块名
  44. 如调用mutations:this.$store.commit('当前模块名/方法名')
  45. 辅助函数
  46. getters:computed:{...mapGetters('模块名',['模块的函数名',...])}
  47. mutations:methods:{...mapMutations('模块名',['函数名',...])}
  48. actions:methods:{...mapActions('模块名',['函数名',...])}
  49. state:computed:{...mapState({
  50. 模块中的state属性名:state=>state.模块名.state属性名
  51. })};
  52. 方式二:
  53. import { createNamespacedHelpers } from 'vuex'
  54. const { mapState, mapActions,xx } = createNamespacedHelpers('模块名')
  55. 辅助函数
  56. getters:computed:{...mapGetters(['模块的函数名',...])}
  57. mutations:methods:{...mapMutations(['函数名',...])}
  58. actions:methods:{...mapActions(['函数名',...])}
  59. state:computed:{...mapState(['属性名'])}
  60. }
  61. })

代码示例:
store:

  1. import Vue from 'vue'
  2. import Vuex from 'vuex'
  3. import state from './state'
  4. import getters from './getters'
  5. import mutations from './mutations'
  6. import actions from './actions'
  7. import mod1 from './mod1'
  8. Vue.use(Vuex);
  9. //仓库对象,存放多组件共用数据
  10. export default new Vuex.Store({
  11. //data
  12. state:state,
  13. //methods,尽量在这里处理state中的状态
  14. mutations:mutations,
  15. //计算属性
  16. getters:getters,
  17. //异步方法(如ajax)
  18. actions:actions,
  19. //模块
  20. modules:{
  21. mod1
  22. }
  23. })

mod1:

  1. export default{
  2. state:{
  3. productNum:10
  4. },
  5. getters:{
  6. brief:function(state){
  7. return state.productNum+'件衣服';
  8. }
  9. },
  10. actions:{
  11. changeProNum(content){
  12. setTimeout(()=>{
  13. content.commit('addProNum');
  14. },1000)
  15. }
  16. },
  17. mutations:{
  18. addProNum(state){
  19. return state.productNum++;
  20. }
  21. }
  22. }

组件:

  1. <template>
  2. <div>
  3. <h1>{ { $store.state.mod1.productNum}}</h1>
  4. <h2>{ { mod1.productNum}}</h2>
  5. <h3>{ { brief}}</h3>
  6. <h4>{ { addProNum}}</h4>
  7. <button @click='changeProNum'>点击获取</button>
  8. </div>
  9. </template>
  10. <script>
  11. import { mapState,mapActions,mapGetters,mapMutations} from 'vuex'
  12. //获取模块state内容
  13. let mapStateObj=mapState(['mod1'])
  14. //获取模块getters内容
  15. let mapGettersObj=mapGetters(['brief'])
  16. let mapMutationsObj=mapMutations(['addProNum'])
  17. let mapActionsObj=mapActions(['changeProNum']);
  18. export default{
  19. name:'A',
  20. data()
  21. {
  22. return{
  23. count:0
  24. }
  25. },
  26. methods:{
  27. },
  28. computed:{
  29. ...mapStateObj,
  30. ...mapGettersObj,
  31. ...mapMutationsObj,
  32. },
  33. mounted()
  34. {
  35. console.log(this);
  36. },
  37. methods:{
  38. ...mapActionsObj
  39. }
  40. }
  41. </script>
  42. <style>
  43. </style>

发表评论

表情:
评论列表 (有 0 条评论,463人围观)

还没有评论,来说两句吧...

相关阅读