vuex及其使用方法

Vuex 是 Vue.js 框架中用于构建大型单页应用(SPA)的状态管理库。它的核心思想是将组件的状态集中管理,使得状态的变更更加可预测和易于维护。下面我会详细介绍 Vuex 的几个关键概念,并给出一个详细的示例。让我们更深入地探讨 Vuex 及其工作原理。

Vuex 的核心概念详解:

  1. State

    • Vuex 的状态(state)是响应式的,这意味着当状态发生变化时,所有依赖于该状态的组件都会自动更新。
    • 状态应该只包含基本数据类型或不可变对象,以确保状态的可预测性。
  2. Getters

    • Getters 允许你从 store 的状态中派生出一些状态,它们是可缓存的,这意味着只有当依赖的状态发生变化时,getter 才会重新计算。
    • 这类似于组件的计算属性,但它们是 store-wide 的。
  3. Mutations

    • Mutation 是同步函数,用于修改 state。它们是 Vuex 中唯一可以修改 state 的方法。
    • 每个 mutation 都有一个唯一的 type,这使得追踪状态变化变得容易。
  4. Actions

    • Actions 可以包含任意异步操作,它们可以看作是 mutation 的提交者。
    • Actions 可以分派(dispatch)mutation,也可以分派其他 actions。
  5. Modules

    • 当应用变得复杂时,store 可以被分割成模块。每个模块拥有自己的 state、mutations、actions、getters。
    • 模块化有助于组织代码,使得状态管理更加清晰。

Vuex 的工作流程详解:

  1. 组件触发 Action

    • 组件通过 this.$store.dispatch('actionName', payload) 触发 action。
  2. Action 执行异步操作

    • Action 可以执行异步操作,比如 API 调用。
  3. Action 提交 Mutation

    • 异步操作完成后,action 通过 commit 方法提交 mutation。
  4. Mutation 修改 State

    • Mutation 接收 state 作为第一个参数,通过修改这个参数来更新状态。
  5. State 更新触发视图更新

    • 当 state 更新后,Vuex 通知所有订阅了 state 的组件,触发它们的更新。

详细示例:

假设我们有一个购物应用,用户可以浏览商品列表,将商品添加到购物车,并在购物车页面查看和管理购物车中的商品。

