Vue(十二) Vuex、四个map方法的使用、Vuex模块化+namespace命名空间

news2024/11/13 10:32:01

文章目录

  • 一、Vuex
    • 前言:求和案例
    • 1. 搭建Vuex环境
    • 2. 基本使用
    • 3. 常见疑惑
    • 4. getters
    • 5. 四个map方法的使用
      • (1) mapState
      • (2) mapGetters
      • (3) mapActions
      • (4) mapMutations
    • 6. 模块化+命名空间namespace
      • 6.1 模块化
      • 6.2 模块化后读取数据

一、Vuex

Vuex是一个Vue插件,用来实现集中式状态(数据)管理。简单来说就是,当多个组件需要读写同一数据时。使用vuex来管理这个数据,会更方便多个组件读写。
在这里插入图片描述
原理图:
在这里插入图片描述

前言:求和案例

接下来都是结合这个求和案例来说明vuex的使用
在这里插入图片描述
Count组件的点击事件分别为:

  <button @click="increment">+</button>
  <button @click="decrement">-</button>
  <button @click="incrementOdd">当前和为奇数再加</button>
  <button @click="incrementWait">等一等再加</button>

对应的监听事件为:

// data中存有sum和n两个属性;sum是求和结果,n是用户在下拉框中选择的数字
    increment () {
      this.sum = this.sum + this.n
    },
    decrement () {
      this.sum = this.sum - this.n
    },
    incrementOdd () {
      if (this.sum % 2 != 0) {
        this.sum = this.sum + this.n
      }
    },
    incrementWait () {
      setTimeout(() => {
        this.sum = this.sum + this.n
      }, 1000)
    }

1. 搭建Vuex环境

1.安装vuex

  • vue2只能使用vuex3版本:npm i vuex@3
  • vue3只能使用vuex4版本:npm i vuex@4

2.导入并使用vuex

	import Vuex from 'vuex'
	Vue.use(Vuex)

有这两句代码之后,vue实例里就可以写store配置项。写了store配置项,所有的vc和vm都能够接触到$store

3.创建store文件:src/store/index.js

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象——响应组件中用户的动作
const actions = {}
//准备mutations对象——修改state中的数据
const mutations = {}
//准备state对象——保存具体的数据
const state = {}

//创建并暴露store实例
export default new Vuex.Store({
	actions,
	mutations,
	state
})
  1. main.js中创建vm时传入store配置项
//引入store
	import store from './store'
	//创建vm
	new Vue({
		el:'#app',
		render: h => h(App),
		store
	})

问:为什么要在store/index.js文件里执行Vue.use(Vuex),而不是在main.js文件:

答:因为规定创建store实例之前,必须执行Vue.use(Vuex)这条语句。vue在解析main.js时,首先将所有import的文件先走一遍,再执行其他语句。因此,即使Vue.use(Vuex)写在第三行的import store from './store'之前,也是先进入store文件,创建store实例,然后再执行Vue.use(Vuex)。所以干脆在store/index.js里引入。

2. 基本使用

1.初始化数据、配置actions、配置mutations,操作store文件index.js

// index.js,方法简单写了几个,没全写
...
// 初始化数据——state用于存储数据
const state = {
  sum: 0
}

// 准备actions——用于响应组件中的动作
const actions = {
  add (context, value) {
   // 这里未进行任何逻辑处理,所以组件可直接调用commit,而不是调用dispatch先进入到actions
    context.commit('ADD', value)
  },
  addWait (context, value) {
    setTimeout(() => {
      context.commit('ADD', value)
    }, 1000)
  }
}
// 准备mutations——用于操作数据(state)
const mutations = {
  ADD (state, value) {
    state.sum += value
  }
}

2.组件中修改vuex中的数据

// Count.vue里监听事件
increment () {
  this.$store.dispatch('add', this.n)
},

3.组件中读取vuex中的数据:

<!--(插值表达式中不需要写this)-->
 <h1>当前求和为{{ $store.state.sum }}</h1>

4.如果没有其他逻辑,组件也可以越过actions直接给mutations发送消息

// Count.vue里监听事件
increment () {
  this.$store.commit('ADD', this.n)
},

5.逻辑操作一般都写在actions里面

3. 常见疑惑

  • 问: action里的函数参数为(context,value),为什么不直接给commit,还要给一个context
    答: 上下文context里包含这些内容
    在这里插入图片描述
    先只看熟悉的这几个。
    state:actions在进行业务逻辑处理时,有可能会用到state里的数据进行处理。
    dispatch:actions里,若某一个操作包含很多业务逻辑,则可能会处理完一部分后,dispatch给actions里的另一个函数继续进行逻辑处理。
    所以,只包含commit不够周到

  • 问: 业务逻辑为什么要写在actions里边,直接写在组件的点击事件里边不行吗
    答: 当业务逻辑十分复杂(比如核实发票信息之类的)时,逻辑写在actions里,其他人需要核实发票信息时直接用这套逻辑就好了。如果写在点击事件里,每个人都写一遍这套逻辑,代码冗余量提升。所以写在actions里可以减少代码冗余。

