【Vue】Vuex详解,一文读懂并使用Vuex

news2024/11/25 6:28:15

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《ELement》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

目录

一、适合初学者使用,保存数据以及获取数据

1、在store文件夹,新建个index.js文件(命名看个人习惯,如果没有该文件夹,可以新建一个,当然也可以不建文件夹,直接新建个js文件也是可以的)

2、main.js引用:(注意路径即可)

3、保存数据:(场景举例:当我点击按钮后,我需要把当前的数据保存到vuex中,然后跳转到别的路由,然后使用这些数据)

4、获取变量:(当数据初始获取不到时,可以使用计算属性用来获取)

二、模块化(适合有部分基础的人)

1、state.js :保存所有数据,以对象的方式导出

2、mutations.js :保存所有方法,用来改变state的数据

3、actions.js :暴露给用户使用,借此触发mutations中的方法,保存数据(可执行异步操作)

4、index.js:引入相应模块,暴露出store,供vue注册后全局使用

5、main.js中引入index.js

6、保存数据

7、获取数据


vuex是使用vue中必不可少的一部分,基于父子、兄弟组件,我们传值可能会很方便,但是如果是没有关联的组件之间要使用同一组数据,就显得很无能为力,那么vuex就很好的解决了我们这种问题,它相当于一个公共仓库,保存着所有组件都能共用的数据。

那么,我们一起来看看vue项目怎么使用它吧。(如果你对vuex有一定了解,不是刚接触的小白,请忽略第一步,直接查看第二步)

一、适合初学者使用,保存数据以及获取数据

1、在store文件夹,新建个index.js文件(命名看个人习惯,如果没有该文件夹,可以新建一个,当然也可以不建文件夹,直接新建个js文件也是可以的)

在新建的js文件中写入如下代码:

import Vue from "vue"
import Vuex from "vuex"
 
Vue.use(Vuex);
 
export default new Vuex.Store({
    state:{
        pathName: "",
        currDbSource: {},
        currJobData: {},
        DbSource: []
    },
    mutations:{
        // 保存当前菜单栏的路径
        savePath(state,pathName){
            state.pathName = pathName;
        },
        // 保存当前点击的数据源
        saveCurrDbSource(state,currDbSource){
            state.currDbSource = currDbSource;
        },
        // 保存当前点击的元数据
        saveCurrJobData(state,currJobData){
            state.currJobData = currJobData;
        },
        // 保存所有数据源
        saveDbSource(state,DbSource){
            state.DbSource = DbSource;
        }
    }
})

这里解释一下各个代码段的作用:state是自定义的一些变量,需要用来保存数据,mutations是用来触发事件,相当于方法,用户需要通过触发这个方法,借此来保存数据,参数的话,第二个参数就是用户传入的值,然后在方法中赋值给state中的变量

2、main.js引用:(注意路径即可)

// 引入vuex-store
import store from './store/index';
 
new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
});

3、保存数据:(场景举例:当我点击按钮后,我需要把当前的数据保存到vuex中,然后跳转到别的路由,然后使用这些数据)

methods:{
    click(){
        // 点击按钮进行一些操作,然后保存数据
        this.$store.commit('saveCurrDbSource',this.db)
    }
}

这里的第一个参数是要触发的方法,也就是上面mutations中的方法,第二个参数是你要传递的数据

4、获取变量:(当数据初始获取不到时,可以使用计算属性用来获取)

this.$store.state.变量名
 
// 例如
this.$store.state.currDbSource

这样其他组件就可以共用这个保存起来的数据了,也能进行相应的修改

二、模块化(适合有部分基础的人)

当然,上述方法中我们把所有东西都写在一个文件中了,这样数据多的时候,耦合度太高,也不便于维护,而且mutations也不能解决异步问题,这里就介绍另一种方式以及actions

actions:看过官网介绍的人都知道,这是间接触发mutations方法的一种 " 中间商 ",而且它可以执行异步操作,避免用户去直接操作state

1、state.js :保存所有数据,以对象的方式导出

export default {
  pathName: '', // 路由
  currDbSource: {}, // 当前数据源
  currJobData: {}, // 当前元数据
  DbSource: [], // 所有数据源,供元数据界面下拉列表使用
  selectJobMeta: {}, // 当前选择的元数据(搜索后点击的单条数据)
  specialSubject: [], // 专题数据(多条)
  duplicateJobMeta: {}, // 复制的数据
};

