Vue3使用Vuex 教程(这才是真正的小白教程!)

vue3,使用,vuex,教程,真正,小白 · 浏览次数 : 16

小编点评

**vuex 的应用** vuex 是一个用于管理 Vuex 的 JavaScript 库。它可以帮助你: * 将应用程序状态存储到 Vuex 中 * 允许你从任何组件中访问状态 * 简化并维护你的 Vue 应用 **创建 Vuex 仓库** 在你的 Vue 应用程序中,创建一个名为 `store` 的 Vuex 仓库。可以使用 `createStore()` 函数创建仓库。 ```js import { createStore } from 'vuex' const store = createStore({ modules: { homeStore: homePage, homePanelStore: homePanelPage, messageBoardStore: messageBoardPage } }) ``` **使用 store 获取状态** 使用 `store.state` 获取当前页面状态。 ```js const state = store.state ``` **使用 store 进行状态更改** 使用 `store.commit()` 方法更改状态。 ```js store.commit('homeStore/upSitestats', newvalue) ``` **与 Session 的区别** Session 是 Vue 中用于存储局部数据的 JavaScript 数据存储。vuex 仓库和 session 之间的区别在于: * **存储范围:** session 只能存储字符串,而 vuex 仓库可以存储任何类型的数据。 * **生命周期:** session 的生命周期与应用程序实例有关,而 vuex 仓库的生命周期与组件的生命周期有关。 * **可读性:** session 的值是字符串,而 vuex 仓库的值是任何类型。 **示例** ```js // 在组件中获取状态 const state = store.state // 在组件中更改状态 store.commit('homeStore/upSitestats', newvalue) ``` **结论** vuex 是一个非常实用的工具,可以帮助你管理 Vue 应用程序的状态。通过创建和使用仓库,你可以简化并维护你的 Vue 应用。

正文

我的项目是vue3+element-plus
我是个菜鸡,我不懂前端。想做一个tags的导航标签页。但是点击标签页之后页面仍然是会重新请求。感觉这不就跟没做一样吗?
遂百度GPT,第一种方式采用的就是存储到session里。搞了大半天,突然觉得这样好捞,遂采用vuex。虽然两者理论上区别不大,但是说起来vuex有B格
查看了一些教程,因为我是刚做前端,一边百度一边写代码,我是不懂vuex的,虽然看着好像也不复杂……我承认我笨B……
开整~~~~

首先,npm安装vuex。这个肯定是小白也知道。

npm i vuex

然后就是创建一个vuex的store。网上有说什么仓库的叫法,就是数据存储的仓库呗~

我这里其实就遇到一个坑的,一开始我不会用,以为是在A页面创建store,然后其他页面就能访问数据了,或者就是单页面引入,巴拉巴拉之类的。

主要一开始看到他的写法是这样的

import { createStore } from 'vuex'

 因此我是认为。这东西是写在.vue页面的,就像我前面说的,不就是存页面的数据吗?  漏漏漏~~大漏特漏~~~

这里说下我搞懂后的理解。所谓的store仓库是必须在main.js去挂载的(如果我说的不对,那说明我还是理解的不透彻了)。这样才能全局去访问。至于页面的数据怎么往里面存嘛~~~一步一步来,先看我main.js的挂载

//vuex
import { createStore } from 'vuex'
//每个页面的store信息
import homePage from './config/vuex/homePage'
import homePanelPage from './config/vuex/homePanelPage'
import messageBoardPage from './config/vuex/messageBoardPage'
//存储信息
const store = createStore({
    modules: {
        homeStore: homePage,
        homePanelStore: homePanelPage,
        messageBoardStore:messageBoardPage
    }
});
var app = createApp(App)
app.use(store)

 

首先是使用createStore去创建一个store,也就是所谓的仓库,其次我导入的那三个xxxPage文件。是我针对于单独的页面去设计的……怎么形容呢,就是每个页面要存储访问的键值对吧,key—value。别慌,等下看代码就知道了。 不过还是可以先去看官网的注释,看看这些属性都是干嘛的。

