首页 > 其他分享 >Vuex 核心揭秘:打造高效前端状态库

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

时间:2024-07-03 23:57:05浏览次数:21  
标签:状态 Vue 前端 getters state Vuex 揭秘 store

引言

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.

    标签:状态,Vue,前端,getters,state,Vuex,揭秘,store
    From: https://blog.csdn.net/a3098448071/article/details/140163780

相关文章

  • Vue技巧大揭秘:自定义指令的力量与应用
    引言自定义指令就像是给予开发者的一把魔法钥匙,它能够打开DOM操作的新世界,按我的理解就是把对DOM操作的逻辑进行封装全局注册与局部注册全局注册定义: 全局注册意味着自定义指令在Vue实例创建之前通过Vue.directive()方法注册,一旦注册,就可以在任意组件的模板中使用该指令。......
  • 如何理解vuex中的每个概念(通俗易懂)
    文章目录1.什么是Vuex?2.Vuex的四个核心概念1.什么是Vuex?想象一下,你家里有一个大冰箱,所有家庭成员都可以访问这个冰箱。每个人都可以往里面放东西,也可以从里面拿东西。这个冰箱就像是Vuex中的“状态”,每个家庭成员(Vue组件)都可以共享这个状态。2.Vuex的......
  • 揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证
    揭秘JWT:从CTF实战到Web开发,使用JWT令牌验证介绍JWT(JSONWebTokens)是一种开放标准(RFC7519),它定义了一种紧凑且自包含的方式,用于在网络上安全地传输信息。这种信息可以验证和信任,因为它是数字签名的。JWT可以使用HMAC算法或者是RSA的公私秘钥对进行签名。「优点」:「无状态」:服......
  • web前端应用性能指标测量工具有哪些?
    接上一篇介绍前端性能指标的内容,本文主要总结下一般使用的性能测量工具。1、可以借助Gooogle开源的web-vitals库来测量一些性能指标:import{onCLS,onINP,onLCP,onFCP,onFID,onTTFB}from'web-vitals';onCLS(console.log);onINP(console.log);onLCP(console.log);o......
  • web前端应用性能指标优化方案有哪些?
    接上一篇介绍前端性能指标的内容,本文主要总结下一般使用的指标优化方案加载相关:FCP优化:降低服务器响应时间:确保服务器能迅速响应请求,这样浏览器就能更快地开始处理并渲染页面内容。可以通过优化服务端代码、改善静态资源的提供方式(如将图片部署到CDN)来实现。延迟加载非关......
  • web前端应用应该关注哪些性能指标?
    作为一个有经验的前端开发工程师来说,关注性能是必不可少的一项日常工作,那么应该重点关注一些什么样的性能指标呢?其实主要还是从用户体验的角度来看,一般我们会从页面加载相关、交互相关方面入手。原文:前端性能指标,一网打尽FCP:首次内容绘制LCP:最大内容绘制TTFB:首字节时间TBT:总......
  • 前端如何优雅的添加水印及去除水印
    ......
  • 区块链技术如何有效防御DDOS攻击?揭秘前沿安全策略!
    在当今数字化时代,DDOS(分布式拒绝服务)攻击已成为网络安全的重大威胁之一。这些攻击通过控制大量计算机或网络设备,向目标服务器发送海量请求,导致服务器过载、响应缓慢甚至完全崩溃。然而,区块链技术作为一种新兴的安全解决方案,正逐步展现出在DDOS防御中的巨大潜力。区块链技术的......
  • 5% 消耗,6 倍性能:揭秘新一代 iLogtail SPL 日志处理引擎与 Logstash 的 PK
    作者:阿柄引言在当今数据驱动的时代,日志收集和处理工具对于保障系统稳定性和优化运维效率至关重要。随着企业数据量的不断增加和系统架构的日益复杂,传统日志处理工具面临着性能、灵活性和易用性等多方面的挑战。Logstash作为一款广受欢迎的开源日志收集与处理工具,早已广泛应用于......
  • 揭秘!FFmpeg+Whisper双剑合璧:解锁视频到文本的二阶段奇迹
    解锁视频到文本的二阶段奇迹一、引言二、视频音频提取与处理视频音频提取与处理2.1环境搭建2.2视频音频提取2.3音频预处理示例代码:三、语音识别与翻译3.1加载Whisper模型3.2语音识别3.3语言检测与翻译四、结果处理与验证4.1结果整理4.2视频与文本同步验证五......