【前端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

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD