Vuex 核心揭秘:打造高效前端状态库

引言

Vue.js 是一个流行的 JavaScript 框架,以其简洁的设计和易用的特性赢得了开发者的青睐。它允许开发者通过声明式的方式编写前端代码,从而提高开发效率。

Vuex 是 Vue.js 的官方状态管理库,它为 Vue 应用提供了一个中心化存储,使得所有组件都能够访问和更新共享状态。这对于大型应用来说尤为重要,因为它可以避免状态混乱和难以维护的问题。

为什么需要 Vuex?

随着应用规模的扩大,组件之间的状态管理会变得越来越复杂。Vuex 提供了一套完整的解决方案,通过集中管理状态,使得状态的变化可预测、可追踪,从而提高了应用的可维护性。

作者本人学这一块知识点的时候倍感抽象,于是想写一篇博客给正在迷惑的朋友们

vuex简介

Vuex 的各个核心概念在 Vue 应用程序中都有对应的类似概念,下面是对应关系的一个简单说明:

  1. 状态(State)

    • 类似于 Vue 组件的 data 属性,用于存储组件的响应式数据。在 Vuex 中,state 用于存储整个应用的全局状态。
  2. Getters

    • 类似于 Vue 组件的 computed 计算属性,它们用于从其他数据派生出新的数据。在 Vuex 中,getters 用于从 state 中派生出一些状态,这些状态可以根据 state 的变化而缓存或重新计算。
  3. Mutations

    • 类似于 Vue 组件的 methods 中的方法,用于改变组件的 data。在 Vuex 中,mutations 用于改变 state 的状态,它们必须是同步的,以确保状态的改变是可追踪和可预测的。
  4. Actions

    • 类似于 Vue 组件的 methods 中的方法,但是用于处理异步操作。在 Vuex 中,actions 用于提交 mutations,而不是直接改变状态。actions 可以包含任何异步操作,如 API 请求。
  5. Modules

    • 类似于 Vue 组件的 components,它们允许你将一个大的组件拆分成多个小的、可复用的组件。在 Vuex 中,modules 允许你将一个大的 store 拆分成多个小的、可管理的模块,每个模块都有自己的 statemutationsactions 和 getters

安装和配置 Vuex

首先,你得通过 npm 或者 yarn 把 Vuex 安装到你的项目里。打开终端,敲入下面的命令之一:

npm install vuex --save
# 或者
yarn add vuex

安装完毕后,下一步是创建一个 Vuex 的 store。这个 store 就像是你应用状态的大脑,它知道所有的事情,比如你的数据是什么,数据怎么变化,等等。创建 store 的代码通常放在一个叫 store.js 的文件里。

// 引入 Vue 和 Vuex
import Vue from 'vue';
import Vuex from 'vuex';

// 告诉 Vue 使用 Vuex
Vue.use(Vuex);

// 创建一个新的 Vuex store 实例
const store = new Vuex.Store({
  // 在 state 对象里定义你的应用状态
  state: {
    count: 0 // 假设我们有一个计数器
  },
  // mutations 是用来修改状态的地方
  mutations: {
    increment(state) {
      state.count++; // 每次调用这个 mutation,计数器就加一
    }
  },
  // actions 是用来提交 mutations 的,可以包含异步操作
  actions: {
    increment(context) {
      context.commit('increment'); // 这个 action 提交了 increment mutation
    }
  },
  // getters 是用来从状态派生出其他状态的方法
  getters: {
    getCount: state => state.count // 这个 getter 返回计数器的当前值
  }
});

// 把 store 导出,这样其他组件就能用到它了
export default store;

最后一步是在你的 Vue 应用程序里使用这个 store。在你的主文件,比如 main.js 或 index.js,你需要做的是导入这个 store,并且在创建 Vue 实例的时候把它加进去。

import Vue from 'vue';
import App from './App.vue'; // 这是你的根组件
import store from './store'; // 导入我们刚刚创建的 store

// 创建 Vue 实例,把 store 作为配置的一部分
new Vue({
  store, // 这样一来,store 就可以在整个应用中使用啦
  render: h => h(App)
}).$mount('#app');

扩展(当项目比较大时)

