当前位置: 首页 > news >正文

Vue vuex模块化编码

一、模块化+命名空间

        1.目的:让代码更好维护,让多种数据分类更加明确。

        2.修改store.js

        const countAbout = {

                namespaced:true,//开启命名空间

                state:{x:1},

                mutations: { ... },

                actions: { ... },

                getters: {

                        bigSum(state){

                                return state.sum * 10

                        }

                }

        }

        const personAbout = {

                namespaced:true,//开启命名空间

                state:{ ... },

                mutations: { ... },

                actions: { ... }

        }

        const store = new Vuex.Store({

                modules: {

                        countAbout,

                        personAbout

                }

         })

        3.开启命名空间后,组件中读取state数据:

        //方式一:自己直接读取

        this.$store.state.personAbout.list

        //方式二:借助mapState读取

        ...mapState('countAbout',['sum','school','subject']),

        4. 开启命名空间后,组件中读取getters数据:

        //方式一:自己直接读取

        this.$store.getters['personAbout/firstPersonName']

        //方式二:借助mapGetters读取

        ...mapGetters('countAbout',['bigSum'])

        5.开启命名空间后,组件中调用dispatch

        //方式一:自己直接dispatch
this.$store.dispatch('personAbout/addPersonWang',person)
//方式二:借助mapActions:
...mapActions('countAbout',{incrementOdd:'incrementOdd',incrementWait:'incrementWait'})

         6.开启命名空间后,组件中调用commit

        //方式一:自己直接commit
this.$store.commit('personAbout/PERSON_ADD',person)
//方式二:借助mapMutations:
...mapMutations('countAbout',{increment:'INCREMENT',decrement:'DECREMENT'}),

二、代码实现

        将求和相关配置写入countAbout.js中。

export default {namespaced:true,actions:{incrementOdd(context,value){if(context.state.sum % 2)context.commit('INCREMENTODD',value)},incrementWait(context,value){setTimeout(() => {context.commit('INCREMENTWAIT',value)}, 500);}},mutations:{INCREMENT(state,value){state.sum +=value},DECREMENT(state,value){state.sum -=value},INCREMENTODD(state,value){state.sum +=value},INCREMENTWAIT(state,value){state.sum +=value},},state:{sum:0,school:'清华大学',subject:'Vue',},getters:{bigSum(state){return state.sum*10}}
}

        将求和相关配置写入personAbout.js中。

import axios from 'axios'
import { nanoid } from 'nanoid'export default {namespaced:true,actions:{personAddWang(context,value){if(value.name.indexOf('王') === 0){context.commit('PERSON_ADD',value)}else{alert('请添加姓王的人')}},personAddServer(context){axios.get('https://www.openapijs.com/api/random').then(Response=>{context.commit('PERSON_ADD',{id:nanoid(),name:Response.data.data.poems.autho})},Error=>{alert(Error.message)})}},mutations:{PERSON_ADD(state,value){state.personList.unshift(value)}},state:{personList:[{id:'001',name:'张三'}]},getters:{firstPersonName(state){return state.personList[0].name}}
}

        将countAbout和personAbout引入index.js中。

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
import countAbout from './countAbout'
import personAbout from './personAbout'//应用Vuex插件
Vue.use(Vuex)//创建并暴露store
export default new Vuex.Store({modules:{countAbout,personAbout}
})

        模块化后,在vue文件中不同的引用方法,在Count.js中使用map引用:

<template><div class="main"><h1>这门课是{{ school }}的{{ subject }}课程</h1><h2>当前求和为:{{ sum }}</h2><h3>当前求和放大十倍为:{{ bigSum }}</h3><h3 style="color: red;">当前人数为:{{ personList.length }}</h3><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="INCREMENT(n)">+</button><button @click="DECREMENT(n)">-</button><button @click="incrementOdd(n)">当前为奇数再加</button><button @click="incrementWait(n)">等会再加</button></div>
</template><script>import {mapState,mapGetters,mapMutations,mapActions} from 'vuex'export default {name:'Count',data() {return {n:1}},methods: {...mapMutations('countAbout',['INCREMENT','DECREMENT']),...mapActions('countAbout',['incrementOdd','incrementWait']),},computed:{...mapState('countAbout',['sum','school','subject']),...mapState('personAbout',['personList']),...mapGetters('countAbout',['bigSum'])}}
</script><style lang="less" scoped>button{margin-left: 5px;}
</style>

        在Person.js中使用手动引用:

<template><div><h2>人员列表</h2><h3 style="color: red;">Count组件的总和为:{{ sum }}</h3><h3>列表第一个人名为:{{ firstPersonName }}</h3><input type="text" v-model="person"><button @click="personAdd">点击添加</button><button @click="personAddWang">添加一个姓王的人</button><button @click="personAddServer">随机添加一个人</button><ul><li v-for="p in personList" :key="p.id">{{ p.name }}</li></ul></div>
</template><script>import { nanoid } from 'nanoid'export default {name:'Persons',data() {return {person:''}},methods: {personAdd(){const obj = {id:nanoid(),name:this.person}this.$store.commit('personAbout/PERSON_ADD',obj)this.person=''},personAddWang(){const obj = {id:nanoid(),name:this.person}this.$store.dispatch('personAbout/personAddWang',obj)this.person=''},personAddServer(){this.$store.dispatch('personAbout/personAddServer')}},computed:{personList(){return this.$store.state.personAbout.personList},sum(){return this.$store.state.countAbout.sum},firstPersonName(){return this.$store.getters['personAbout/firstPersonName']}}}
</script><style lang="less">ul{font-size: 18px;li{padding-top: 5px;}}
</style>
http://www.dtcms.com/a/300882.html

相关文章:

  • 网络资源模板--基于Android Studio 实现的新闻App
  • 自由学习记录(74)
  • 基于混沌系统的图像加密学习日志——论文学习3
  • unity3dTextMeshPro 设置中文字体,解决中文显示为框或中文字后面带背景颜色的问题
  • Unity SMAA
  • 三、搭建springCloudAlibaba2021.1版本分布式微服务-springcloud loadbalancer负载均衡
  • 习题综合练习
  • 自然语言处理NLP (1)
  • 【笔记】系统
  • 上位机知识篇---AJAX
  • MongoDB分片集群横向扩展
  • 2.qt调试日志输出
  • 区块链共识机制与联邦学习
  • 【C++】数字cmath库常用函数
  • 基于深度学习的图像分类:使用ShuffleNet实现高效分类
  • LeetCode 1577.数的平方等于两数乘积的方法数
  • day061-全网监控
  • 【科研绘图系列】R语言绘制边际云雨图散点图
  • 【unitrix】 6.17 基本非负整数( BaseUnsigned )特质(base_unsigned.rs)
  • 【笔记】拉乌尔定律推导
  • 获取电脑主板的 通用唯一标识符(UUID)
  • C++学习(线程相关)
  • Git+宝塔面板部署Hugo博客
  • 【橘子分布式】gRPC(番外篇-客户端重试机制)
  • 五自由度磁悬浮轴承转子不平衡振动破壁战:全息前馈控制实战密码
  • 【DataWhale】快乐学习大模型 | 202507,Task08笔记
  • STM32移植LVGL9.2.1教程
  • 视频转GIF工具,一键批量制作高清动图
  • CLAP文本-音频基础模型: LEARNING AUDIO CONCEPTS FROM NATURAL LANGUAGE SUPERVISION
  • 设计模式(四)创建型:生成器模式详解