4. getters

1.概念 :当state中的数据需要经过加工后再使用时,可以使用getters加工。(有点类似于组件中的computed)

2.在storge文件中添加配置

...
const getters = {
  bigSum (state) {
    return state.sum * 10
  }
}
...
export default new Vuex.Store({
  ...
  getters
})

3.组件中读取getters里的数据 $store.getters.bigSum

5. 四个map方法的使用

假设在store/index.js中:

// 准备state——用于存储数据
const state = {
  sum: 0,
  // 新增两个属性
  name: 'tom',
  age: 10
}

(1) mapState

借助mapState生成成计算属性(computed中生成),从state中读取数据

import { mapState} from 'vuex'
computed: {
//原始获取state数据的方法
mingzi () {
    return this.$store.state.name
},
nianling () {
    return this.$store.state.age
},
// mapState对象写法。(生成计算属性的名称为he,值是state里的sum属性中读取的数据)
 ...mapState({ he: 'sum', mingzi: 'name', nianling: 'age' }),
// mapState数组写法,生成的计算属性:sum、name、age
...mapState(['sum', 'name', 'age']),  
}
// Count.vue组件
// 应用mapState对象写法生成的计算属性
<h3>学生姓名为:{{ mingzi }},年龄为:{{ nianling }}</h3>
// 数组写法
<h3>学生姓名为:{{ name }},年龄为:{{ age }}</h3>

在这里插入图片描述

(2) mapGetters

借助mapGetters生成计算属性,从getters中读取数据

import { mapGetters } from 'vuex'
//原始写法:
 bigSum () {
    return this.$store.getters.bigSum
 },
// 数组写法
...mapGetters(['bigSum']),
// 对象写法
...mapGetters({ bigSum: 'bigSum' })

(3) mapActions

借助mapActions生成对应的方法,方法中会调用dispatch去联系actions

import { mapActions } from 'vuex'
// 原始方法
incrementWait () {
    this.$store.dispatch('addWait', this.n)
}
 // 对象写法
...mapActions({ incrementOdd: 'addOdd', incrementWait: 'addWait' }),
// 数组写法
...mapActions(['addOdd', 'addWait']),

采用map形式时,组件中调用方法:

//mapActions采用对象写法,注意此处传参
<button @click="incrementOdd(n)">当前和为奇数再加</button>
//mapActions采用数组写法
<button @click="addOdd(n)">当前和为奇数再加</button>

(4) mapMutations

借助mapMutations生成对应的方法,方法中会调用commit去联系mutations

import { mapMutations, } from 'vuex'
// 原始写法
decrement () {
    this.$store.commit('MINUS', this.n)
},
// 对象写法
...mapMutations({ increment: 'ADD', decrement: 'MINUS' }),
// 数组写法
...mapMutations(['ADD','MINUS']),

总结

  1. mapState和mapGetters优化了计算属性;mapMutations和mapActions优化了方法。

  2. map方法采用对象写法{key:value}时:key为组件中使用该属性/方法时的名称,value为vuex里对应的属性名/方法名

  3. 采用数组写法时:组件中该属性名/方法名与vuex里的属性名/方法名一致

注:mapActions与mapMutations使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数默认是事件对象。

6. 模块化+命名空间namespace

根据功能,将相关的配置分类,让代码更好维护,让多种数据分类更加明确。

6.1 模块化

比如现在有Count和Dog两个vue组件。两个组件都往vuex中存放了一些数据。修改文件

