在小白开发的项目中前端使用的是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. flutter系列之:使用AnimationController来控制动画效果

    目录 简介 构建一个要动画的widget 让图像动起来 总结 简介 之前我们提到了flutter提供了比较简单好用的AnimatedContainer和SlideTransition来进行一些简单的动 ...

  2. Deferred Components-实现Flutter运行时动态下发Dart代码 | 京东云技术团队

    导读 Deferred Components,官方实现的Flutter代码动态下发的方案.本文主要介绍官方方案的实现细节,探索在国内环境下使用Deferred Components,并且实现了最小验证 ...

  3. odoo开发教程六:工作流、安全机制、向导

    一:工作流 工作流是与业务流程相关联的模型,可用于跟踪工序的动态演变过程. 工作流.活动(节点或操作).转换通常在xml里以record定义.在工作流中处理的单个流程称为工作项. 与模型关联的工作流是 ...

  4. Windows系统中,如何快速找到端口被占用的进程?

    在本地调试代码时,经常遇到端口被占用导致启动失败的问题,又不能很快找到哪个进程占用了端口,很是恼火. 今天,我们用shell命令轻松搞定. 一.打开命令提示符 window+R 组合键,调出命令窗口. ...

  5. Python 列表、字典、元组的一些小技巧

    1. 字典排序 我们知道 Python 的内置 dictionary 数据类型是无序的,通过 key 来获取对应的 value.可是有时我们需要对 dictionary 中的 item 进行排序输出, ...

  6. Anaconda 使用的一些体验与困惑

    Channels 使用 需要注意的是做生信分析的童鞋使用 conda 环境时一定要特别注意 conda channels 的设置,滥用 channels 很有可能会导致你的软件升降级(甚至环境)错乱. ...

  7. C2简介

    C2简介 学习命令与控制的基本知识,帮助您成为更好的红队队员并简化您的下一次红队评估! thm:https://tryhackme.com/room/introtoc2 介绍 命令与控制 ( C2 ) ...

  8. PowerShell脚本的基础知识

    参考文档https://learn.microsoft.com/zh-cn/powershell/scripting/samples/viewing-object-structure--get-mem ...

  9. Python自动化测试面试题精选(一)

    Python自动化测试面试题精选 今天由勇哥给你介绍一些Python自动化测试中常见的面试题,涵盖了Python基础.测试框架.测试工具.测试方法等方面的内容,希望能够帮助你提升自己的水平和信心. 项 ...

  10. Vue3 之 响应式 API reactive、 effect源码,详细注释

    Vue3之响应式 API reactive. effect源码,详细注释 目录 一.实现响应式 API:reactive.shallowReactive.readonly.shallowReadonl ...