vue重修之Vuex【上部】

文章目录

  • 版权声明
  • Vuex 概述
    • Vuex 的主要概念和组件
  • vuex的使用
  • 状态 (state)
    • Vuex特点
  • 访问vuex中数据
    • $store访问
    • mapState辅助函数访问
  • 开启严格模式及Vuex的单项数据流
  • 突变(mutations)
    • mutations初识
    • 带参 mutations
    • 辅助函数 mapMutations
  • 动作(Actions)
    • 辅助函数 mapActions
  • vuex mutations VS actions
  • 获取器(Getters)
  • 总结

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

Vuex 概述

  • uex 是一个用于 Vue.js 的状态管理库【状态就是数据】。简言之,Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。
  • 使用场景
    在这里插入图片描述

  • 优势
    • 共同维护一份数据,数据集中化管理
    • 响应式变化
    • 操作简洁
      在这里插入图片描述

Vuex 的主要概念和组件

  • 状态(State):Vuex 中的状态是存储应用程序数据的地方,通常表示为 JavaScript 对象。

  • 获取器(Getters):获取器用于根据当前状态计算派生状态类似于存储库中的计算属性。

  • 突变(Mutations):突变是修改状态的唯一方式。它们是同步的,通过明确定义状态如何改变,有助于维护可预测的状态。

  • 动作(Actions):动作用于执行异步操作和触发突变。适合进行诸如发出 API 请求然后根据结果提交突变等任务。

  • 模块(Modules):Vuex 允许将存储划分为模块。这对于较大的应用程序有助于将状态、突变、动作和获取器组织成更小、更可管理的部分。

  • Vuex 特别适用于较大的应用程序,其中状态管理可能变得复杂。

  • 它强制执行单向数据流,并使更容易跟踪应用程序状态变化的来源。这种可预测性有助于调试和维护不断增长的应用程序。

vuex的使用

  • Vue.js 应用程序中设置 Vuex 的一般步骤
    在这里插入图片描述
  1. 安装(Installation):你需要将 Vuex 安装为依赖项,可以使用 npm 或 yarn 进行安装。

    npm i vuex@3 # vue2适用
    
  2. 存储配置(Store Configuration):通过定义状态、突变、动作和获取器来创建一个存储。

    • 为了维护项目目录的整洁,在src目录下新建一个store目录其下放置一个index.js文件。
      在这里插入图片描述
       // store.jsimport Vue from 'vue'import Vuex from 'vuex'Vue.use(Vuex)const store = new Vuex.Store({state: {// 在这里定义应用程序的状态},mutations: {// 在这里定义突变函数},actions: {// 在这里定义动作函数},getters: {// 在这里定义获取器函数}})export default store
    
  3. 在 main.js 中导入挂载到 Vue 实例上

    import Vue from 'vue'
    import App from './App.vue'
    import store from './store'Vue.config.productionTip = falsenew Vue({render: h => h(App),store
    }).$mount('#app')
    
  4. 测试打印Vuex

    created(){console.log(this.$store)
    }
    

状态 (state)

  • “state”(状态)是指应用程序中的数据的集合,通常表示为一个包含各种属性的 JavaScript 对象。这些属性可以包括应用程序的配置、用户信息、页面内容、各种设置等。
  • State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储。
  • store 对象的 state 属性中定义应用程序的状态
const store = new Vuex.Store({// state 状态, 即数据, 类似于vue组件中的data,// 区别:// 1.data 是组件自己的数据, // 2.state 中的数据整个vue项目的组件都能访问到state: {user: null,settings: {theme: 'light',language: 'en',},// 其他应用程序状态},// 其他配置项
})