2、mutations.js :保存所有方法,用来改变state的数据

// 保存当前菜单栏的路径
export const savePath = (state, pathName) => {
  state.pathName = pathName;
};
 
// 保存当前点击的数据源
export const saveCurrDbSource = (state, currDbSource) => {
  state.currDbSource = currDbSource;
};
 
// 保存当前点击的元数据
export const saveCurrJobData = (state, currJobData) => {
  state.currJobData = null;
  state.currJobData = currJobData;
};
 
// 保存所有数据源
export const saveDbSource = (state, DbSource) => {
  state.DbSource = DbSource;
};
 
// 保存搜索后选择的那一条元数据
export const saveSelectJobMeta = (state, selectJobMeta) => {
  state.selectJobMeta = selectJobMeta;
};
 
// 保存搜索的那一类专题
export const saveSpecialSubject = (state, specialSubject) => {
  state.specialSubject = specialSubject;
  state.selectJobMeta = {};
};
 
// 保存复制的元数据(名称为空)
export const saveDuplicateJobMeta = (state, duplicateJobMeta) => {
  state.duplicateJobMeta = duplicateJobMeta;
};

3、actions.js :暴露给用户使用,借此触发mutations中的方法,保存数据(可执行异步操作)

// 触发保存菜单栏的路径方法
export const savePath = ({ commit }, payload) => {
  commit('savePath', payload);
};
 
// 触发获取当前点击的数据源方法
export const saveCurrDbSource = ({ commit }, payload) => {
  commit('saveCurrDbSource', payload);
};
 
// 触发获取当前点击的元数据方法
export const saveCurrJobData = ({ commit }, payload) => {
  commit('saveCurrJobData', payload);
};
 
// 触发获取所有数据源方法
export const saveDbSource = ({ commit }, payload) => {
  commit('saveDbSource', payload);
};
 
// 触发保存搜索后选择单条元数据方法
export const saveSelectJobMeta = ({ commit }, payload) => {
  commit('saveSelectJobMeta', payload);
};
 
// 触发保存搜索专题数据方法
export const saveSpecialSubject = ({ commit }, payload) => {
  commit('saveSpecialSubject', payload);
};
 
// 触发保存复制元数据方法
export const saveDuplicateJobMeta = ({ commit }, payload) => {
  commit('saveDuplicateJobMeta', payload);
};

这里有2种方式:

// 方法一:
export const saveDbSource = (context, payload) => {
   context.commit('saveDbSource', payload);
};
 
// 方法二:
export const saveDbSource = ({ commit }, payload) => {
  commit('saveDbSource', payload);
};

第一种是通过 context上下文用来触发事件,一种是直接通过commit,为了保存数据,都需要加第二个参数payload,不然保存到vuex的数据就是空值

4、index.js:引入相应模块,暴露出store,供vue注册后全局使用

import Vue from 'vue';
import Vuex from 'vuex';
import state from './state';
import * as actions from './actions';
import * as mutations from './mutations';
 
Vue.use(Vuex);
 
export default new Vuex.Store({
  state,
  actions,
  mutations
});

5、main.js中引入index.js

// 引入vuex-store
import store from './store/index';
 
new Vue({
  el: '#app',
  router,
  store,
  render: h => h(App)
});

6、保存数据

import { mapActions } from 'vuex';
 
// 2种方式
 
// 方法一(dispatch)
this.$store.dispatch('saveDbSource', this.DbSource);
 
// 方法二(映射)
// 1、通过methods方法添加映射关系 
methods: {
    ...mapActions(['saveDbSource'])
  }
 // 2、使用
this.saveDbSource

这里也有2种保存数据的方法,第一种就是直接操作方法,通过disptach派发给actions,让actions去触发

第二种就是通过在methods中添加映射关系,数组方式,意味着我们可以在数组中写多个方法(这里数组中的每一个方法名是actions.js文件中所定义的方法名),然后在需要使用的地方直接this.方法名即可。当然,也可以直接绑定给html中的某个事件。

值的注意的是,避免和methods中自己定义的其他方法的名字冲突