// store.js
const countOptions ={
  namespaced: true, // 开启命名空间
  actions: {...},
  mutations: { ...},
  state: {...},
  getters: {...}
},
const dogOptions ={
  namespaced: true, // 开启命名空间
  actions: {...},
  mutations: { ...},
  state: {...},
  getters: {...}
},
export default new Vuex.Store({
 modules: {
  countAbout: countOptions,
  dogAbout: dogOptions
  // keyvalue名称一致时,也可以用简写形式
  // countOptions,
  // dogOptions
 }

或者将countOptions与dogOptions分别放入两个js文件

// count.js
export default {
  namespaced: true, // 开启命名空间
  actions: {...},
  mutations: { ...},
  state: {...},
  getters: {...}
}
// dog.js
import axios from 'axios'
import { nanoid } from 'nanoid'         
export default {
  namespaced: true, // 开启命名空间
  actions: {
   addDogServe (context) {//Actions部分向外发送请求
     axios.get('https://api.xygeng.cn/one').then(
       response => {
         context.commit('AddDogs', { id: nanoid(), name: response.data.data.tag })},
       error => {
         alert(error.message)}
    )}
 },
  mutations: { ...},
  state: {...},
  getters: {...}
}
// store.js
import countOptions from './count'
import dogOptions from './dog'
export default new Vuex.Store({
modules: {
    countAbout: countOptions,
    dogAbout: dogOptions
}

6.2 模块化后读取数据

由于将数据分类到不同的模块里,因此需要给模块开启命名空间namespace,才能确保读取到该模块的数据。

1、采用map方法读取数据,调用方法

// mapState方式读取不同模块的数据
...mapState('countAbout', { he: 'sum', mingzi: 'name', nianling: 'age', dogs: 'dogs' }),
...mapState('dogAbout', ['dogs']),
    
// mapGetters方式读取不同模块的数据
...mapGetters('countAbout', ['bigSum']),

// mapActions方式
...mapActions('countAbout', { incrementOdd: 'addOdd', incrementWait: 'addWait' }),
// mapMutations方式    
 ...mapMutations('countAbout', { increment: 'ADD', decrement: 'MINUS' }),

2、不采用map方法,自己读取state、getters数据,调用commit、dispatch方法

computed(){
 dogs () {
 	return this.$store.state.dogAbout.dogs
 },
 firstDog(){
    return this.$store.getters['dogAbout/getFirstDog']
 }
},
methods(){
 addDog () {
    this.$store.commit('dogAbout/AddDogs', { id: nanoid(), name: this.dogName })
 },
 addDogRandom () {
    this.$store.dispatch('dogAbout/addDogServe')
 }
}

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

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

相关文章

FPGA与高速ADC接口简介

引言&#xff1a;本文介绍FPGA与高速ADC接口方式和标准以及JESD204与FPGA高速串行接口。 1. 高速ADC与处理器互联需要权衡的因素 如图1所示&#xff0c;ADC模数转换器可以与微控制器、DSP、FPGA以及ASIC均可以实现互联&#xff0c;在进行选择时&#xff0c;需要考虑以下因素&…

强化学习实操入门随笔

碎碎念&#xff1a;经过思考&#xff0c;打通底层逻辑&#xff0c;我认为未来ai的功能是在沟通领域代替人&#xff0c;未来人-人模式&#xff08;媒介是死的语言&#xff0c;比如看古人留下的文字、聊天的暂时不在&#xff09;会变成人-ai替身-人模式&#xff08;符合本人想法的…

上市公司财务数据分析系统

前言 1.拟解决的关键问题或技术: 本研究旨在解决企业在财务管理方面的主要问题,即如何通过对财务数据进行深度挖掘,实现对未来财务趋势的预测和风险的识别。具体地,该研究将重点解决以下问题: 1.构建有效的财务指标体系、设计合理的特征工程和指标构建方法,以充分反映…

Java基于小程序公考学习平台的设计与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

QT实现简易文件夹

使用UI界面实现简易文件夹 1、实现功能 1、双击文件夹&#xff0c;进入文件夹的下一层 2、点击回退按钮、返回上一级 3、如果是文本文件、则调用记事本的程序、显示文本内容 2、widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDir>…

《深度学习》OpenCV 图像边缘检测 算法解析及代码演示

目录 一、图像边缘检测 1、什么是边缘检测 2、常用的边缘检测算法 1&#xff09;Sobel算子 2&#xff09;Scharr 算子 3&#xff09;Canny边缘检测算法 4&#xff09;Laplacian算子 3、边缘检测流程 1&#xff09;预处理 2&#xff09;计算梯度 3&#xff09;非极大值抑制 …

微型直线导轨高精度运行的工作原理

微型导轨是一种用于高精度定位和运动控制的传动装置&#xff0c;常用于微小化、高精密度化的机械设备中&#xff0c;如IC制造设备、半导体设备、高速移载的设备、精密测量、检测仪器、医疗设备、X-Y table&#xff0c;以及高速皮带驱动的设备等小型化设备。 微型导轨的构成相对…

Quartz.Net_持久化

简述 通常而言&#xff0c;Quartz.Net的数据默认是存储在运存中的&#xff0c;换言之&#xff1a;断电即失。所以在默认情况下&#xff0c;当系统重启后&#xff0c;原先的所有任务、触发器、调度器都会失效 为避免上述情况的发生&#xff0c;可以对Quartz.Net进行持久化设置…

支持函数库功能,支持对接豆包、腾讯混元、Amazon Bedrock等模型供应商,MaxKB v1.5.0版本发布

2024年9月2日&#xff0c;MaxKB开源知识库问答系统正式发布v1.5.0版本。 在v1.5.0社区版中&#xff0c;应用编排方面&#xff0c;MaxKB新增函数库功能&#xff0c;支持用户在应用编排时调用函数&#xff1b;模型管理方面&#xff0c;MaxKB新增对豆包、腾讯混元和Amazon Bedroc…

Datawhale AI夏令营 第五期 CV方向 Task2笔记

Task2&#xff1a;建模方案解读与进阶 YOLO介绍 YOLO&#xff08;You Only Look Once&#xff09;是一种流行的目标检测算法&#xff0c;于2015年首次提出 。YOLO的核心思想是将目标检测任务转化为一个回归问题&#xff0c;通过单个卷积神经网络&#xff08;CNN&#xff09;直…

Linux git的基本使用安装提交 和 gdb的使用

目录 安装git 首次使用git的配置 拉取仓库 步骤1&#xff1a;新建仓库 步骤2:复制仓库地址 步骤3&#xff1a;远端仓库拉取到本地 上传代码 常用指令 安装git sudo apt-get install git # Ubuntu/Debian sudo dnf install git # Fedora sudo yum insta…

惠中科技光伏清洗剂:点亮绿色能源未来

在当今全球追求可持续发展的时代&#xff0c;光伏产业作为清洁能源的重要代表&#xff0c;正发挥着日益关键的作用。而在光伏产业的高效运行中&#xff0c;惠中科技的光伏清洗剂犹如一颗璀璨的明珠&#xff0c;为光伏板的清洁与维护贡献着卓越力量。 一、光伏产业的挑战与需求…

SAP CAP(Cloud Application Programming)知识介绍和学习路径

1. 框架简介 1.1 什么是CAP&#xff1f; CAP&#xff08;Cloud Application Programming&#xff09;是SAP推出的一种现代化开发框架&#xff0c;旨在简化和加速云原生应用程序的开发。 CAP框架基于开放标准和技术&#xff0c;如Node.js、Java、OData和SQL&#xff0c;提供了…

删除重复的行

Excel的有7列数字&#xff0c;有些数字整行重复。 ABCDEFG11234567276543213123456741234567511111116111111177777777 要求删掉重复的行。 IJKLMNO1765432127777777 使用 SPL XLL&#xff0c;输入公式&#xff1a; spl("?.group(~).select(~.len()1).conj()",…

Windows、Mac安装配置Nodejs【保姆级教程】

安装配置Nodejs 最近需要使用whistle抓包&#xff0c;发现依赖nodejs环境&#xff0c;同时环境为windows&#xff0c;故在此记录。 1 windows 下载nodejs 官网地址&#xff1a;https://nodejs.org/en/ 下载完成后&#xff0c;双击安装包&#xff0c;开始安装Node.js直接点【…

SOMEIP_ETS_078: Wrong_SOMEIP_Protocol_Version

测试目的&#xff1a; 验证当设备&#xff08;DUT&#xff09;接收到一个包含错误协议版本的SOME/IP请求时&#xff0c;是否能够返回错误消息或忽略该请求。 描述 本测试用例旨在检查DUT在处理一个echoUINT8方法的SOME/IP消息时&#xff0c;如果消息中包含的协议版本不正确&…

ARM体系与架构

硬件基础 NOR Flash 和 NAND Flash异同 NOR&#xff0c;Not OR&#xff0c;逻辑是或非门&#xff1b;NAND&#xff0c;Not AND&#xff0c;逻辑是与非门。 两者都是FALSH芯片&#xff0c;断电不丢失。FLASH只能写0不能写1&#xff0c;所以写前都要先擦除。 NOR FLASH 按照块、…

HarmonyOS开发实战( Beta5版)高负载场景下线程设置防止关键线程被打断

场景介绍 在现代软件开发中&#xff0c;多线程或多进程的并发处理已成为常态。在多线程环境中&#xff0c;不同线程执行的任务具有不同的重要性和紧急程度。在高负载情况下&#xff0c;系统资源&#xff08;如CPU时间&#xff09;变得非常宝贵&#xff0c;此时如果关键线程&am…

开源-基于J2EE分布式架构的会议管理系统,支持会议资源管理,预订会议,冲突检测,提醒与签到

自20世纪末至21世纪初&#xff0c;数字化和互联网技术的迅猛发展彻底改变了工作方式和商业模式。企业迅速采用电子邮件、即时通讯和在线会议等数字工具以提升沟通效率。 在信息爆炸的时代&#xff0c;工作中面临的信息量剧增&#xff0c;而企业对效率和生产力的要求也日益提高…

用canvas 实现一个 图片 object-fit: cover 模式的效果 ,纯js

先看效果&#xff1a;左侧是原生的object-fit: cover img 右侧是canvas 处理之后的 模仿object-fit: cover 的效果&#xff0c;src 是转换之后的base64 地址 可以结合style样式发现右图并没有object-fit: cover&#xff0c;但是效果与左同。 直接贴代码吧 <!DOCTYPE htm…