创建 Vuex Store:
// store.js
import Vue from 'vue';
import Vuex from 'vuex';Vue.use(Vuex);export default new Vuex.Store({state: {products: [], // 商品列表cart: [] // 购物车中的商品},getters: {cartItems: state => state.cart,cartTotal: state => state.cart.reduce((total, item) => total + item.price * item.quantity, 0)},mutations: {SET_PRODUCTS(state, products) {state.products = products;},ADD_TO_CART(state, product) {const cartItem = state.cart.find(item => item.id === product.id);if (cartItem) {cartItem.quantity++;} else {state.cart.push({ ...product, quantity: 1 });}},REMOVE_FROM_CART(state, productId) {state.cart = state.cart.filter(item => item.id !== productId);},UPDATE_QUANTITY(state, { productId, quantity }) {const cartItem = state.cart.find(item => item.id === productId);if (cartItem && quantity > 0) {cartItem.quantity = quantity;}}},actions: {fetchProducts({ commit }) {// 假设 fetchProducts 是一个异步获取商品列表的函数fetchProducts().then(products => {commit('SET_PRODUCTS', products);});},addToCart({ commit }, product) {commit('ADD_TO_CART', product);},removeFromCart({ commit }, productId) {commit('REMOVE_FROM_CART', productId);},updateQuantity({ commit }, payload) {commit('UPDATE_QUANTITY', payload);}}
});
在 Vue 组件中使用 Vuex:
<template><div><div v-for="product in products" :key="product.id">{{ product.name }} - {{ product.price }}<button @click="addToCart(product)">添加到购物车</button></div><div><h2>购物车</h2><ul><li v-for="item in cartItems" :key="item.id">{{ item.name }} - {{ item.quantity }} 件 - {{ item.price }} 元<button @click="updateQuantity({ productId: item.id, quantity: item.quantity - 1 })">减少数量</button><button @click="removeFromCart(item.id)">移除商品</button></li></ul>总金额: {{ cartTotal }} 元</div></div>
</template><script>
import { mapState, mapGetters, mapActions } from 'vuex';export default {computed: {...mapState(['products']),...mapGetters(['cartItems', 'cartTotal'])},methods: {...mapActions(['addToCart', 'removeFromCart', 'updateQuantity'])},created() {this.$store.dispatch('fetchProducts');}
}
</script>

在这个示例中,我们创建了一个包含商品列表和购物车功能的 Vuex store。我们定义了 actions 来异步获取商品列表,mutations 来修改购物车中的商品数量,以及 getters 来获取购物车中的商品列表和总金额。组件在创建时触发 fetchProducts action 来获取商品列表,并使用 mapStatemapGettersmapActions 来简化对 state、getters 和 actions 的访问。

Vuex 的这些特性使得状态管理变得更加集中和可预测,非常适合用于构建复杂的单页应用。

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

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

相关文章

C++内存管理和模板/stl初识

前言 c兼容C语言&#xff0c;但它因为有类和对象的概念&#xff0c;C语言原生的那套内存管理函数在特定场景下还是有些捉襟见肘的&#xff0c;为此c在C语言的基础上引入新的内存管理方案&#xff0c;今天我们就来简单的认识一下c的内存管理。除此之外&#xff0c;模板也是c引入…

Jetpack Compose 通过 OkHttp 发送 HTTP 请求的示例

下面是一个使用 Kotlin 和 Jetpack Compose 来演示通过 OkHttp 发送 HTTP 请求的示例。这个示例包括在 Jetpack Compose 中发送一个 GET 请求和一个 POST 请求&#xff0c;并显示结果。 添加okhttp依赖 首先&#xff0c;在你的 build.gradle.kts 文件中添加必要的依赖&#xf…

父子组件生命周期的执行顺序

在Vue中&#xff0c;父子组件的生命周期执行顺序是一个重要的概念&#xff0c;它帮助开发者理解组件之间的加载、更新和销毁过程。以下是对父子组件生命周期执行顺序的详细解释&#xff1a; 一、加载渲染过程 当Vue实例开始创建时&#xff0c;会按照以下顺序执行生命周期钩子…

PACS医学影像临床信息系统,C#影像归档和通信系统源码,PACS源码,支持图像的获取、传输、浏览、打印、测量、重建、对比、存储、处理,电子胶片影像管理等

医学影像临床信息系统具有图像采集、显示、存储、传输和管理等功能&#xff0c;支持DICOM影像设备和非DICOM影像设备&#xff0c;可以识别CT、MR、CR/DR、X光、DSA、B超、NM、SC等设备的图像类型&#xff0c;可对数字影像进行无损压缩和有损压缩处理。C/S体系结构的多媒体数据库…

STM32智能照明控制系统教程

目录 引言环境准备智能照明控制系统基础代码实现&#xff1a;实现智能照明控制系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;照明管理与优化问题解决方案与优化收尾与总结 1. 引言 智能照明控制系统通…

React——useState以及批处理state

useState 是 React 提供给函数组件的一个 Hook&#xff0c;它允许你在函数组件中添加并管理 state。 从本质上讲&#xff0c;useState 的运行机制是同步的&#xff0c;但由于 React 批处理 state 更新和异步渲染的方式&#xff0c;有时看起来像是异步的。 useState 运行机制 …

独立游戏《星尘异变》UE5 C++程序开发日志8——实现敏感词过滤功能(AC自动机)

在游戏中经常会有需要玩家输入一些内容的功能&#xff0c;例如聊天&#xff0c;命名等&#xff0c;这款游戏只有在存档时辉用到命名功能&#xff0c;所以这个过滤也只是一个实验性的功能&#xff0c;我们将使用AC自动机来实现&#xff0c;这是在我们把“csdn”这个词设置为屏蔽…

Linux下如何安装配置Zsh Shell

Zsh是一种强大的Shell&#xff0c;它是在Bash原有功能的基础上进行了扩展和改进&#xff0c;提供了更多的特性和功能。在Linux下安装和配置Zsh Shell相对简单&#xff0c;下面将详细介绍安装和配置Zsh Shell的步骤。 第一步&#xff1a;安装Zsh 在Linux上安装Zsh有几种不同的…

贪心算法 | 763.划分字母区间

题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。…

解决zabbix-server7 中文乱码问题

系统使用centos9 安装中文支持 yum install -y fontconfig langpacks-zh_CN.noarch 检查是否已有中文字体&#xff1a; fc-list :langzh 看到 直接使用GOOGLE的字体 ln -fs /usr/share/fonts/google-noto-cjk/NotoSansCJK-DemiLight.ttc /etc/alternatives/zabbix-web-fo…

bool数组的理解和应用[C++]

文章目录 bool数组的用法bool数组的定义声明bool数组的初始化访问和修改数组元素遍历数组 运用bool数组简单代码 在今天做题中发现了bool类不仅能用于函数类型还能用于数组类型&#xff0c;好奇查了查发现bool还有很多用处&#xff1a;基本变量&#xff0c;在枚举类型中会用到&…

【C语言】结构体详解 -《探索C语言的 “小宇宙” 》

目录 C语言结构体&#xff08;struct&#xff09;详解结构体概览表1. 结构体的基本概念1.1 结构体定义1.2 结构体变量声明 2. 结构体成员的访问2.1 使用点运算符&#xff08;.&#xff09;访问成员输出 2.2 使用箭头运算符&#xff08;->&#xff09;访问成员输出 3. 结构体…

【CSS】1 像素问题

CSS 中的 1 像素问题指的是在⾼分辨率屏幕上显示的 1 像素边框或者细线在实际显示时会⽐ 1 个物理像素更宽或更粗&#xff0c;从⽽导致边框或者细线看上去⽐预期的更粗或者更宽。 造成这个问题的原因是由于⾼分辨率屏幕的像素密度⽐传统的屏幕要⾼&#xff0c;所以在屏幕上显示…

一个C++模板工厂的编译问题的解决。针对第三方库的构造函数以及追加了的对象构造函数。牵扯到重载、特化等

一窥模板的替换和匹配方式&#xff1a;偏特化的参数比泛化版本的还要多&#xff1a;判断是不是std::pair&#xff1c;,&#xff1e;。_stdpair模板参数太多-CSDN博客 简介 在一个项目里&#xff0c;调用了第三封的库&#xff0c;这个库里面有个类用的很多&#xff0c;而且其构…

边界网关IPSEC VPN实验

拓扑&#xff1a; 实验要求&#xff1a;通过IPSEC VPN能够使PC2通过网络访问PC3 将整个路线分为三段 IPSEC配置在FW1和FW2上&#xff0c;在FW1与FW2之间建立隧道&#xff0c;能够传递IKE&#xff08;UDP500&#xff09;和ESP数据包&#xff0c;然后在FW1与PC2之间能够流通数据…

GitHub 详解教程

1. 引言 GitHub 是一个用于版本控制和协作的代码托管平台&#xff0c;基于 Git 构建。它提供了强大的功能&#xff0c;使开发者可以轻松管理代码、追踪问题、进行代码审查和协作开发。 2. Git 与 GitHub 的区别 Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改…

学术研讨 | 基于区块链的隐私计算与数据可信流通研讨会顺利召开

近日&#xff0c;由国家区块链技术创新中心组织的“基于区块链的隐私计算与数据可信流通研讨会”顺利召开&#xff0c;会议邀请了来自全国高校和科研院所的相关领域专家&#xff0c;围绕基于区块链与隐私计算技术的应用需求、研究现状、发展趋势、重点研究方向与研究进展等内容…

Go并发GMP调度模型

如何知道一个对象是分配在栈上还是堆上&#xff1f; Go和C不同&#xff0c;Go的逃逸分析是在编译器完成的&#xff1b;go局部变量会进行逃逸分析。如果变量离开作用域后没有被引用&#xff0c;则优先分配到栈上&#xff0c;否则分配到堆上。那么如何判断是否发生了逃逸呢&#…

数据结构之《队列》

在数据结构之《栈》章节中学习了线性表中除了顺序表和链表外的另一种结构——栈&#xff0c;在本篇中我们将继续学习另一种线性表的结构——队列&#xff0c;在通过本篇的学习后&#xff0c;你将会对栈的结构有充足的了解&#xff0c;在了解完结构后我们还将进行栈的实现。一起…

vue3-02声明响应式状态ref()

一、使用 组合式 API 中&#xff0c;推荐使用 ref() 函数来声明响应式状态&#xff0c;例如 import { ref } from vue const count ref(0)注意点1&#xff1a;若想获取ref定义的参数&#xff0c;必须获取参数的value值&#xff0c; 比如&#xff1a; console.log(count, co…