【前端54_Vue】Vuex 统一状态管理:定义变量、获取变量、修改变量、以及较好的实践:模块化,映射方法、派生方法、严格模式、插件

本文主要是介绍【前端54_Vue】Vuex 统一状态管理:定义变量、获取变量、修改变量、以及较好的实践:模块化,映射方法、派生方法、严格模式、插件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • Vuex
    • 速查表
    • 杂谈
    • 简介
    • 优点
    • 安装
    • 使用
      • 定义变量
      • 获取变量
      • 修改状态 Mutations
      • 异步调用 actions
    • 最佳实践
      • 模块化
      • 映射方法
        • 探究问题
        • 初步认识 mapState()、mapMutation()、mapAction()
        • 使用方法
        • 抛出问题
      • 派生方法 getters
      • 严格模式
      • 插件
        • 简介
        • 为什么要用插件
        • 实例:登录永久化


Vuex

速查表

Vuex 操作代码
获取状态this.$store.state.变量名
同步修改状态this.$store.commit("命名空间/Mutations 中定义的方法名")
异步修改状态this.$store.dispatch("命名空间/Actions 中定义的方法名")

杂谈

最近出差去深圳了,所以没太多的经历去写博客,提升自己,摸鱼实在是太爽了,不过兄弟们我还是回来了,咕咕咕!

让我慢慢总结这个吧,毕竟还是重要的东西,之前写项目也在这里绊过跟头,所以这次想在弄懂一些!


简介

我们来看一个比较抽象的概念哈

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以可预测的方式发生变化。

说的比较抽象,其实可以理解为,保存全局状态的地方,改变值得话会有行为记录

比方说,我的登录状态,此状态会贯穿我使用此 app 的所有过程吧?所以这个状态就最好存在 Vuex

再比方说,我登录成功了,此时我要去改变 Vuex 中的变量的状态,然而,我不能直接去修改,而是发出修改的指令,动作


优点

  • 统一管理状态,保证一致性
  • 服务端重构开发
  • 可预测性能:让程序更健壮,出了问题能够反查

安装

vuex 也是个插件,可以通过 vue add vuex 来安装它请添加图片描述
安装完成之后可以看到新添加了些东西啊。

其中的 store 文件夹下的 index.js 的内容如下,我们以后要把变量放在这里的!

在这里插入图片描述


使用

定义变量

还是用举例的方式吧,我现在要管理一个登录的状态,那么我就在 state 里设置个变量

请添加图片描述


获取变量

一般都是在 vue 文件中获取,比较简单

// 这是在 vue 文件中获取,如果是 html 里就可以 this 省去
this.$store.state.变量名

这里再讲一下其他地方获取

如果想在其他文件中获取状态,可以先引入 store ,然后再获取,比方说下面这个例子:我在全局路由守卫中获取

首先需要在 js 中导入一下 store

在这里插入图片描述

然后尝试在路由中获取,获取的方法 store.state.变量名,并且写了写逻辑,刷新页面,打印一下!
请添加图片描述

成功获取!


修改状态 Mutations

我们不能直接修改变量值,会报错的,而是通过通知 vuex 一个动作,也就是 mutations 提供的方法,去修改状态
这样的好处上文已经说过,便于统一管理,排查错误。

首先在 mutations 中定义登录、登出的方法

在这里插入图片描述

然后再登录的时候调用该方法:

在这里插入图片描述
最后执行一下看看,成功改变了 vuex 中的变量值(这个打印 islogin 我是放到了全局守卫里了)

请添加图片描述


异步调用 actions

我们先在 actions 中定义好方法,如下图所示,然后通过 dispatch 去调用方法

我们还是举例子,详细的说明请看下图

在这里插入图片描述

再来个动图:

请添加图片描述

是不是清晰了些!


最佳实践

这标题夸张???行吧
在这里插入图片描述

模块化

