Vue3.js - 一文看懂Vuex

1. 前言

Vuex 是 Vue.js 的官方状态管理库,用于在 Vue 应用中管理组件之间共享的状态。Vuex 适用于中大型应用,它将组件的共享状态集中管理,可以避免组件间传递 props 或事件的复杂性。

2. 核心概念

我们可以将Vuex想象为一个大型的Vue,存储在Vuex中的数据,方法无论在任何组件中我们都可以使用,调用,修改

Vuex中的核心组件包括不仅限于以下部分:

  • State(状态):存储应用的状态数据。
  • Getters(获取器):可以视图化 state,类似于 Vue 组件中的计算属性,用于获取 state 的值并进行加工。
  • Mutations(变更):同步修改 state 的方法。唯一能直接修改 state 的地方。
  • Actions(行为):用于处理异步操作,类似于 mutations,但可以包含异步代码,最终通过 mutations 更新 state。
  • Modules(模块化):当应用状态变得复杂时,可以将 Vuex store 分割成模块,每个模块拥有自己的 state、mutations、actions 和 getters。

3. Vuex的安装

npm install vuex@next
# or
yarn add vuex@next

如果可以指定vuex安装的版本,目前最新版本为vuex4

4. 创建vuex

我们常见于在工程项目中单独使用一个文件夹存放我们的vuex脚本

在src中新建一个store文件夹创建一个js脚本,开始我们创建vuex的第一步

import {createStore} from 'vuex'
const store = createstore({}) 

导入vuex中的createstore函数,为其配置相应的对象变量

4.1 state 状态

const store = createStore({state:{count:0}
})

上述代码中为store配置了state,state中存储我们的“全局数据”count赋值为0,在其他组件中我们可以调用查看我们的count

 

4.2 mutations 变更

const store = createStore({state:{count:0},mutations:{increment(state,value){xxxx}}
})

唯一可以直接修改state的地方

上述代码配置了mutations组件,类比于vue中的methods,mutations中包装了若干个函数,可以为函数传入state组件,便可以访问以及操作state中存储的数据;value则是想要传入的数据。

mutations 存储的函数也是全局的,任意组件都可以进行调用

4.3 getter 获取器

const store = createStore({state:{count:0},mutations:{},getters:{count10(state){return state.count+10}}
})

 类比于vue中的computed属性,返回一个操作之后的全局数值

4.4 actions 行为

用于处理异步操作,类似于 mutations,但可以包含异步代码,最终通过 mutations 更新 state

actions: {asyncIncrement({ commit }) {setTimeout(() => {commit('increment');}, 1000);}},

5. vue中使用vuex

5.1 vue注册

需要在应用中注册 Vuex store。在 main.js 文件中导入并使用 Vuex store:

//main.js文件
import {createApp} from 'vue'
import App from './App.vue'
import {store} from './store/index.js'app = createApp(App) //创建vue,并将App组件传入
app.use(store) //让我们的app这个vue组件使用vuex组件
app.mount('#app') //挂载到html文件中

5.2 在组件中访问vuex

在 Vue 组件中通过 this.$store 访问 Vuex store。例如,在模板中访问 countdoubledCount,并触发 mutations 和 actions。

通常使用$标识符代表使用vue上的实例的全局组件。

<template><div><p>Count: {{ count }}</p><p>Doubled Count: {{ doubledCount }}</p><button @click="increment">Increment</button><button @click="decrement">Decrement</button><button @click="asyncIncrement">Async Increment</button></div>
</template><script>
export default {computed: {// 通过 getter 获取状态count() {return this.$store.state.count;},doubledCount() {return this.$store.getters.doubledCount;}},methods: {// 触发 mutationsincrement() {this.$store.commit('increment');},decrement() {this.$store.commit('decrement');},// 触发 actionsasyncIncrement() {this.$store.dispatch('asyncIncrement');}}
};
</script>

6. modules 

当应用变得较为复杂时,你可以通过模块化来管理 store。每个模块可以拥有自己的 state、mutations、actions 和 getters,从而更好地组织代码。

与vue类似,创建不同的vuex组件(module),最后使用一个大的框架组件将其他模块进行涵盖

// store/modules/user.js
export default {state: {name: 'John Doe'},mutations: {setName(state, name) {state.name = name;}},actions: {updateName({ commit }, name) {commit('setName', name);}},getters: {userName(state) {return state.name;}}
};
// store/modules/cart.js
export default {state: {items: []},mutations: {addItem(state, item) {state.items.push(item);}},actions: {addItemToCart({ commit }, item) {commit('addItem', item);}},getters: {cartItems(state) {return state.items;}}
};

最后在总组件中配置modules,使用modules进行配置 

// store.js
import { createStore } from 'vuex';
import user from './modules/user';
import cart from './modules/cart';const store = createStore({modules: {user,cart}
});export default store;

 

7. 总结

总的来说,vuex是处理状态管理的一个强大工具。

在较大型项目中避免重复持续的使用事件配置以及props进行处理组件之间的数据

Vuex 在 Vue 3 中依然是响应式的。这意味着,当 Vuex 中的 state 被改变时,所有依赖该 state 的组件会自动重新渲染,确保 UI 始终与 state 保持同步。

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

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

相关文章

PdServer:调用MidjourneyAPI完成静夜思图文生成

欢迎沟通讨论&#xff0c;WX: cdszsz。公号&#xff1a;AIGC中文站。 今天我们将使用PdServer&#xff0c;通过Qwen大模型完成古诗的解析与prompt的生成&#xff0c;然后调用MidjourneyAPI完成图片的生成。有了文案和图片&#xff0c;我们就可以将其生成为一个古诗讲读视频。从…

融合创新:CNN+LSTM在深度学习中的高效应用,助力科研发表高影响因子文章!

2024深度学习发论文&模型涨点之——CNNLSTM 结合CNN&#xff08;卷积神经网络&#xff09;和LSTM&#xff08;长短期记忆网络&#xff09;是一种常见的深度学习模型组合&#xff0c;广泛应用于各种任务&#xff0c;特别是时间序列预测和序列数据处理。 CNNLSTM是一种深度学…

20241114在飞凌的OK3588-C的核心板上跑Linux R4时通过iperf3测试以太网卡的实际网速

20241114在飞凌的OK3588-C的核心板上跑Linux R4时通过iperf3测试以太网卡的实际网速 2024/11/14 21:09 《OK3588-C_Linux5.10.66Qt5.15.2_用户使用手册_V1.2_20240321.pdf》 飞凌文档上的配置有点不一样&#xff0c;需要修正&#xff1a; 3.2.15 以太网配置 OK3588-C板载两个千…

鸿蒙开发,Arkts 如何调用接口

面向万物互联时代&#xff0c;华为提出了“一次开发多端部署、可分可合自由流转、统一生态原生智能”三大应用与服务开发理念。针对多设备、多入口、服务可分可合等特性&#xff0c;华为提供了多种能力协助开发者降低开发门槛。在此背景下&#xff0c;HarmonyOS基于JS/TS语言体…

JavaScript方法修改 input type=file 样式

html中的<input type "file">的样式很难修改&#xff0c;又跟页面风格很不匹配。我就尝试了几种方法&#xff0c;但是不管是用label还是用opacity:0都很麻烦&#xff0c;还老是出问题&#xff0c;所以最后还是用JavaScript来解决。 下面附上代码&#xff1a;…

安装仓库,ssh以及NFS

安装仓库 1、源码安装 >自定义组件 2、软件包安装&#xff1a;rpm / dpkg ↓ (.rpm) / (.deb) 3、apt / yum >仓库 apt仓库&#xff1a; 安装源 >在线 / 离线 >包含可用的deb包 ↓ 元信息>包与包之间的依赖关系 在线源&#xff1a;必须要联网&#xff0c;包…

[Docker#9] 存储卷 | Volume、Bind、Tmpfs | -v/mount | MySQL 灾难恢复 | 问题

目录 1. 什么是存储卷? 2. 生活案例 3. 为什么需要存储卷? 4. 存储卷分类 一. 管理卷 Volume 创建卷 通过 -v 或 --mount 指定 1. -v 语法 命令格式 参数说明 2. --mount 语法 命令格式 参数说明 验证 二. 绑定卷 (Bind Mount) 1. 绑定卷概述 2. 创建绑定卷…

CVPR2024-6-可学习点云采样“LTA-PCS: Learnable Task-Agnostic Point Cloud Sampling”

文章摘要&#xff1a; 最近&#xff0c;许多方法直接对不同任务的点云进行操作。当点云尺寸较大时&#xff0c;这些方法的计算量和存储要求更高。为了减少所需的计算和存储&#xff0c;一种可能的解决方案是对点云进行采样。在本文中&#xff0c;我们提出了第一个可学习的与任务…

react + ts定义接口类型写法

接口&#xff08;未进行ts定义&#xff09; export async function UserList(params: {// keyword?: string;current?: number;pageSize?: number;},// options?: { [key: string]: any }, ) {return request<API1.UserList>(http://geek.itheima.net/v1_0/mp/artic…

数据库基础

数据库基础 什么是数据库主流数据库数据库的基本使用连接服务器服务器管理服务器、数据库、表之间的关系数据库基本指令 MySQL架构SQL分类存储引擎什么是存储引擎查看存储引擎存储引擎对比 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库&#xff1f; …

【论文复现】基于标签相关性的多标签学习

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀基于标签相关性的多标签学习 论文概述什么是多标签学习论文贡献 算法流程挖掘“主题“——提取标签相关性训练 &#x1d440; &#x1d447; …

MMCloud+JuiceFS:云端Nextflow工作流的新方案

在云计算和生物信息学领域&#xff0c;执行大规模计算任务时的性能与成本效率至关重要。MemVerge推出的JuiceFlow通过JuiceFS和云端Memory Machine Cloud&#xff08;简称“MMCloud”&#xff09;平台&#xff0c;为Nextflow工作流&#xff08;pipeline&#xff09;提供了一种高…

【Linux】 shell 学习汇总[转载]

转载地址&#xff1a;https://blog.csdn.net/baidu_33718858/article/details/81453835 一些平时使用过程中的知识点积累&#xff0c;来源都附上了博客&#xff0c;添加了一些自己的总结。 感触&#xff1a;linux命令用熟了相当提高工作效率&#xff0c;有时候用Python写十几行…

天云数据联手举办“科学传播沙龙”活动,探讨Sora是否会带来新的科学革命

4月18日&#xff0c;由北京市科协主办&#xff0c;北京科技记协承办&#xff0c;中关村创新研修学院、天云融创数据科技&#xff08;北京&#xff09;有限公司协办的“AIGC塑造数字内容生产新范式”科学传播沙龙在京举办&#xff0c;活动由北京市科协宣传文化部二级调研员、北京…

LlamaIndex+本地部署InternLM实践

1.环境配置 1.1 配置基础环境 这里以在 Intern Studio 服务器上部署 LlamaIndex 为例。 首先&#xff0c;打开 Intern Studio 界面&#xff0c;点击 创建开发机 配置开发机系统 填写 开发机名称 后&#xff0c;点击 选择镜像 使用 Cuda11.7-conda 镜像&#xff0c;然后在资源…

uni-segmented-control 分段器添加数量提示

1、 在 template 内写入 uni-segmented-control 基础写法 <uni-segmented-control :current"current" :values"items" :style-type"styleType" clickItem"onClickItem" activeColor"#81D8D0" />2、在 script 里面写…

Linux篇(用户管理命令)

目录 一、用户与用户组 1. 为什么要做用户与用户组管理 2. Linux的用户及用户组 2.1. Linux的多用户多任务 2.2. 什么是用户 2.3. 什么是用户组 2.4. 用户和用户组的关系 二、用户和用户组管理 1. 用户组管理 1.1. 用户组添加 /etc/group文件结构 1.2. 用户组修改 …

编程之路,从0开始:内存函数

Hello大家好&#xff01;很高兴我们又见面了。 给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 今天我们来讲C语言中的内存函数。 目录 1、memcpy内存复制 2、memmove可重叠内存拷贝 3、memset设置字符 4、memcmp比较 1、memcpy内存复制 memcpy就是内存复制…

PyCharm 中的【控制台】和【终端】的区别

pycharm专业版-使用 PyCharm 中的【控制台】和【终端】的区别如下&#xff1a; 1.环境&#xff1a;控制台是 PyCharm 的内部环境&#xff0c; 终端 是操作系统的命令行界面。 2.功能&#xff1a;控制台可以运行 Python 代码&#xff0c;并显示执行结果&#xff1b; 终端可以…

IDEA修改注释颜色—图文教程

老的注释颜色用习惯了&#xff0c;新电脑的灰色注释不习惯&#xff0c;还是喜欢黄色哈哈哈哈&#x1f923;&#x1f923;&#x1f923; Block comment &#xff1a; 多行注释 Doc comment&#xff1a;文档注释 Line comment&#xff1a;单行注释 小伙伴们可以改自己喜欢的颜色…