Vuex —— 状态管理 | Module

news2025/2/26 23:06:47

         在前面讲到了关于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数据状态管理的模式来开发项目,希望本篇能助你在项目开发这条路上的起初是一块垫脚石!感谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030787.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用青龙面板实现阿里云盘每日签到

什么是青龙面板 ? 青龙面板 是支持 Python3、JavaScript、Shell、Typescript 的定时任务管理平台。 青龙面板从功能上看&#xff0c;和群晖的 计划任务 很像&#xff0c;都可以定时执行一个任务&#xff0c;并发送通知&#xff0c;只是青龙面板更强大一些。 安装 在群晖上以…

【校招VIP】测试计划之系统测试

考点介绍&#xff1a; 系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。测试重点是整个系统的运行以及与其他软件的兼容性。 测试计划之系统测试-相关题目及解析内容可点击文章末尾链接查看&#xff…

静力水准仪的安装方式

监测系统的安装 概括 初次安装监测系统时&#xff0c;需结合现场施工情况遵循先后主次的顺序操作&#xff0c;合理的规划安装顺序可避免安装过程的失误造成的返工&#xff1b; 正常顺序为&#xff1a; 1.确定测量基准点的位置和监测点的位置并作出标记&#xff1b; 2.对基…

引入ojdbc6 11.2.0.3版本

IntelliJ IDEA使用Maven导入一些依赖包&#xff0c;在pom.xml中引入ojdbc6 11.2.0.3版本一直失败&#xff0c;下载不了.jar文件 <dependency><groupId>com.oracle</groupId><artifactId>ojdbc6</artifactId><version>11.2.0.3</version…

【Linux】分布式版本控制工具git

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

Autosar模块介绍:Memory_1(模块概述)

上一篇 | 返回主目录 | 下一篇 Autosar模块介绍&#xff1a;Memory_1(模块概述 1 参考文献2 术语及缩写3 模块在架构中位置及作用 1 参考文献 [1] AUTOSAR_SWS_NVRAMManager.pdf [2] AUTOSAR_SRS_MemoryServices.pdf [3] AUTOSAR_SRS_MemoryHWAbstractionLayer.pdf [4] AUTOS…

dbeaver连sqlserver默认数据库

url:jdbc:sqlserver://localhost:1433

Pytorch-CNN-CIFAR10

文章目录 model.pymain.py运行图 model.py import torch.nn as nn import torch.nn.functional as F import torch.nn.init as init class CNN_cls(nn.Module):def __init__(self,in_dim):super(CNN_cls,self).__init__()self.conv1 nn.Conv2d(in_dim,32,1,1)self.pool1 nn.…

云原生微服务治理 第五章 Spring Cloud Netflix 之 Ribbon

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第四章 Spring Cloud Netflix 之 Ribbon 文章目录 系列文章目录[TOC](文章目录) 前言1、负载均衡1.1、服务端负载均衡1.2、…

JavaScript系列从入门到精通系列第五篇:JavaScript中的强制类型转换包含强制类型转换之Number,包含强制类型转换之String

文章目录 前言 一&#xff1a;强制类型转换 1&#xff1a;强制类型转换为String (一)&#xff1a;方式一&#xff1a;调用被转换类型的toString()方法 (二)&#xff1a;方式二&#xff1a;调用String函数 2&#xff1a;强制类型转换为Number (一)&#xff1a;方式一&…

【Proteus仿真】【STM32单片机】大棚远程监测控制

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 系统运行后&#xff0c;LCD1604显示传感器检测的环境温湿度、土壤湿度、光照强度、CO2浓度和阈值&#xff1b;可通过上位机远程观察传感器采集的数据显示&#xff1b;可通过K3键进入阈值设置模式&#xf…

如何使用大型语言模型LLMs作为历史课程的教学工具?#提示工程技巧

Mixlab从2018就开始分享过一些关于教育的内容&#xff1a; GPT-4等对教育的未来意味着什么&#xff1f;2023-05-05 学习的目的是什么&#xff1f;我喜欢的教育产品应该是这样的 2019-07-08 你是 Infinite Learner 吗&#xff1f;2018-05-27 今天继续教育的话题&#xff0c;我们…

基于微信小程序的超市售货管理平台设计与实现(源码+lw+部署文档+讲解等)

前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb;…

通过内网穿透,在Windows 10系统下搭建个人《我的世界》服务器公网联机

文章目录 1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址 9. 使用固定公网地址远程联机 …

浅谈电气防火保护器在地下商场的应用 安科瑞 缪阳扬

摘 要&#xff1a;近年来&#xff0c;我国城市发展速度加速。很多城市大力建造地下建筑设施&#xff0c;比如地铁、地下停车场和地下商场等。地下商场属于人员密集型建筑&#xff0c;其防火设计一直令相关的专家头疼。由于人员密集&#xff0c;防火处理不好将酿成灾难性的后果。…

软件定制APP开发步骤分析|小程序

软件定制APP开发步骤分析|小程序 软件定制开发步骤&#xff1a; 1.需求分析&#xff1a; 这是软件定制开发的第一步&#xff0c;也是最关键的一步。在这个阶段&#xff0c;软件开发团队需要与客户进行沟通&#xff0c;了解客户的具体需求和期望。通过讨论和交流&#xff0c;确…

【C++】左值和右值

基本概念左值和右值左值引用和右值引用 右值引用使用场景和意义左值引用的使用场景左值引用的短板右值引用和移动语义编译器优化移动赋值move右值引用引用左值右值引用的其他使用场景 完美转发万能引用forward 模板函数 基本概念 左值和右值 左值 左值&#xff08;lvalue&…

tp5连接多个数据库

一、如果你的主数据库配置文件都在config.php里 直接在config.php中中定义db2&#xff1a; 控制器中打印一下&#xff1a; <?php namespace app\index\controller; use think\Controller; use think\Db; use think\Request; class Index extends Controller {public fun…

DEM格式转换:转换NSDTF-DEM国标数据格式为通用格式,使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。

DEM格式转换&#xff1a;转换NSDTF-DEM国标数据格式为通用格式&#xff0c;使用ArcGIS工具转换NSDTF-DEM国标.dem文件为通用.tif格式。 *.dem是一种比较常见的DEM数据格式&#xff0c;其有两种文件组织方式&#xff0c;即NSDTF-DEM和USGS-DEM。 &#xff08;1&#xff09;NSDT…

【Linux基础】第26讲 Linux 查找和过滤命令(一)——find命令

find命令是根据文件属性进行查找的&#xff0c;如文件名&#xff0c;文件大小&#xff0c;所有者&#xff0c;所有组&#xff0c;是否为空&#xff0c;访问时间&#xff0c;修改时间等。基本格式&#xff1a; find path [options] 先定位到etc 目录下 cd /etc1.按照文件名查找 …