在 Vuex 中,如果你的应用状态变得复杂,你可以通过创建模块(modules)来划分子状态管理。这样做可以让你的 store 更加模块化和可维护。下面是如何操作的步骤:

1. 创建主 store 文件(index.js

首先,创建一个主 store 文件(通常是 index.js),在这个文件中,你将导入并组合所有的模块。

请注意,记得导入分模块

import user from './modules/user';

import Vue from 'vue';
import Vuex from 'vuex';
import user from './modules/user';

Vue.use(Vuex);

export default new Vuex.Store({
  modules: {
    user
  }
});
2. 创建用户模块(modules/user.js

然后,创建一个用户模块(modules/user.js),在这个文件中,你将定义用户相关的 state、mutations、actions 和 getters。

const state = {
  userInfo: {}
};

const mutations = {
  SET_USER_INFO(state, userInfo) {
    state.userInfo = userInfo;
  }
};

const actions = {
  setUser({ commit }, userInfo) {
    commit('SET_USER_INFO', userInfo);
  }
};

const getters = {
  userInfo: state => state.userInfo
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
};
3. 在组件中使用模块

在你的 Vue 组件中,你可以通过 this.$store 访问主 store,并通过模块的名称空间来访问模块内的 state、mutations、actions 和 getters。

例如,在组件中设置用户信息:

this.$store.dispatch('user/setUser', { name: 'John Doe', age: 30 });

/*这里,我们调用了 dispatch 方法,这是 Vuex store 的一个方法,用来触发一个 action。Action 是一个函数,它可以包含异步操作,比如从服务器获取数据或者延迟执行代码。

我们传给 dispatch 方法的第一个参数 'user/setUser' 是 action 的路径。因为我们使用了模块,所以这个路径包含了模块的名称 'user' 和 action 的名称 'setUser'。这样,Vuex 可以找到正确的 action 并执行它。

第二个参数 { name: 'John Doe', age: 30 } 是一个载荷(payload),它是一个对象,包含了我们想要传递给 action 的数据。在这个例子中,我们传递了一个包含用户名字和年龄的对象。

当 dispatch 方法被调用时,Vuex 会查找名为 setUser 的 action,并执行它。在 action 内部,我们可以执行任何我们想要的操作,比如异步请求或者复杂的逻辑,然后当我们准备好了的时候,我们可以提交一个 mutation 来改变 store 中的状态。*/

获取用户信息:

console.log(this.$store.getters['user/userInfo']);
/*
这里,我们使用了 console.log 来打印出某个值。我们想要打印的是 this.$store.getters['user/userInfo']。

this.$store:这是访问 Vuex store 的方式,$store 是 Vue 实例上的一个属性,它在 Vue 实例中注入了 Vuex store。
getters:这是 store 上的一个属性,包含了所有定义的 getter 函数。
'user/userInfo':这是 getter 的路径,由于我们使用了模块,所以需要加上模块的名称空间 'user/' 作为前缀。userInfo 是在用户模块中定义的一个 getter。
*/
注意事项
  • namespaced: true:这个选项使得模块内部的 actions、mutations 和 getters 都被限定在模块的名称空间内。这样,你在组件中使用这些功能时,需要加上模块名称作为前缀。
  • 模块的状态是嵌套的,所以你在主 store 的 state 中可以通过模块名称来访问子状态,例如 this.$store.state.user.userInfo

 

扩展:进一步解释 Vuex 中 this.$store 的常用方法

  1. this.$store.state

    • this.$store.state 是访问 Vuex store 中状态(state)的地方。状态是响应式的,直接反映了应用的当前数据。
    • 例如,如果你想要获取 store 中的计数器值,你可以这样写:console.log(this.$store.state.count)
  2. this.$store.getters

    • this.$store.getters 是访问 Vuex store 中通过 getters 派生出来的状态。Getters 可以对 state 进行计算和加工。
    • 例如,如果你有一个名为 doubleCount 的 getter,你可以这样访问它:console.log(this.$store.getters.doubleCount)
  3. this.$store.commit(‘mutationName’, payload)

    • this.$store.commit 是提交 mutation 来更改 store 的状态。Mutations 是同步函数。
    • 例如,如果你有一个名为 increment 的 mutation,你可以这样提交它:this.$store.commit('increment', { amount: 10 })
  4. this.$store.dispatch(‘actionName’, payload)

    • this.$store.dispatch 是分派 action,Action 可以包含异步操作,并且可以触发多个 mutations。
    • 例如,如果你有一个名为 fetchUser 的 action,你可以这样分派它:this.$store.dispatch('fetchUser', { userId: 1 })
  5. this.$store.watch(fn, callback, options)

    • this.$store.watch 是观察 Vuex store 中的某个状态或 getter,当状态变化时执行回调函数。
    • 例如,如果你想要观察 count 状态的变化,你可以这样写:this.$store.watch((state) => state.count, (newCount, oldCount) => { console.log(Count changed from${oldCount} to ${newCount}); })

总结

  • Vuex 简介:Vuex 是 Vue.js 的官方状态管理库,提供了一个中心化存储来管理应用状态,有助于大型应用的状态管理。
  • 核心概念:Vuex 的核心概念包括 State(状态)、Getters(派生状态)、Mutations(同步更改状态)、Actions(异步操作)和 Modules(状态管理模块)。
  • 安装和配置:通过 npm 或 yarn 安装 Vuex,并在主文件中创建一个 Vuex Store,然后将 Store 注入到 Vue 实例中。
  • 模块化:如果你的应用状态变得复杂,可以通过创建模块来划分状态管理,使 Store 更加模块化和可维护。
  • 常用方法:使用 this.𝑠𝑡𝑜𝑟𝑒.𝑠𝑡𝑎𝑡𝑒访问状态,𝑡ℎ𝑖𝑠.store.state访问状态,this.store.getters 访问派生状态,this.𝑠𝑡𝑜𝑟𝑒.𝑐𝑜𝑚𝑚𝑖𝑡提交状态更改,𝑡ℎ𝑖𝑠.store.commit提交状态更改,this.store.dispatch 分派异步操作,this.$store.watch 观察状态变化。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion web UI 插件

2024.7.3更新,持续更新中 如果需要在linux上自己安装sd,参考:stable diffusion linux安装 插件复制到 /stable-diffusion-webui/extensions 目录下,然后重新启动sd即可 一、插件安装方法 每种插件的安装方法可能略有不同&#xf…

Redis分布式锁的应用场景有哪些

⼀ 、应⽤场景 在多线程并发的场景下 ,Java Synchronized/Reentrantlock 锁能够实现同⼀个JVM进程内多线程 并发的安全性 ,但⽆法保证多个JVM进程实例构成的集群环境在多线程下的安全性。在⼀些业务场景 下需要引⼊分布式锁。 1、缓存击穿 当某个热点缓…

精确计算应用的冷启动耗时

在iOS项目中,冷启动时间是指从用户点击应用图标开始,到应用完全加载并呈现出第一个界面(可能需要网络请求必要的数据)所花费的时间。这里以 main 函数为界,分为两个时间段: 从用户点击应用图标 ~ invoke m…

深度学习简介-AI(三)

深度学习简介 深度学习简介深度学习例子深度学习训练优化1.随机初始化2.优化损失函数3.优化器选择4.选择/调整模型结构 深度学习常见概念隐含层/中间层随机初始化损失函数导数与梯度优化器Mini Batch/epoch 深度学习训练逻辑图 深度学习简介 深度学习例子 猜数字 A: 我现在心…

24年河南特岗教师招聘流程+报名流程

河南特岗教师报名流程如下 1.登录河南省特岗招聘网 登录河南省特岗招聘网注册账号和密码,账号可以是手机号或者身份证号,密码自己设置 2.注册登录账号 注册完账号重新登录账号,输入身份证号、手机号、密码、验证码 3.浏览考试须知 填写个人信…

Unity Shader技巧:实现带投影机效果,有效避免边缘拉伸问题

这个是原始的projector 投影组件,边缘会有拉伸 经过修改shader 后边缘就没有拉伸了 (实现代码在文章最后) 这个着色器通过检查每个像素的UV坐标是否在定义的边界内,来确定是否应用黑色边框。如果UV坐标处于边缘区域,那么像素颜色会被强制设为黑色,从而在投影图像周围形成一…

JWT入门

JWT与TOKEN JWT(JSON Web Token)是一种基于 JSON 格式的轻量级安全令牌,通常用于在网络应用间安全地传递信息。而“token”一词则是一个更广泛的术语,用来指代任何形式的令牌,用于在计算机系统中进行身份验证或授权。J…

云原生技术架构详解

云原生技术最全详解(图文全面总结) 容器技术 容器技术:是将应用程序、及其所有依赖项,打包到一个独立的、可移植的容器中。 如下图所示: 容器技术的实现,最典型的就是以Docker为代表的。 如下图所示: 主要解决: 1、…

【ROS中Cjson文件的作用】

在ROS (Robot Operating System) 中,.json 文件通常用于存储配置信息、数据序列化或者在某些情况下用于网络通信和数据交换。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于…

UE4_材质_使用彩色半透明阴影

学习笔记,不喜勿喷!侵权立删,祝愿大美临沂生活越来越好! 本教程将介绍如何配置虚幻引擎来投射彩色半透明阴影。 此功能在许多应用中都很有用,常见例子就是透过彩色玻璃窗的彩色光。 一、半透明阴影颜色 阴影在穿过半…

【Python机器学习】模型评估与改进——带交叉验证的网格搜索

虽然将数据划分为训练集、验证集、测试集的方法是可行的,也相对常用,但这种方法对数据的划分相当敏感,为了得到对泛化性能的更好估计,我们可以使用交叉验证来评估每种参数组合的性能,而不是仅将数据单次划分为训练集与…

模拟退火算法2—优缺点

模拟退火算法优点 1、以一定的概率接受恶化解 模拟退火算法(SA)在搜索策略上与传统的随机搜索方法不同,它不仅引入了适当的随机因素,而且还引入了物理系统退火过程的自然机理。这种自然机理的引入使模拟退火算法在迭代过程中不仅接受使目标函数变“好”的试探点,而且还能以一…

Hadoop权威指南-读书笔记-02-关于MapReduce

Hadoop权威指南-读书笔记 记录一下读这本书的时候觉得有意思或者重要的点~ 还是老样子~挑重点记录哈😁有兴趣的小伙伴可以去看看原著😊 第二章 关于MapReduce MapReduce是一种可用于数据处理的编程模型。 MapReduce程序本质上是并行运行的&#xff0c…

行业模板|DataEase旅游行业大屏模板推荐

DataEase开源数据可视化分析工具于2022年6月发布模板市场(https://templates-de.fit2cloud.com),并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板,方便用户根据…

网络安全--计算机网络安全概述

文章目录 网络信息系统安全的目标网络安全的分支举例P2DR模型信息安全模型访问控制的分类多级安全模型 网络信息系统安全的目标 保密性 保证用户信息的保密性,对于非公开的信息,用户无法访问并且无法进行非授权访问,举例子就是:防…

Andriod安装termux并换源

问题汇总 Error: The repository ‘https://mirrors.tuna.tsinghua.edu.cn/termux/termux-package-24 stable Release’ does not have a Release file. 更换源(这里使用的是清华大学源) 打开文件 nano $PREFIX/etc/apt/sources.list手动修改 deb htt…

Powershell 获取电脑保存的所有wifi密码

一. 知识点 netsh wlan show profiles 用于显示计算机上已保存的无线网络配置文件 Measure-Object 用于统计数量 [PSCustomObject]{ } 用于创建Powershell对象 [math]::Round 四舍五入 Write-Progress 显示进度条 二. 代码 只能获取中文Windows操作系统的wifi密码如果想获取…

ETCD概述--使用/特性/架构/原理

ETCD概述 ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景. 如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com 特性 …

红酒与文学:探索文字背后的酒香

在文学的海洋中,红酒如同一股不同的香风,轻轻拂过书页,为文字的世界增添了一抹诱人的色彩。今天,就让我们一起踏上这段奇妙的旅程,探索红酒与文学之间的奇妙联系,感受文字背后的酒香,特别是以雷…

第11章 规划过程组(二)(11.8排列活动顺序)

第11章 规划过程组(二)11.8排列活动顺序,在第三版教材第388~389页;文字图片音频方式 第一个知识点:主要工具与技术(重要知识点) 1、紧前关系绘图法(PDM)或前导图法&#…