在小白开发的项目中前端使用的是Vue,虽然在日常工作中可以使用Vue进行开发工作。但是没有系统的学习过Vue,对Vue的一些特性和方法使用时常常需要查询资料解决问题,查询资料常常会占用大量时间,尤其对Vuex的使用。虽然可以通过很多Vue框架中带有的Vuex框架直接使用,但是用的越多,小白就会觉得越混乱、越不明白,只知其用不知其意。于是小白决定系统学习一下Vuex,来补充一下Vue知识。

1.Vuex是什么?

Vuex是一个用于Vue.js应用程序的状态管理模式。它可以集中管理Vue应用程序中的所有组件的状态,并提供了一种机制来保持状态的一致性和可追踪性。

2.Vuex中有哪些对象?

一个Vuex模块中通常包含以下五个对象:namespaced、state、mutations、actions 和 getters。这些对象分别用于定义模块的命名空间、状态、变更操作、异步操作和计算属性。

除了这五个对象,还有一些其他可选的对象可以在模块中使用:

  1. modules:如果你的模块需要进一步细分为子模块,可以使用 modules 对象来组织和嵌套这些子模块。
  2. plugins:你可以使用 plugins 数组来安装Vuex插件,这些插件可以监听活修改状态的变化。
  3. actions的辅助对象:在 actions 中,你可以定义 root 、rootState 、commit 、dispatch 等参数,来访问根模块的状态和调用根模块的 mutations 和 actions。
  4. mutations的辅助对象:在 mutations 中,你可以定义 rootState 参数,来访问根模块的状态。
  plugins: [
// ...
], actions: {
someAction({ rootState, commit, dispatch }) {
// ...
},
}, mutations: {
someMutation(state, { rootState }) {
// ...
},
},

3.从定义层面使用Vuex

  1. 安装Vuex:使用npm或yarn安装Vuex。
  2. 创建一个state:在你的Vue应用程序中创建一个 store 文件夹,并在其中创建一个 store.js 文件。
  3. 定义状态(State):在 store.js 文件中,定义一个包含需要共享的状态的对象。
  4. 定义mutations:在 store.js 文件中,定义一系列用于修改状态的mutations函数。每个mutation函数接收一个state对象作为参数,并根据需要修改状态。
  5. 定义actions:在 store.js 文件中,定义一系列用于处理异步操作的actions函数。每个action函数可以调用一个或多个mutations函数来修改状态。
  6. 定义getters:在 store.js 文件中,定义一系列用于获取state对象的“getters普通对象形式”或用于获取state的计算属性“getters函数”,可以通过“getters”来定义state状态的衍生值或计算属性并获取。getters不是必须的。
  7. 注册store:在你的Vue应用程序的入口文件(main.js)中,导入 store.js 并使用Vue.use()方法注册Vuex。
  8. 在组件中使用状态:使用 this.$store.state 来访问状态,使用 this.$store.commit() 来调用mutations,使用 this.$store.dispatch() 来调用actions。
  9. 示例如下:

store.js

import Vue from 'vue';
import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++;
},
decrement(state) {
state.count--;
},
incrementByParam(state, amount) {
state.count += amount;
},
decrementByParam(state, amount) {
state.count -= amount;
}
},
actions: {
increment(context) {
context.commit('increment');
},
incrementAsync(context) {
setTimeout(() => {
context.commit('increment');
}, 1000);
},
decrement(context) {
context.commit('decrement');
}
},
getters: {
// 对象形式的getters,允许以属性的方式访问计算后的值,而无需调用函数
getCount: state => state.count,
// 函数形式的getters,可以接受额外的参数,并根据传入的参数进行计算返回结果
getCountByParam: (state) => (num) => {
return state.count + num;
}
}
})

main.js

 import store from "xxxxx/store";