7、获取数据

import { mapState } from 'vuex';
 
computed: {
    ...mapState(['DbSource']),
    // 推荐写法如下:
    //...mapState({
    //    DbSource: state => state.DbSource,
    //    phoneMap: state => state.richCommunicationSuite.phoneMap, // 模块化写法
    //}),
},
watch: {
    DbSource(currVal) {
        // 监听mapState中的变量,当数据变化(有值、值改变等),
        // 保证能拿到完整的数据,不至于存在初始化没有数据的问题,然后可以赋给本组件data中的变量
      this.currVal = currVal;
    }
}

通过计算属性,当数据发生改变,我们可以保证拿到的是响应过后的数据,也是数组形式,意味着我们可以拿到多组数据,这里数组中的数据也是state.js中定义的变量(当然,更推荐使用我注释的那段代码,那种写法可以应对当state中存在多模块的情况,比如state.a.xxx,state.b.xxx,其中a和b都是两个模块,各自有对应的数据要存储,也可以自定义我们前面的名字来避免和data中数据重名的情况)

使用的时候,可以直接通过this.变量名拿到,例如本例中的 this.DbSource,我们可以把它赋给我们自定义的变量,也可以直接使用

值的注意的是,避免和data中自己定义的其他变量的名字冲突

至此,我们就完成了vuex的保存以及获取数据,希望对你有所帮助。

当然,我们需要把一vuex中的一组数据过滤,其他组件都共用过滤后的数据,这种情况大家可能会用到getters,这里我就不多赘述了,有兴趣的小伙伴可以自己了解一下。

附上vuex的运行过程,官网的图片:组件派发任务到actions,actions触发mutations中的方法,然后mutations来改变state中的数据,数据变更后响应推送给组件,组件重新渲染

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一图带你了解封装与分用

一、前缀知识 IP地址:用于定位主机的网络地址。 端口号:区分主机上不同的应用程序。 协议:描述了网络通信传输的数据的含义。 二、TCP/IP五层网络模型 物理层:描述了网络通信中基础设施的规范。 数据链路层:相邻节点之…

fcntl函数 非阻塞轮询

