Vuex —— 状态管理 | Module

2023-09-22 09:06:01

         在前面讲到了关于Vuex数据状态管理的内容,讲了Vuex的五大核心属性,在这五大核心属性中就 state、mutation 和 actions 在前面介绍 Vuex 状态管理和讲 Vuex 中的同步和异步操作已经比较熟悉了,getter 是基于state 的计算属性,vue 中 computed从data中派生出的计算属性, vuex中 getter是从state中派生出的属性,对于getter的使用还是比较简单的,那么本篇主要来讲关于这最后一个核心属性 —— Module .

        创建项目之后在 /store/index.js 文件后,将之前编写获取swiperList的操作放进入之后:

import Vue from 'vue'
import Vuex from 'vuex'
import { reqSwiperList } from '@/api'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    swiperList: [] // swiperList-轮播列表
  },
  getters: {

  },
  actions: {
    async getSwiperList (store) {
      const result = await reqSwiperList()
      console.log(result)
      if (result.meta.status === 200) {
        const data = result.data.swiperList
        store.commit('receive_SwiperList', data)
      }
    }
  },
  mutations: {
    receive_SwiperList (state, data) {
      state.swiperList = data
    }
  },
  modules: {

  }
})

        设想一下假设项目中还有其他模块内容,这些模块内容在编写上还是相信你可以完成而且排序整齐,但项目完成会发现这个index.js的文件太大了且可维护性差,项目的开发是一个团队的事情,而且负责的模块内容也需要编写到这里,团队成员的合作就会产生一些冲突,使用 Vuex 状态管理的本意是让团队的协助会变得方便且后期维护起来方便,但现在仅仅将所有的内容放置在index.js 下就不合理,所以就需要将内容分为模块(module),最后将模块在index.js进行管理!

        下面来进行模块(Module)的引入使用:

Module 

        上面编写的是一个获取swiperList(轮播)数据,现在它是分到了项目中的首页去展示的,那么就来创建一下首页模块:

        创建 /store/Module 文件夹来存放各模块内容,并在该文件目录下创建 HomeModule.js 模块文件:

// store/Module/HomeModule.js

/* 首页数据状态管理模块 */
import { reqSwiperList } from '@/api/index'

const module = {
  state: {
    swiperList: [] // swiperList-轮播列表
  },
  mutations: {
    receive_SwiperList (state, data) {
      state.swiperList = data
    }
  },
  actions: {
    async getSwiperList (store) {
      const result = await reqSwiperList()
      console.log(result)
      if (result.meta.status === 200) {
        const data = result.data.swiperList
        store.commit('receive_SwiperList', data)
      }
    }
  }
}

export default module

        这个内容就是首页模块需要管理的数据状态了,那么还需要将它引入到 /store/index.js 的文件中去,如下:

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import HomeModule from '@/store/Module/HomeModule'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
    HomeModule
  }
})

        可以看到现在 /store/index.js 的文件中引入 modules: { HomeModule } 首页数据状态管理的模块,如果要引入其他的模块,例如:服务模块,在Module文件夹中创建服务模块ServiceModule.js后,编写需要管理的数据状态即可,接着将在/store/index.js文件中去引入该模块就好了,妙哉!

下面来测试运行一下是否成功:(实践是检验真理的唯一标准)

        通过 Devtools 拓展工具就可以看到加载了HomeModule模块以及有对应模块的state数据状态管理,到这一步是不是隐隐约约有个老头撅个嘴说 "Nice!!!" 别急,还有下一步呢!

        如果是上一篇目到达此地,可能就说,视图怎么没更新?

        不应该是如下面这般的吗?

        就挺秃然的是吧,那下面就来讲怎么让它出来好吧!

渲染视图

        Vuex状态模式改变了,对应的渲染视图操作也需要调整;首先先来打开命名空间:

namespace 命名空间

        在编写的模块当中添加一个namespace属性,属性值为true!

// store/Module/HomeModule.js

/* 首页数据状态管理模块 */
import { reqSwiperList } from '@/api/index'

