在小白开发的项目中前端使用的是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. Redis数据结构一之对象的介绍及各版本对应实现

    本文首发于公众号:Hunter后端 原文链接:Redis数据结构一之对象的介绍及各版本对应实现 本篇笔记开始介绍 Redis 数据结构的底层实现. 当我们被问到 Redis 中有什么数据结构,或者说数 ...

  2. CANoe学习笔记(三):CANoe的诊断功能和cdd文件

    内容: UDS诊断学习 CDD文件配置 诊断功能 一.UDS诊断学习: ①.UDS请求命令4种构成方式: SIDSID+SF(Sub-function)SID+DID(Data Identifier) ...

  3. 如何在矩池云上安装和使用 Stata

    Stata是一款功能强大的统计分析软件,本文提供了如何在矩池云安装使用 Stata,以及如何在 Jupyter 中使用 Stata 的简要教程. 安装 Stata 时需要确保按照官方指南进行操作,St ...

  4. 逍遥自在学C语言 | 指针的基础用法

    前言 在C语言中,指针是一项重要的概念,它允许我们直接访问和操作内存地址. 可以说,指针是C语言一大优势.用得好,你写程序如同赵子龙百万军中取上将首级:用得不好,则各种问题层出不穷,有种双拳难敌四手的 ...

  5. MySQL 存储引擎 InnoDB 内存结构之缓冲池

    缓冲池是主存储器中的一个区域,在访问 table 和索引数据时InnoDB会对其进行缓存.缓冲池允许直接从内存中访问频繁使用的数据,从而加快处理速度.在专用服务器上,通常将高达 80% 的物理内存分配 ...

  6. 高并发场景下,6种解决SimpleDateFormat类的线程安全问题方法

    摘要:解决SimpleDateFormat类在高并发场景下的线程安全问题可以有多种方式,这里,就列举几个常用的方式供参考. 本文分享自华为云社区<[高并发]更正SimpleDateFormat类 ...

  7. ISP图像处理—紫边Purple Fringing

    图像紫边存在数码相机.监控摄像头等数字成像图像,使用设备在逆光.大光圈条件下拍摄图像的高反差区域容易出现紫边,解决图像自编问题有助设备得到完美图像. 紫边成因分析和确定有助与紫边消除的图像处理算法研究 ...

  8. kali下对压缩包的压缩与解压(转)

    kali linux 压缩文件解压缩命令(包含7z) tar tar 解包:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName (注:tar是打包 ...

  9. Mysql获取时间戳的一些处理

    前情提要: 老板需要一个统计今日新增用户的功能 我的想法是统计24小时内新增用户的功能 直接去问AI 我明确指出了时间戳 但是AI给出的答案却差了口气 这就是老板给我工资而不是给微软工资的地方 DAT ...

  10. 2023年icpc大学生程序设计竞赛-wmh

    这次比赛名额比较少,程老师还是给了我们新生更多机会,非常感谢.第一次去这么远打比赛,也算是比较开心的,过去那天晚上就被队友拉着出去玩,玩的很嗨,打的很菜.vp去年题的时候是自信的,参加今年正式赛的时候 ...