fcntl() 在打开的文件描述符 FD 上执行下面描述的操作之一。 操作由 cmd 确定。 fcntl() 可以采用可选的第三个参数。 是否需要此参数由 cmd 确定。 所需的参数类型在后面的括号中指示。 每个cmd名称(在大多数情况下&…

公众号迁移是什么?

公众号账号迁移的作用是什么?只能变更主体吗?微信公众平台的帐号迁移功能可将原公众号的粉丝、文章素材、违规记录、留言功能、名称等迁移至新的公众号。通过迁移可以实现公众号的公司主体变更、粉丝转移、开通留言功能、服务号转为订阅号等作用。因此不…

博弈论——劳资博弈

劳资博弈 0 引言 前一篇文章介绍了静态博弈中常见的几个案例以及场景,并且在此之前也还介绍过斯塔克尔伯格博弈等动态博弈,以及相关的解决方法——反应函数法。今天我们继续介绍一个常见的动态博弈——劳资博弈,并利用反应函数解决&#xff…

视觉人机器视觉线下培训遵循十大原则

1.​上课期间,自习时间没收手机,偷偷使用手机,将会被通报严重批评。 2.完善的教学设备,与具备现场落地设备要求。 3.教学与实操结合,老师教学的同时,要求你按照老师的效果,进行复现&#xff0…

黑马程序员RabbitMQ入门到实战教程【基础篇】学习笔记

目录 一、初始MQ 1.1、同步调用 1.2、异步调用 1.3、MQ技术选型 二、RabbitMQ 2.1、安装 2.2、收发消息 2.2.1、交换机 2.2.2、队列 2.2.3、绑定关系 2.2.4、发送消息 2.3、数据隔离 2.3.1、用户管理 2.3.2、virtual host 三、SpringAMQP 3.1、导入Demo工程 3…

【中国知名企业高管团队】系列23:金山软件KINGSOFT

今天是2023年10月1日,第74个国庆节,华研荟祝各位小伙伴节日快乐!阖家幸福! 这个特别的日子里,我们来了解金山软件的高管团队。 说到金山软件,可能很多非IT圈的人或者年轻的朋友们不一定知道,但…

【LeetCode热题100】--101.对称二叉树

101.对称二叉树 使用递归: 实现一个递归函数,通过同步移动两个指针的方法来遍历这颗树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q左移,ppp 左移时,q 右移。每次检查当前 p 和 q节…

【STM32 LVGL基础教程】初识LVGL

文章目录 前言一、什么是LVGL?二、LVGL的诞生历程三、LVGL的用途四、模拟器使用LVGL4.1 下载codeblocks并运行模拟器lvgl4.2 更改lvgl设置更改帧数更改颜色深度 五、STM32使用LVGL总结 前言 嵌入式系统中的图形用户界面(GUI)已经成为现代设备…

小说推文和短剧推广以及电影达人带货电影票

小说推文、短剧推广、电影达人(带或电影票)都可以通过“巨量推文“进行申请授权 小说推文和短剧推广是什么? 小说推文和短剧推广的逻辑其实一样,分为cpa拉新和cps分成的推广形式 cpa拉新是你推广的用户必须为新用户&#xff0c…

【 SuperPoint 】图像特征提取上的对比实验

1. SIFT,SuperPoint 都具有提取图片特征点,并且输出特征描述子的特性,本篇文章从特征点的提取数量,特征点的正确匹配数量来探索一下二者的优劣。 SuperPoint提取到的特征点数量要少一些,可以理解,我想原因大…

mac如何卸载应用并删除文件,2023年最新妙招大公开!

大家好,今天小编要为大家分享一些关于mac电脑的小技巧,特别是关于如何正确卸载应用程序以及清理卸载后的残留文件。你知道吗?很多人都不知道,mac系统默认的卸载方式可能会导致一些残留文件滞留在你的电脑上,慢慢地占用…

算法竞赛备赛之贪心算法训练提升,贪心算法基础掌握

1.区间问题 905.区间选点 给定N个闭区间[ai, bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量,位于区间端点上的点也算作是区间内。 将每个按区间的右端点从小到大排序 从前往后依次枚举每…

VS Code 如何搭建 C/C++开发环境

目录 VScode是什么? VScode的下载和安装? 2.1 下载和安装 安装: 2.2 环境的介绍 环境介绍:​编辑 安装中文插件: VScode配置 C/C 开发环境 3.1 下载和配置MinGW-w64 编译器套件 下载: 配置MinGW64: 3.2 安…

排序篇(六)----排序小结

排序篇(六)----排序小结 排序算法复杂度及稳定性分析 直接插入排序的算法复杂度: 最好情况下,当数组已经有序时,直接插入排序的时间复杂度为O(n),其中n是数组的大小。最坏情况下,当数组逆序排列时,直接插…

【python海洋专题二】读取水深nc文件并水深地形图

【python海洋专题二】读取水深nc文件并水深地形图 海洋与大气科学 导入函数包 from netCDF4 import Dataset import numpy as np import matplotlib.pyplot as plt 前两个上期更新说明了:第一个读取nc文件,第二个用于计算。 matplotlib.pyplot&#xf…

Audacity 使用教程:轻松录制、编辑音频

Audacity 使用教程:轻松录制、编辑音频 1. 简介 Audacity 是一款免费、开源且功能强大的音频录制和编辑软件。它适用于 Windows、Mac 和 Linux 等多种操作系统,适合音乐制作、广播后期制作以及普通用户进行音频处理。本教程将带领大家熟悉 Audacity 的…

Linux 基本语句_4_指针和函数

指针函数 顾名思义&#xff0c;即返回值为指针的函数 int * f (int n){int *p NULL;//空指针return p;//返回一个地址 }函数指针 指向函数的指针&#xff0c;每个函数都有自己的入口地址&#xff0c;函数指针专门指向这些地址#include <stdio.h>int max(int a, int b)…

【LeetCode热题100】--226.翻转二叉树

226.翻转二叉树 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

10.1 File类

前言&#xff1a; java.io包中的File类是唯一一个可以代表磁盘文件的对象&#xff0c;它定义了一些用于操作文件的方法。通过调用File类提供的各种方法&#xff0c;可以创建、删除或者重命名文件&#xff0c;判断硬盘上某个文件是否存在&#xff0c;查询文件最后修改时间&…