modeles,官网的解释是,如果都放在一起,程序变得复杂时,就会臃肿,因此可以分割成模块。so,homeStore就是home页面的store,messageBoardPage就是messageBoard页面的store,这应该很好理解吧?

现在, 开始看import messageBoardPage from './config/vuex/messageBoardPage' 导入的这个页面的内容

const state = {
    echartDatas: null, // 存储图表数据
    sitestats: null, // 存储统计数据
};

const mutations = {
    upEchartDatas(state, echartDatas) {
        state.echartDatas = echartDatas;
    },
    upSitestats(state, sitestats) {
        state.sitestats = sitestats;
    },
};

export default {
    namespaced: true, // 启用命名空间
    state,
    mutations,
};

 

简单解释下
state存的就是数据源,我是理解为键值对,通过key去访问value。等下怎么访问的我会写,别急~~~ 这样你应该很清楚的知晓state是干嘛的了吧?官网或者其他博客解释的挺专业的,听不懂。你就理解成数据源,键值对就行,完全够用!
mutations,可以理解为事件。我觉得理解成方法集合比较好理解。可以看到代码里有两个方法upEchartDatas和upSitestats。通过名字可以看到是用来修改的,up是update的简写。然后有两个参数,state和echartdatas。
这个state是当前这个"页面"的state(数据源集合)。这个echartdatas是我自己起的名字,这个代表新的数据,方法的内容就是新数据替换老数据的结果。简单不?
再补充一点。官网形容mutations 是说    更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。嘶。反正我第一眼看着懵逼的很。吃了没文化的亏啊…那我现在的理解就是,修改vuex里store的数据时,只能调用mutations 里的方法。当然,这里的说法叫提交,少废话看代码怎么使用的。
<script setup type="text/javascript">
// vuex
import { useStore } from "vuex";
const store = useStore();

onMounted(() => {

  if (store.state.homeStore.echartDatas == null) {
    //获取图表数据
    axios.get("BBS_SiteStats/GetEchartLine", null, null, (res) => {
      var data = JSON.parse(res.data);
      Object.assign(echartDatas, data);
    });
  } else {
    Object.assign(echartDatas, store.state.homeStore.echartDatas);
  }

  //获取统计信息
  if (store.state.homeStore.sitestats == null) {
    axios.get("BBS_SiteStats/GetSiteStats", null, null, (res) => {
      var data = JSON.parse(res.data);
      Object.assign(sitestats, data);
    });
  } else {
    Object.assign(sitestats, store.state.homeStore.sitestats);
  }
});
</script>

 

使用store需要使用vuex中的useStore。然后用store.state就行了。因为我是采用的模块化的方式,所以store.state.homeStore这个homeStore就是刚才配置的home页面的‘数据仓库’了,然后继续.来获取某一值。比如我贴的代码里的store.state.homeStore.sitestats。这里我是在onMounted页面加载完成后就去判断值是否等于null。因为我们默认设置的实话,值全都是null,只有在访问页面时,才会提交进去数据。我这里的话,如果仓库有值就赋值,没值就请求接口。至于提交到store‘仓库’的代码,我写法watch中。监听!因为vue的数据都是动态绑定的,因此更改的时候都会获取到新的数据。别慌,提交(更新)数据源的代码在这里!

const sitestats = reactive({});
watch(
  sitestats,
  (newvalue) => {
    store.commit("homeStore/upSitestats", newvalue);
  },
  { deep: true }
);

 