new Vue({
store,
// ...其他Vue应用程序的配置...
}).$mount('#app');
组件中使用getters
computed: {
//函数形式的 getters 调用
addNum() {
return this.$store.getters.getCountByParam(2);
},
//对象形式的 getters 调用
getNum() {
return this.$store.getters.getCount;
}
//getters不是必须的
num() {
return this.$store.state.count
}
}
触发Mutations、Actions
//在Vue组件中通过 commit 方法触发Mutations来修改状态
methods: {
increment() {
this.$store.commit('increment');
},
decrement() {
this.$store.commit('decrement');
},
//带参数的increment
incrementByParam() {
this.$store.commit('incrementByParam', 5);
},
incrementAsync() {
this.$store.dispatch('incrementAsync');
},
incrementAction() {
this.$store.dispatch('increment');
}
}

4.项目中使用时,为了项目的扩展性,通常使用Vuex模块来分割和组织状态,如果使用了模块分割需要注意模块命名空间。下面是使用模块的初级示例,其中getters演示了命名空间的使用。

初级:使用模块分割
**store.js:**
```javascript
import Vue from 'vue';
import Vuex from 'vuex';
import userModule from './user'; Vue.use(Vuex); export default new Vuex.Store({
modules: {
user: userModule,
},
});
```
**user.js:**
```javascript
export default {
namespaced: true, state: {
username: '',
email: '',
}, mutations: {
setUsername(state, payload) {
state.username = payload;
}, setEmail(state, payload) {
state.email = payload;
},
}, actions: {
updateUser({ commit }, payload) {
commit('setUsername', payload.username);
commit('setEmail', payload.email);
},
},
getters: {
getUserName: state => state.username
}
};
```
**组件中的使用示例:**
```javascript
computed: {
username() {
return this.$store.state.user.username;
},
username2() {
//如果使用了模块命名空间,就需要采用this.$store.getters['module/getterName']的方式来访问getter函数;
//如果没有使用模块命名空间,可以直接通过this.$store.getters.getterName访问getter函数
return this.$store.getters['user/getUserName']
}
}, methods: {
updateUser() {
this.$store.dispatch('user/updateUser', { username: 'John', email: 'john@example.com' });
},
},

5.真实的项目我们可能需要多个modules,并且每个modules中getters、mutations、actions 和 state 通常会变得非常大,所以它们也需要用单个文件分割。

store.js
import Vue from "vue";
import Vuex from "vuex";
import loggerPlugin from './plugins/logger'; //以下五个文件是当前目录下state、getters、mutations、actions分割出来后的文件
import state from "./state";
import getters from "./getters";
import mutations from "./mutations";
import actions from "./actions"; Vue.use(Vuex); const myPlugin = store => {
store.subscribe((mutation, state) => {
// 在这里可以监听 mutation 的变化和访问 state
});
}; //下面是将整个模块分割出来
import moduleCard from "xxx/cart/moduleCart.js"
import module2 from "xxx/xxx/module2.js"
import { module3 } from "已安装组件" export default new Vuex.Store({
namespaced: true,
state,
getters,
mutations,
actions,
plugins: [loggerPlugin, myPlugin],
modules: {
cart: moduleCart,
moduleName2: module2,
//这个代码片段中的 ...module3 是使用 ES6 的扩展运算符将 module3 模块中的内容解构到 modules 对象中。
//这样做可以方便地将 module3 模块的 state、mutations、getters 和 actions 添加到 Vuex 的模块集合中。
...module3,
},
//在 Vue.js 中,strict 是一个用于开启严格模式的选项。当 strict 设置为 true 时,Vuex 的状态变更会被严格监测,以便捕捉到状态的不合规变更。
//在你提供的代码中,process.env.NODE_ENV !== "production" 是一个条件判断语句,它用于根据当前运行环境来确定是否开启严格模式。通常,在开发环境中,我们会将 process.env.NODE_ENV 设置为 "development",而在生产环境中会设置为 "production"。
//当 process.env.NODE_ENV !== "production" 为 true 时,说明当前不处于生产环境,此时 strict 会被设置为 true,即开启严格模式。这样做的目的是为了方便在开发阶段捕捉到状态变更的错误,以及进行更加详细的状态变更追踪和错误提示。
//一般来说,建议在开发环境中开启严格模式,而在生产环境中关闭严格模式,以获得更好的性能和体验。这可以通过构建工具(如 webpack)来设置 process.env.NODE_ENV 的值来实现。
strict: process.env.NODE_ENV !== "production",
});

下面用moduleCart作为示例来演示一个Vuex模块中五个对象的分割: namespaced,state,mutations,actions 和 getters。创建一个文件夹名为cart,在文件夹中创建五个文件分别为moduleCart.js、moduleCartActions.js、moduleCartGetters.js、moduleCartMutations.js和moduleCartState.js

moduleCart.js
 import state from "./moduleCartState.js";
import mutations from "./moduleCartMutations.js";
import actions from "./moduleCartActions.js";
import getters from "./moduleCartGetters.js"; export default {
namespaced: true,
state: state,
mutations: mutations,
actions: actions,
getters: getters,
};
moduleCartActions.js
在actions中可以使用store,以使用已存状态数据
import store from "../store.js"; export const addToCart = ({ commit }, product) => {
commit('addProduct', product);
}; export const removeFromCart = ({ commit }, productId) => {
commit('removeProduct', productId);
}; //或者下面方式
export default {
addToCart({ commit }, product) {
commit('addProduct', product);
},
removeFromCart({ commit }, product) {
commit('removeProduct', productId);
},
//包含辅助对象的action,使用`rootState`来访问根模块的状态,使用`state`来访问当前模块的状态
addToCart2({ commit, rootState, state }) {
commit('addProduct', product);
console.log(rootState); // 访问根模块的状态
console.log(state); // 访问模块的状态
},
removeFromCart2({ commit, rootState }) {
commit('removeProduct', productId);
console.log(rootState); // 访问根模块的状态
},
}
moduleCartGetters.js
export const cartProducts = state => state.products;

export const totalItems = state => state.products.length;

或者

export default {
cartProducts:state => state.products,
totalItems: state => state.products.length,
cartProducts2(state, getters, rootState, rootGetters) {
console.log(rootState); // 访问根模块的状态
console.log(rootGetters); // 访问根模块的getters
return state.products;
},
};
moduleCartMutations.js
 export const addProduct = (state, product) => {
state.products.push(product);
}; export const removeProduct = (state, productId) => {
state.products = state.products.filter(p => p.id !== productId);
}; 或者
import Vue from "vue";
export default {
addProduct(state, product) {
Vue.set(state, "products", product);
},
removeProduct(state, productId) {
Vue.set(state, "products", state.products.filter(p => p.id !== productId))
}
}
moduleCartState.js
 export default {
products: [],
};

小白整理了VUEX的更多相关文章

  1. 替小白整理的 linux基操命令 切勿扣6 不用感谢

    Linux --------小白必会的基本命令 命令行提示字符[root@localhost ~]#[当前登录系统的用户@主机名称 当前所在的目录]## 表示为管理员登录$ 表示为普通用户登录   切 ...

  2. 给小白整理的一篇Python知识点

    1.基本概念 1.1 四种类型 python中数有四种类型:整数.长整数.浮点数和复数. python中数有四种类型:整数.长整数.浮点数和复数. 整数, 如 1 长整数 是比较大的整数 浮点数 如 ...

  3. vue实例讲解之vuex的使用

    vuex是一个状态管理插件,本文通过一个简单的实例来讲解一下,vuex的使用. 先看一张官方的图: 这个图新手一看估计是蒙的,简单解释一下,这个图表示的就是vue通过Action Mutations ...

  4. 使用python划分数据集

    无论是训练机器学习或是深度学习,第一步当然是先划分数据集啦,今天小白整理了一些划分数据集的方法,希望大佬们多多指教啊,嘻嘻~ 首先看一下数据集的样子,flower_data文件夹下有四个文件夹,每个文 ...

  5. 新入门的小白,整理一下特别简单实用的div+css兼容性的问题。

    最近整理了一下特别简单的div+css的不同浏览器的兼容性的问题,跟大家分享一下,只适合刚入门的新手,欢迎大牛们给提出意见. 1. 默认的内外边距不同 问题: 各个浏览器默认的内外边距不同 解决: * ...

  6. vuex - 常用命令学习及用法整理

    https://vuex.vuejs.org/zh-cn/api.html 命令 用途 备注 this.$store 组件中访问store实例 store.state.a 获取在state对象中的数据 ...

  7. 【整理】解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function

    解决vue不相关组件之间的数据传递----vuex的学习笔记,解决报错this.$store.commit is not a function https://www.cnblogs.com/jaso ...

  8. 关于flask(前后端分离)的后端开发的小白笔记整理(含postman,jwt,json,SQLAlchemy等)

    首先是提醒自己的一些唠嗑: 学会劳逸结合,文档看累了可以看视频,动手操作很关键,遇到问题先动脑子冷静地想,不要跟着步骤都不带脑子,想不出来了再查一查!有时候打出来的代码很虚,但是实践不花钱,实践出真知 ...

  9. Vue技术点整理-Vuex

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

  10. Docker小白到实战之容器数据卷,整理的明明白白

    前言 上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失.从隔离性的角度来看,数据就应该和容器共存亡:但 ...

随机推荐

  1. Selenium - 基础知识介绍

    Selenium - 基础知识介绍 介绍 Selenium是ThoughtWorks员工在业余时间开发并维护的开源项目,并且在ThoughtWorks的项 目中被广泛应用. 简单地说,Selenium ...

  2. Django接入SwaggerAPI接口文档-完整操作(包含错误处理)

    Swagger的简介: Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务,在做后端开发的同时自动生成一个API文档供前端查看,当接口有变动时,对应的接口 ...

  3. Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp; nested exception is java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp

    好久没记录了,最近一直在忙着工作以及码前后端 记录下这种大多数人都会碰到但是又不一定找得到问题的错误 1 Value '0000-00-00 00:00:00' can not be represen ...

  4. Netty实战(一)

    目录 第一章 Java网络编程 1.1 Java NIO 1.2 选择器 第二章 Netty是什么 2.1 Netty简介 2.2 Netty的特性 2.2.1 设计 2.2.2 易于使用 2.2.3 ...

  5. SpringMVC 后台从前端获取单个参数

    1.编写web.xml(模板) 2.springmvc配置文件 3.编写对应数据库字段的pojo实体类 @Data @AllArgsConstructor @NoArgsConstructor pub ...

  6. JavaWeb编程面试题——Spring Web MVC

    引言 面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待.不以刷题进大厂为目的,而是以学习为目的.这里的知识点会持续更新,目录也会随时进行调整. 关注公众号:编 ...

  7. xpoc漏洞使用与编写 浅尝

    下载地址 https://github.com/chaitin/xpoc/releases 目前最新版本是 0.0.4 可能是我还是不太习惯yaml这种结构的,感觉就很反人类,所以我以前一般都还是po ...

  8. 2023-06-17:说一说redis中渐进式rehash?

    2023-06-17:说一说redis中渐进式rehash? 答案2023-06-17: 在Redis中,如果哈希表的数组一直保持不变,就会增加哈希冲突的可能性,从而降低检索效率.为了解决这个问题,R ...

  9. RPA自动化如何帮助企业提高业务业务洞察力

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...

  10. MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(8)-Ant Design Blazor前端框架搭建

    前言 前面的章节我们介绍了一些值得推荐的Blazor UI组件库,通过该篇文章的组件库介绍最终我选用Ant Design Blazor这个UI框架作为ToDoList系统的前端框架.因为在之前的工作中 ...