Vuex特点

  • Vuex 中状态的一些重要特点
    • Centralized: Vuex 中的状态是集中管理的,这意味着所有组件都可以访问相同的状态数据,而不需要通过复杂的组件传递数据来实现共享。

    • Reactive: Vuex 的状态是响应式的。当状态发生变化时,依赖于该状态的组件会自动更新以反映这些变化。

    • Read-Only: Vuex 的状态是只读的。这意味着你不能直接在组件中修改状态,而是需要通过 mutations 来进行修改。这有助于维护状态的可预测性。

    • Single Source of Truth: Vuex 鼓励将应用程序的状态集中到一个单一的状态树中,使其成为整个应用程序的“唯一数据源”。这有助于简化状态的管理和维护。

    • Predictable: 由于状态的修改只能通过 mutations 来进行,因此状态的变化变得可预测,易于调试和维护。

访问vuex中数据

  1. 通过$store直接访问 —> {{ $store.state.count }}
  2. 通过辅助函数mapState 映射计算属性 —> {{ count }}

$store访问

  • 通过$store访问的语法
    获取 store:1.Vue模板中获取 this.$store2.js文件中获取 import 导入 store模板中:     {{ $store.state.xxx }}
    组件逻辑中:  this.$store.state.xxx
    JS模块中:   store.state.xxx
    
  • 模板中使用
    • 在组件中访问 Vuex 中的状态,可以使用 this.$store.state 来获取状态的值
<template><div><p>User: {{ $store.state.user }}</p><p>Theme: {{ $store.state.settings.theme }}</p></div>
</template>
  • 组件逻辑中使用
    • 将state属性定义在计算属性中
    <h1>state的数据 - {{ count }}</h1>// 把state中数据,定义在组件内的计算属性中computed: {count () {return this.$store.state.count}}
    
  • js文件中使用
//main.jsimport store from "@/store"console.log(store.state.count)

mapState辅助函数访问

  • mapState是辅助函数,把store中的数据映射到 组件的计算属性中, 它属于一种方便的用法
    在这里插入图片描述
  • 第一步:导入mapState (mapState是vuex中的一个函数)
    import { mapState } from 'vuex'
    
  • 第二步:采用数组形式引入state属性
    mapState(['count']) 
    
    • 上面的代码等价于
    count () {return this.$store.state.count
    }
    
  • 第三步:利用展开运算符将导出的状态映射给计算属性
      computed: {...mapState(['count'])}<div> state的数据:{{ count }}</div>
    

开启严格模式及Vuex的单项数据流

  • vuex 同样遵循单向数据流,组件中不能直接修改仓库的数据
  1. 直接在组件中修改Vuex中state的值
    在这里插入图片描述
  • Son1.vue
button @click="handleAdd">+ 1</button>methods:{handleAdd (n) {// 错误代码(vue默认不会监测,监测需要成本)this.$store.state.count++// console.log(this.$store.state.count) },
}
  1. 开启严格模式
    • 通过 strict: true 可以开启严格模式,开启严格模式后,直接修改state中的值会报错
    • state数据的修改只能通过mutations,并且mutations必须是同步的
      在这里插入图片描述

突变(mutations)

mutations初识

  1. 定义mutations
const store  = new Vuex.Store({state: {count: 0},// 定义mutationsmutations: {}
})
  1. 格式说明
  • mutations是一个对象,对象中存放修改state的方法
mutations: {// 方法里参数 第一个参数是当前store的state属性// payload 载荷 运输参数 调用mutaiions的时候 可以传递参数 传递载荷addCount (state) {state.count += 1}}
  1. 组件中提交 mutations
this.$store.commit('addCount')

带参 mutations

  • 提交 mutation 是可以传递参数的 this.$store.commit('xxx', 参数)
  1. 提供mutation函数(带参数)
    mutations: {...addCount (state, count) {state.count = count}
    }
    
  2. 提交mutation
    handle ( ) {this.$store.commit('addCount', 10)
    }
    
  3. 小tips: 提交的参数只能是一个, 如果有多个参数要传, 可以传递一个对象
    this.$store.commit('addCount', {count: 10
    })
    

辅助函数 mapMutations

  • mapMutations 和 mapState很像,它是把位于mutations中的方法提取了出来,映射到组件methods中。
    import  { mapMutations } from 'vuex'
    methods: {...mapMutations(['addCount'])
    }
    //等价于
    methods: {// commit(方法名, 载荷参数)addCount () {this.$store.commit('addCount')}
    }
    
    • 在组件中,可以直接通过this.addCount调用
    <button @click="addCount">+1</button>
    
  • 请注意: Vuex中mutations中要求不能写异步代码,如果有异步的ajax请求,应该放置在actions中

动作(Actions)

  • actions是用于处理异步操作的,例如从服务器获取数据或执行复杂的计算。Actions可以包含任何异步操作,但是它们最终需要调用mutations来更新state中的数据。

  • Actions是通过dispatch方法来调用的,dispatch方法接收一个action的名称和一个可选的payload参数。当调用dispatch方法时,它会触发一个action,并且可以在action中执行任何异步操作。

  1. 定义actions
mutations: {changeCount (state, newCount) {state.count = newCount}
}actions: {setAsyncCount (context, num) {// 一秒后, 给一个数, 去修改 numsetTimeout(() => {context.commit('changeCount', num)}, 1000)}
}
  1. 组件中通过dispatch调用
setAsyncCount () {this.$store.dispatch('setAsyncCount', 666)
}

在这里插入图片描述

辅助函数 mapActions

  • mapActions 是把位于 actions中的方法提取了出来,映射到组件methods中
  • Son.vue
    import { mapActions } from 'vuex'
    methods: {...mapActions(['changeCountAction'])
    }//mapActions映射的代码 本质上是以下代码的写法
    //methods: {
    //  changeCountAction (n) {
    //    this.$store.dispatch('changeCountAction', n)
    //  },
    //}
    
  • 直接通过 this.方法 就可以调用
    <button @click="changeCountAction(200)">+异步</button>
    

vuex mutations VS actions

MutationsActions
目的修改state中的数据执行异步操作、调用多个mutations
同步/异步同步操作可以是同步或异步操作
使用场景更新state中的数据执行异步请求、处理复杂逻辑
调用方式使用commit方法调用使用dispatch方法调用
响应不能返回任何值,只能修改state可以返回Promise或异步操作的结果
跟踪可以在devtools中跟踪mutations的调用可以在devtools中跟踪actions的调用
  • 总体来说
    • mutations适用于同步操作,用于修改state中的数据。它们是可追踪的,可以在devtools中查看它们的调用。
    • actions适用于执行异步操作、调用多个mutations或处理复杂逻辑。它们可以是同步或异步操作,并且可以返回Promise或异步操作的结果。
    • 在调用上,mutations使用commit方法,而actions使用dispatch方法。

获取器(Getters)

  • getters用于从store中获取数据,类似于计算属性,可以基于store中的state计算出一个新的值。
  • getters可以看作是store的计算属性,它们的值会被缓存起来,只有当所依赖的state发生变化时才会重新计算。
  • 好处:可以将数据的处理逻辑从组件中抽离出来,将其放在store中,从而使得组件更加简洁和易于维护。另外,getters还可以在多个组件中共享和重复使用,避免了代码的冗余。

  • getter示例:
    • 定义doneTodos的getter,它基于store中的todos数组计算出一个新的数组,该数组包含所有已完成的todo对象
    const getters = {//getters: {// getters函数的第一个参数是 state// 必须要有返回值doneTodos: state => {return state.todos.filter(todo => todo.done)}
    }
    
  • 访问getters
    • 使用store访问getters
    {{ $store.getters.doneTodos}}
    
    • 在组件中使用这个getter,使用mapGetters辅助函数
import { mapGetters } from 'vuex'export default {computed: {...mapGetters(['doneTodos'])}
}

总结

  • 关于Vuex中state、getters、mutations和actions的使用总结:
StateGettersMutationsActions
用途存储应用程序的数据从state中派生出计算属性修改state中的数据执行异步操作、调用多个mutations
直接访问使用this.$store.state使用this.$store.getters不直接访问,通过commit方法调用不直接访问,通过dispatch方法调用
用法示例this.$store.state.countthis.$store.getters.doneTodosthis.$store.commit(‘increment’)this.$store.dispatch(‘fetchData’)
参数接收state作为参数接收state和payload作为参数接收context对象作为参数
返回值返回基于state的计算属性或派生数据无返回值,只能修改state可以返回Promise或异步操作的结果
异步操作不适用不适用不适用适用
跟踪可以在devtools中跟踪getters的调用可以在devtools中跟踪mutations的调用可以在devtools中跟踪actions的调用

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

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

相关文章

【tio-websocket】8、T-IO对半包和粘包的处理

介绍 t-io对数据的解码是在DecodeRunnable中完成的,一个TCP连接对应一个DecodeRunnable半包粘包的处理也都在DecodeRunnable中完成的关于DecodeRunnable 先贴上 DecodeRunnable 的源代码: import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import j…

用超声波清洗机洗眼镜的有哪些?清洁力强的超声波清洗机不能错过

超声波清洗机在清洗眼镜方面表现出色&#xff0c;其强大的清洁能力可以彻底清除眼镜上的污垢和细菌。这种清洗方式被认为是一种高效且卫生的清洁方式&#xff0c;因为它利用高频振动和微射流打击力来清除污垢和细菌&#xff0c;而不是使用化学物质。对于那些长时间佩戴眼镜或者…

五、Qt中的常用类

1. QString 字符串类 QString是Qt中的字符串类&#xff0c;与C/C不同的是&#xff0c;不再使用ASCII编码&#xff0c;而使用Unicode编码。因此一个字符不是8位的char&#xff0c;而是16位的QChar&#xff0c;这就是为什么之前一个汉字占用一个字符的原因。、 QString几乎向前兼…

【Javascript】定时器

目录 延迟执行 定时执行 清除定时任务 延迟执行 setTimeout(function(){}, 毫秒) console.log(1); console.log(2); console.log(3); setTimeout(function (){console.log(5) },5000) console.log(4);setTimeout(function (){ console.log(5) },5000) 设定了一个任务&…

Proteus仿真--从左往右流水灯仿真(仿真文件+程序)

本文主要介绍基于51单片机的流水灯仿真&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真运行视频 Proteus仿真--基于51单片机的流水灯仿真&#xff08;从左往右&#xff09; 附完整Proteus仿真资料代码资料 百度网盘链接: https://pan.baidu.com/s/1aZH13zwQkNB7…

centos Let‘s Encrypt 免费https证书申请,并且自动续约

一、首先我们要使用certbot 工具 官网地址&#xff1a; https://certbot.eff.org/instructions?wsother&oscentosrhel8 下载 snap 工具 sudo yum install snapd sudo systemctl enable --now snapd.socket sudo ln -s /var/lib/snapd/snap /snap sudo systemctl status…

Go基础——数组、切片、集合

目录 1、数组2、切片3、集合4、范围&#xff08;range&#xff09; 1、数组 数组是具有相同唯一类型的一组已编号且长度固定的数据项序列&#xff0c;这种类型可以是任意的原始类型例如整型、字符串或者自定义类型。 Go 语言数组声明需要指定元素类型及元素个数&#xff0c;与…

Mybatis的Mapper文件报错:Tag name expected

目录 一、Mapper文件的错误信息 二、原因分析 三、解决方案 1、解决方式一&#xff1a;CDATA 2、解决方式二&#xff1a;预定义字符 一、Mapper文件的错误信息 在使用MyBatis时&#xff0c;我们通常会写一些sql语句。如下图&#xff0c;有时候我们会直接使用比较符号&…

【Python机器学习】零基础掌握IsolationForest集成学习

如何有效地识别异常数据点? 在日常工作和生活中,经常会遇到需要从大量数据中找出异常或者“不一样”的数据点的情况。比如在金融领域,怎样从数以百万计的交易记录中准确地找出可疑的欺诈交易?又或者在电商平台,如何从海量的商品评论中找出那些刷好评或刷差评的异常数据?…

Oracle 数据库的锁排查方法

关键字 oracle lock 问题描述 Oracle 数据库上锁问题如何排查 解决问题思路 准备数据 create table lock_test(name varchar(10),age varchar(10));insert into lock_test values(ff,10); insert into lock_test values(yy,20); insert into lock_test values(ll,30);Orac…

docker 中给命令起别名

docker 的有些命令特别复杂&#xff0c;我们可以给它设置别名简化输入&#xff0c;就不用每次都输入那么多了&#xff01;&#xff01;&#xff01; 1. 进入 .bashrc 中修改配置&#xff08; .bashrc 是root下的隐藏文件&#xff09; cd /rootvim .bashrc2. 在 .bashrc 中加入…

springboot 项目非docker 部署自动启动

springboot 项目非docker 部署&#xff0c;需要杀死进程重新启动&#xff0c;并打印对应的日志&#xff0c;以下是一个好用的shell脚本。 #!/bin/bash#jar包文件路径及名称&#xff08;目录按照各自配置&#xff09; APP_NAME/home/zbhc-ant/server/XXXX.jarLOG_FILE/home/zbh…

Python之前端的学习

前端学哪些内容 1. HTML # 网页的骨架、只是负责显示一些内容&#xff0c;但是显示出来的内容不好看&#xff0c;没样式 2. CSS # 对网页骨架的美化、让网页变得更加的好看而已 3. JavaScript # html、css都是不能动的&#xff0c;静态的&#xff0c;js就是让网页能够动起来…

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器

LabVIEW开发TDS1000 和TDS2000 系列泰克示波器 泰克示波器是经常用到的工具&#xff0c;一般手动操作即可&#xff0c;但有时候也要集成到系统中&#xff0c;需要程控。这时候先要下载厂家提供的例子&#xff0c;了解LabVIEW的demo。根据不用的示波器型号&#xff0c;选择和计…

【Proteus仿真】【Arduino单片机】直流电机和步进电机

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用蜂鸣器、按键、直流电机、步进电机、ULN2003、L293D等。 主要功能&#xff1a; 系统运行后&#xff0c;K3键启动运行&#xff0c;K1和K2键控制…

.net 7 上传文件踩坑

(Name “file”) 没加上这个传不进文件 /// <summary>/// 上传单个文件/// </summary>/// <param name"formFile"></param>/// <returns></returns>[HttpPost("UploadFiles")][FunctionAttribute(MuType.Btn, "…

MAC安装stable diffusion

./webui.sh --precision full --no-half-vae --disable-nan-check --api Command: "/Users/xxxx/aigc/stable-diffusion-webui/venv/bin/python3" -m pip install torch2.0.1 torchvision0.15.2 Error code: 2 执行命令&#xff1a; pip install torch2.0.1 torchvi…

MATLAB R2023b安装包下载链接

MATLAB2023b下载链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/15VgPf8GnxlZHcbh2grJrDQ?pwdluob 提取码&#xff1a;luob

【LeetCode力扣】189 53 轮转数组 | 最大子数组和

目录 1、189. 轮转数组 1.1、题目介绍 1.2、解题思路 2、53. 最大子数组和 2.1、题目介绍 2.2、解题思路 1、189. 轮转数组 1.1、题目介绍 原题链接&#xff1a;189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; ​ 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3输…

java原子类-Atomic

什么是原子类&#xff1f; java 1.5引进原子类&#xff0c;具体在java.util.concurrent.atomic包下&#xff0c;atomic包里面一共提供了13个类&#xff0c;分为4种类型&#xff0c;分别是&#xff1a; 原子更新基本类型&#xff0c;原子更新数组&#xff0c;原子更新引用&…