其实上面改的状态都是属于用户的状态,那我可不可以单独提取出来,变成一个子模块呢?

让我们来提取一下:
在这里插入图片描述

之后的获取、修改变量需要变化一下

获取变量:
在这里插入图片描述
派发事件的方式:
在这里插入图片描述

至于为什么这么修改的,我们可以在官网上找到些蛛丝马迹

在这里插入图片描述


映射方法

探究问题

可以看一下我们修改完之后的获取
在这里插入图片描述

点的实在是太深了,对于我这种懒人,不太友好,有没有较好的处理办法呢?有的,那就是映射出来!


初步认识 mapState()、mapMutation()、mapAction()

这就要接触一下这几个东西了

mapState()/mapMutation()/mapAction()

通过这些映射方法可以让大家少敲几个字,避免对 $store 直接访问


使用方法

获取变量:

主要是配合 computed 钩子
在这里插入图片描述
修改变量:

// 这两个都行...mapActions('user', ['login']),...mapActions(['user/login']),

通过 mapActions 引出,展开,并注册在 methods 里,然后就可以通过 this 来调用了

在这里插入图片描述
整体思路如下

在这里插入图片描述


抛出问题

既然 mutationsactions 可以写同名函数,那么都引用进来,会调用谁的呢?还是老样子啊,想想之后,实验一下!

在这里插入图片描述
实验动图如下:

请添加图片描述

也就是说,同名的方法会被覆盖掉,用最底下的方法。


派生方法 getters

类似 vuex 的计算属性,下面来个欢迎语的实践

在这里插入图片描述

在这里插入图片描述
下面是动图:

请添加图片描述


严格模式

严格模式下,无论何时发生了状态变更且不是由 mutation 函数引起的,将会抛出错误。这能保证所有 的状态变更都能被调试工具跟踪到。

开启严格模式 strict: true

在这里插入图片描述

再看一下报错的情况,虽然说是报错,但是 username 的状态还是改变了。

请添加图片描述


插件

简介

Vuexstore 接受 plugins 选项,这个选项暴露出每次 mutation 的钩子。Vuex 插件就是一个函数,它接收 store 作为唯一参数。

也就是说,每次 mutation 中的方法被调用的时候,都会运行插件里的函数


为什么要用插件

因为vuex 只是处理窗台的地方,而不是写逻辑的地方


实例:登录永久化

首先需要知道一些比较重要的

const myPlugin = store => {// 当 store 初始化后调用store.subscribe((mutation, state) => {// 每次 mutation 之后调用// mutation 的格式为 { type, payload }})
}

然后可以阅读一下官网,还是比较全面,vuex 官方说明插件

之后再看一下这个逻辑

在这里插入图片描述

最后看一下动图吧:

请添加图片描述

// 插件源码
import router from '../../router'
/*** 永久化保存* - 判断本地缓存是否存在* - 如果有的话就去设置一下*/
export default (store) => {console.log('使用了预处理插件')if (localStorage) {const user = JSON.parse(localStorage.getItem('user'))if (user) {store.commit('user/login', user)}}store.subscribe((mutation, state) => {console.log('store.subscribe:>>', mutation)if (mutation.type === 'user/login') {localStorage.setItem('user', JSON.stringify(state.user))} else if (mutation.type === 'user/logout') {localStorage.removeItem('user')router.push('/login')}})
}

这篇关于【前端54_Vue】Vuex 统一状态管理:定义变量、获取变量、修改变量、以及较好的实践:模块化,映射方法、派生方法、严格模式、插件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/976062

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

【 html+css 绚丽Loading 】000046 三才归元阵

前言:哈喽,大家好,今天给大家分享html+css 绚丽Loading!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、信息💡1.简介:💡2.外观描述:💡3.使用方式:💡4.战斗方式:💡5.提升:💡6.传说: 📚三、源代码,上代码,可以直接复制使用🎥效果🗂️目录✍️

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象