const module = {
  // 命名空间
  namespace: true,
  state: {
    swiperList: [] // swiperList-轮播列表
  },
...

mapState 映射状态

        那么就来到首页页面MusicView.vue中来导入vuex,通过 mapState 来映射状态,那么现在在mounted生命周期打印一下,使用 mapState 来将 HomeModule 模块中 state.swiperList 进行切割出来;

mapState('模块名称',[切割内容])

注:使用数组[ ] 是因为在模块中的state中的数据状态不止一个,比如有swiperList,可能还有navList 等这些其他数据状态;

<!--MusicView.vue-->
...
<script>
import { mapState } from 'vuex'
export default {
  mounted () {
    console.log(mapState('HomeModule', ['swiperList']))
  },
...

        可以知道拿到的是一个对象,怎么来使用呢?那么在这个对象中呢有这样一个方法供你在计算属性当中来使用;在 第十六篇 Computed 计算属性的应用 中就讲过了计算属性的使用,举一个简单的例子:computed:{ sum(){ return ... } } ,在页面中直接把 sum 拿过来用就可以了对吧,那么现在就是去展开这个对象,然后将它取出来用!

... mapState()

        在计算属性中通过三个点 ' ... ' 就可以展开一个数组或是一个对象(ES6语法),如下:

         通过以上的讲解你就知道这块 ...mapState('HomeModule',['swiperList']) 是什么了,就是展开切割出来的对象,这对象就是映射该模块的所要取的状态;现在来计算属性中展开:

...
<script>
import { mapState } from 'vuex'
export default {
  computed: {
    ...mapState('HomeModule', ['swiperList'])
  },

  mounted () {
    console.log(mapState('HomeModule', ['swiperList']))
  },
...

        依然没有视图,打开控制台出现这一句(心想:"真的要奔溃啦"):

         同理,mapState 将状态映射出来,同理,这里也需要将 actions 的方法进行映射出来这个模块的方法 getSwiperList ;

...mapActions

        将mapActions引入之后,通过在methods中将方法进行映射;

...
<button @click="getSwiperList">同步获取swiperList数据</button>
...
<script>
import { mapActions, mapState } from 'vuex'
export default {
  computed: {
    ...mapState('HomeModule', ['swiperList'])
  },
  methods: {
    ...mapActions('HomeModule', ['getSwiperList']),
    // 按钮事件
    getSwiperList () {
      // 通过dispatch触发actions调用
      this.$store.dispatch('getSwiperList')
    }
  }
...

        别急,现在已经将 getSwiperList 方法引入了,就不需要通过this.$store.dispatch()来调用函数了,直接调用该函数就可以了;[ 注:把按钮的触发事件名称修改一下,避免冲突 ]

<button @click="getSwiperData">同步获取swiperList数据</button>
...
methods: {
    // 按钮事件
    getSwiperData () {
      // 通过dispatch触发actions调用
      this.getSwiperList()
    }
}

现在来测试一下代码:在页面使用v-for做渲染的时候,也不需要使用 this.$store.state.swiperList 

通过 mapState 映射状态可以直接使用 swiperList 即可!

<template>
    <div>
        <h3>分享音乐社区</h3>
        <router-link to="/music/kugou" active-class="chosen_cl"><li>分享酷狗Music</li></router-link>
        <router-link to="/music/kuwo" active-class="chosen_cl"><li>分享酷我Music</li></router-link>
        <router-view></router-view>
        <button @click="getSwiperData">同步获取swiperList数据</button>
        <li v-for="item in swiperList" :key="item.goods_id">
          <img :src="item.imgUrl" alt="">
        </li>
    </div>
</template>

<script>
import { mapActions, mapState } from 'vuex'
export default {
  computed: {
    ...mapState('HomeModule', ['swiperList'])
  },
  methods: {
    ...mapActions('HomeModule', ['getSwiperList']),
    // 按钮事件
    getSwiperData () {
      // 通过dispatch触发actions调用
      // this.$store.dispatch('getSwiperList')
      this.getSwiperList()
    }
  }
}
</script>

<style lang="scss">
  .chosen_cl{
    color:skyblue;
    font-weight: bold;
  }
  img{
    width: 200px;
  }
</style>

        本篇目讲到这里就已然结束了,在此关于对Vuex的数据状态管理有了一个比较充分的认识,对Vuex中的五大核心属性也有了了解,在之后的项目开发中可以尝试着使用Vuex数据状态管理的模式来开发项目,希望本篇能助你在项目开发这条路上的起初是一块垫脚石!感谢大家的支持!

更多推荐

【ONE·Linux || 进程间通信】

总言进程间通信:简述进程间通信,介绍一些通信方式,管道通信(匿名、名命)、共享内存等。文章目录总言1、进程间通信简述2、管道2.1、简介2.2、匿名管道2.2.1、匿名管道的原理2.2.2、编码理解:用fork来共享管道2.2.2.1、准备工作一:创建一个管道pipe2.2.2.2、准备工作二:创建子进程,对父子进程构

【Linux 应用】 kworker 进程

1.简介“kworker”是Linux内核的工作线程,用于异步处理工作队列中的任务。这些任务包括处理硬件中断、文件系统事件、管理系统内存等。你可能会看到多个kworker进程,每个进程的名称后面都有一个数字,如“kworker/0:1”、“kworker/1:2”等。这个数字表示了kworker是在哪个CPU核心上运行

2023华为杯研究生数学建模竞赛E题思路分析+代码+论文

如下为C君撰写的2023华为杯研究生数学建模竞赛E题思路分析,代码论文见文末。E题思路出血性脑卒中临床智能诊疗建模一、背景介绍出血性脑卒中指非外伤性脑实质内血管破裂引起的脑出血,占全部脑卒中发病率的10-15%。其病因复杂,通常因脑动脉瘤破裂、脑动脉异常等因素,导致血液从破裂的血管涌入脑组织,从而造成脑部机械性损伤,并

数据通信网络之IPv6以太网多层交换

文章及资源归档至【AIShareLab】,回复通信系统与网络可获取。文章目录一、目的二、环境及网络拓扑三、需求四、步骤一、目的掌握VLAN的基础配置。掌握Trunk的基础配置。掌握VLANIF的基础配置,并理解通过三层交换机实现VLAN之间通信的方案。二、环境及网络拓扑本实验模拟一个典型的简单园区网络,如图1所示,其中

半导体CIM系统中的EAP:提升制造效率的关键

半导体制造是高度复杂和技术密集型的行业,对生产效率和产品质量有着极高的要求。在这个领域,设备自动化编程系统(EquipmentAutomationProgramming,EAP)已经崭露头角,成为提升制造效率的关键要素。本文将深入探讨EAP在半导体CIM系统(制造执行系统)中的作用,以及它如何显著提高制造效率的关键作用

【C++】String类基本接口介绍及模拟实现(多看英文文档)

string目录如果你很赶时间,那么就直接看我本标题下的内容即可!!一、STL简介1.1什么是STL1.2STL版本1.3STL六大组件1.4STL重要性1.5如何学习STL二、什么是string??(本质上是一个类)三、string的类模板(什么?string居然利用了模板??)三、string的三种构造(拷贝构造也

批处理小程序的制作

一、介绍批处理是一种将一系列计算机任务按照预定义的顺序进行自动化处理的技术。它是通过批处理脚本或命令文件来实现的,可以在不需要人工干预的情况下,批量运行多个命令或程序。批处理脚本的优点1.自动化:批处理可以自动执行重复性任务,无需手动干预,减少人力和时间成本。2.批量处理:批处理可以同时处理多个任务,提高工作效率。3.

Kotlin 中的协程 flow

一、Flow概述Flow具有异步挂起suspend响应式编程,可以使用挂起函数来异步生产和消费事件,Flow的设计灵感也来源于响应式流以及其各种实现。二、Flow的生产和消费suspendfuntest1(){flow<Int>{(0..4).forEach{emit(it)//生产者发送数据}}.collect{pr

群晖linux ——设置短密码、免密码登录、多个群晖免密登录

文章目录概述群晖设置超短密码获取root权限设置新密码/更改密码群晖SSH公钥免密登录开启家目录修改文件夹权限修改配置文件上传公钥高级——多个群晖,不同密钥解决方法概述群晖仅在内网运行,外网无法访问。每次输入长密码不方便。但是群晖WEB端无法设置短密码,一番搜索过后,发现可以通过SSH的方式设计短密码。具体步骤如下。群

勒索病毒最新变种.Elbie勒索病毒来袭,如何恢复受感染的数据?

引言:随着数字化的快速发展,网络安全威胁也变得越来越严重。其中,.Elbie勒索病毒是一种备受恶意分子钟爱的危险工具,它可以加密您的数据文件,然后勒索高额赎金。本文将深入探讨.Elbie勒索病毒的威胁,包括其工作原理、如何恢复被其加密的数据文件,以及有效的预防措施,以保护您的数据免受损失。如果您在面对被勒索病毒攻击导致

Kettle REST Client获取token调用接口解析JSON入文件实战

KettleRESTClient通过GET获取token以POST方式请求接口解析JSON入文件完整实例需求说明通过kettle组件调用接口并解析JSON成结构化数据入文件。完整实例解决方法利用生成记录组件定义URL参数通过RESTClENT组件请求得到TOKEN通过JSONINPUT组件解析接口请求的结果通过JAVA

热文推荐