很简单store.commit("homeStore/upSitestats", newvalue);commit,可不就是提交嘛?第一个参数是你mutations里的方法,因为模块化了,所以我都代码里要加上是哪一个页面的数据,例如这个
"homeStore/upSitestats"。而newvalue则是监听到的修改之后的新的值,直接这样就修改咯~你要问怎么修改的,那你去看看mutations里的upSitestats方法呀~~~
 { deep: true }好像是,怎么解释呢。因为实际效果我并不确认,结合官网的说法就是,如果你的数据源是数组这种,它可以监听到你的子项是不是也修改了。差不多这意思吧,反正写上去吧,也不影响

还有一个点就是,刷新页面数据就没了,所以一开始我说,和session区别不大,但是听着有B格。当然了,可能是我只会了基础,所以大家一起来学习呀!!!

与Vue3使用Vuex 教程(这才是真正的小白教程!)相似的内容:

Vue3使用Vuex 教程(这才是真正的小白教程!)

我的项目是vue3+element-plus 我是个菜鸡,我不懂前端。想做一个tags的导航标签页。但是点击标签页之后页面仍然是会重新请求。感觉这不就跟没做一样吗? 遂百度GPT,第一种方式采用的就是存储到session里。搞了大半天,突然觉得这样好捞,遂采用vuex。虽然两者理论上区别不大,但是说

vue3 快速入门系列 —— 状态管理 pinia

其他章节请看: vue3 快速入门 系列 Pinia vue3 状态管理这里选择 pinia。 虽然 vuex4 已支持 Vue 3 的 Composition API,但是 vue3 官网推荐新的应用使用 pinia —— vue3 pinia 集中式状态管理 redux、mobx、vuex、pi

vue中新的状态管理器-pinia

背景 对于pinia的使用,可参考官方文档在这不做过多赘述。这边主要来讲讲pinia中 少用且好用的方法,为什么我们选择pinia而不用vuex ps: 以下写法全部基于组合式API 使用方式: 先下载依赖 npm i pinia -s 在vue3中,main.js这么写 import { crea

深入理解 Vue 3 组件通信

在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件。本文将介绍几种常见的 Vue 3 组件通信方法,包括 props、emits、provide 和 inject、事件总线以及 Vuex 状态管理。 1. 使用 props 和 emits 进行父子组件通信 props

vue3 | defineExpose的使用

简介 使用

使用Vue3在浏览器端进行zip文件压缩

在前端开发中,我们时常需要处理文件上传和下载的功能。有时,用户可能希望将多个文件打包成一个zip文件以便于下载。今天,我将分享一个使用Vue3和JSZip库在浏览器端实现zip文件压缩的示例。 首先,我们需要安装JSZip库。如果你使用的是npm,可以通过以下命令进行安装: npm install

vue3 路由的使用

添加一个router.js 配置文件 import { createRouter, createWebHistory } from 'vue-router' createRouter:用来创建 路由 createWebHistory :url的格式 不带#。 导入你的.vue页面 即你的页面,如:

使用Vue3+elementPlus的Tree组件实现一个拖拽文件夹管理

目录1、前言2、分析3、 实现4、踩坑4.1、拖拽辅助线的坑4.2、数据的坑4.3、限制拖拽4.4、样式调整 1、前言 最近在做一个文件夹管理的功能,要实现一个树状的文件夹面板。里面包含两种元素,文件夹以及文件。交互要求如下: 创建、删除,重命名文件夹和文件 可以拖拽,拖拽文件到文件夹中,或着拖拽文

2024已过半,还没试过在vue3中使用ioc容器吗?

Zova 是一款支持 IOC 容器的 Vue3 框架。有了 IOC 容器的加持,定义响应式状态不再需要ref/reactive,也不再需要ref.value

Vue3中的几个坑,你都见过吗?

Vue3 目前已经趋于稳定,不少代码库都已经开始使用它,很多项目未来也必然要迁移至Vue3。本文记录我在使用Vue3时遇到的一些问题,希望能为其他开发者提供帮助。 1. 使用reactive封装基础数据类型 传统开发模式中,数据声明很简单。但是在Vue中有多个响应式变量声明方式,整体的使用规则如下: