【Vue】使用 Vuex 作为状态管理

【Vue】使用 Vuex 作为状态管理

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式和库。它使用单一状态树,这意味着这个对象包含了全部的应用层级状态,并且以一种相对集中的方式存在。这也意味着,通常单个项目中只有一个 Vuex store。Vuex 的核心概念和功能包括:

  1. 状态(State):Vuex 使用单一状态树,即一个对象包含了整个应用的状态。状态存储是响应式的,当 Vue 组件从 store 中读取状态时,若状态发生变化,相关组件也会相应更新。

  2. 视图(View):Vue 组件输出状态的可视化表示。

  3. 行为(Actions):响应在 view 上的用户输入导致的状态变化。

除此之外,Vuex 还有以下几个核心概念:

  1. Getters:允许组件从 store 中获取状态,同时可以对状态进行一些预处理。

  2. Mutations:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutations 非常类似于事件:每个 mutation 都有一个字符串的事件类型 (type) 和一个回调函数 (handler)。

  3. Actions:类似于 mutations,不同在于它们提交的是 mutations,而不是直接变更状态。Actions 可以包含任意异步操作。

  4. Modules:由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。为了解决这个问题,Vuex 允许我们将 store 分割成模块(module)。

Vuex 是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会自动更新。这也意味着 Vuex 中的状态不能直接改变,只能通过显式提交 mutations 来更改。

使用案例

假设我们正在开发一个购物车应用,用户可以将商品添加到购物车中,查看购物车中的商品,以及清空购物车。在这个例子中,我们将创建一个 Vuex store 来管理购物车的状态。

首先,你需要在你的 Vue 项目中安装和引入 Vuex:

pnpm install vuex --save

然后,在你的 Vue 项目中创建一个 Vuex store:

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    cart: []
  },
  getters: {
    cartItemCount: state => {
      return state.cart.length
    },
    cartTotalPrice: state => {
      return state.cart.reduce((total, item) => {
        return total + item.price * item.quantity
      }, 0)
    }
  },
  mutations: {
    addToCart(state, item) {
      const found = state.cart.find(product => product.id === item.id)

      if (found) {
        found.quantity++
      } else {
        state.cart.push({ ...item, quantity: 1 })
      }
    },
    removeFromCart(state, item) {
      const index = state.cart.indexOf(item)
      if (index > -1) {
        state.cart.splice(index, 1)
      }
    },
    clearCart(state) {
      state.cart = []
    }
  },
  actions: {
    addToCart({ commit }, item) {
      commit('addToCart', item)
    },
    removeFromCart({ commit }, item) {
      commit('removeFromCart', item)
    },
    clearCart({ commit }) {
      commit('clearCart')
    }
  }
})

在上面的代码中,我们定义了:

  1. State:购物车数组 cart。
  2. Getters:cartItemCount 和 cartTotalPrice 用于获取购物车中的商品数量和总价。
  3. Mutations:addToCart、removeFromCart 和 clearCart 用于修改购物车的状态。
  4. Actions:包装了 mutations 的方法,这里是 addToCart、removeFromCart 和 clearCart。

最后,在你的 Vue 组件中使用这个 store:

// 在一个组件中
<script>
import { mapGetters, mapActions } from 'vuex'

export default {
  computed: {
    ...mapGetters(['cartItemCount', 'cartTotalPrice'])
  },
  methods: {
    ...mapActions(['addToCart', 'removeFromCart', 'clearCart']),
    addItemToCart(item) {
      this.addToCart(item)
    },
    removeItemFromCart(item) {
      this.removeFromCart(item)
    },
    emptyCart() {
      this.clearCart()
    }
  }
}
</script>

完整代码

<template>
  <div class="shopping-cart">
    <h2>购物车</h2>

    <div v-if="cartItemCount === 0">
      购物车为空。
    </div>

    <div v-else>
      <ul>
        <li v-for="(item, index) in cart" :key="index">
          {{ item.name }} - {{ item.quantity }} x {{ item.price }}元
          <button @click="removeItemFromCart(item)">移除</button>
        </li>
      </ul>

      <p>总价: {{ cartTotalPrice }}元</p>

      <button @click="emptyCart">清空购物车</button>
    </div>
  </div>
</template>

<script>
import { mapGetters, mapActions } from 'vuex'

export default {
  name: 'ShoppingCart',

  computed: {
    ...mapGetters(['cartItemCount', 'cartTotalPrice']),
    cart() {
      return this.$store.state.cart
    }
  },

  methods: {
    ...mapActions(['removeFromCart', 'clearCart']),

    removeItemFromCart(item) {
      this.removeFromCart(item)
    },

    emptyCart() {
      this.clearCart()
    }
  }
}
</script>

<style scoped>
.shopping-cart {
  border: 1px solid #ddd;
  padding: 20px;
  border-radius: 5px;
  margin: 20px auto;
  width: 300px;
}

.shopping-cart h2 {
  color: #333;
}

.shopping-cart ul {
  list-style-type: none;
  padding: 0;
}

.shopping-cart ul li {
  margin-bottom: 10px;
  line-height: 1.6;
}

.shopping-cart button {
  background-color: #42b983;
  color: white;
  border: none;
  padding: 5px 10px;
  margin-left: 10px;
  border-radius: 3px;
  cursor: pointer;
}

.shopping-cart button:hover {
  background-color: #333;
}
</style>

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA在重启springboot项目时没有自动重新build

IDEA在重启springboot项目时没有自动重新build 问题描述 当项目里面某些依赖或者插件更新了&#xff0c;target的class文件没有找到&#xff0c;导致不是我们需要的效果。 只能手动的清理target文件&#xff0c;麻烦得很 &#xff0c; 单体项目还好说&#xff0c;一次清理就…

Transformer|1.4 CNN遇到的问题与窘境

文章目录 CNN遇到的问题与窘境transformer 的优势 CNN遇到的问题与窘境 判断一个人是否为美人&#xff0c;既要看她各个五官&#xff0c;也要看她各个五官占的比例和协调。 既要照顾好局部信息&#xff0c;也要照顾好全局信息。 局部信息用小的感受野进行感受&#xff0c;而全局…

KKVIEW远程控制软件介绍

KKVIEW是一款全功能远程控制软件&#xff0c;可以随时随地访问家里或公司设备。KKVIEW,连接自由&#xff0c;KKVIEW旨在帮助用户在远程技术支持、远程办公、远程教育等领域便利的开展工作。 [主要功能] 远程桌面 一键远程显示远程桌面&#xff0c;一键开启远程控制&#xff0…

单元测试体系集成

JUnit 是一个基于 Java 语言的单元测试框架&#xff0c;可以用它来编写单元测试用例&#xff0c;用途广泛能被各种工具支持&#xff0c;每个 JUnit 单元测试相对独立&#xff0c;运行方便&#xff0c;结果的展示清晰&#xff1b;也可以把它与持续集成工具 Jenkins 进行集成&…

《WebKit 技术内幕》之五(4): HTML解释器和DOM 模型

4 影子&#xff08;Shadow&#xff09;DOM 影子 DOM 是一个新东西&#xff0c;主要解决了一个文档中可能需要大量交互的多个 DOM 树建立和维护各自的功能边界的问题。 4.1 什么是影子 DOM 当开发这样一个用户界面的控件——这个控件可能由一些 HTML 的标签元素…

Rust - 初识结构体

struct&#xff0c;或者 structure&#xff0c;是一个自定义数据类型&#xff0c;允许命名和包装多个相关的值&#xff0c;从而形成一个有意义的组合。如果你熟悉一门面向对象语言&#xff0c;struct 就像对象中的数据属性。 定义并实例化结构体 结构体和之前介绍过的元组类似…

5 python快速上手

数据类型&#xff08;上&#xff09; 1.整型1.1 定义1.2 独有功能1.3 公共功能1.4 转换1.5 其他1.5.1 长整型1.5.2 地板除 2. 布尔类型2.1 定义2.2 独有功能2.3 公共功能2.4 转换2.5 其他2.5.1 做条件自动转换 3.字符串类型3.1 定义3.2 独有功能&#xff08;18/48&#xff09;练…

Minio文件分片上传实现

资源准备 MacM1Pro 安装Parallels19.1.0请参考 https://blog.csdn.net/qq_41594280/article/details/135420241 MacM1Pro Parallels安装CentOS7.9请参考 https://blog.csdn.net/qq_41594280/article/details/135420461 部署Minio和整合SpringBoot请参考 https://blog.csdn.net/…

stm32 FOC系列 直流有刷控制原理

1、直流有刷驱动板 使用三极管搭建的简易 H 桥电路&#xff0c;如图 5.3.1 所示&#xff1a; 图 5.3.1 是使用三极管搭建的简易 H 桥电路&#xff0c;其中 MOTOR 表示直流有刷电机&#xff0c; Q1、 Q2、 Q3 和 Q4 为 4 个三极管&#xff0c;其中 Q1 和 Q3 接在了电源正极&…

Windows如何部署TortoiseSVN客户端

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…

GitHub图床TyporaPicGo相关配置

本文作者&#xff1a; slience_me 文章目录 GitHub图床&Typora&PicGo相关配置1. Github配置2. picGo配置3. Typora配置 GitHub图床&Typora&PicGo相关配置 关于Typora旧版的百度网盘下载路径 链接&#xff1a;https://pan.baidu.com/s/12mq-dMqWnRRoreGo4MTbKg?…

DolphinDB学习(1):数据库的增删查与常用操作

下载并配置好DolphinDB&#xff0c;同时添加vscode的插件&#xff0c;我们就在vscode上进行操作 创建xxx.dos文件后&#xff0c;就会被识别为DolphinDB的运行文件&#xff0c;非常方便 文章目录 登录数据库的操作创建数据库查找与删除数据库 示例 登录 如果是vscode&#xff…

微信公众号服务器配置启用, Java示例

微信公众号接入指南文档https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html 在微信公众号的服务器配置中&#xff0c;首先需要编写Java代码来处理微信服务器的验证请求。以下是Java示例代码&#xff0c;然后我将为你提供启用服务器配置…

鸿蒙harmony--数据库sqlite详解

今天是1月20号星期六&#xff0c;早安&#xff0c;岁末大寒至&#xff0c;静后春归来。愿他乡故人&#xff0c;漂泊有归宿&#xff0c;前程有奔赴&#xff0c;愿人间不寒&#xff0c;温暖常伴&#xff0c;诸事顺利&#xff0c;喜乐长安。 目录 一&#xff0c;定义 二&#xff…

华为FusionStorage Block、OceanStor 100D、OceanStor pacific的区别

华为FusionStorage Block、OceanStor 100D、OceanStor pacific的区别&#xff1f; 华为块存储到底是叫什么呢&#xff1f; 有接触过华为块存储产品的小伙伴肯定都有疑惑&#xff0c;在FusionStorage 、FusionStorage Block、OceanStor 100D、OceanStor pacific等等的名词中&a…

mysql函数group_concat()返回结果不全

目录 一、场景二、原因三、排查1、查看group_concat_max_len配置2、修改group_concat_max_len配置a) 如果不方便重启mysql&#xff0c;可以通过以下命令进行配置修改b) 修改mysql配置文件&#xff0c;永久生效 一、场景 mysql使用group_concat()函数拼接返回字段时&#xff0c…

Shell 脚本实现自动启动程序、日志管理和定时任务监控

简介 本篇将通过Shell 脚本实现自动启动Java程序、日志管理和定时任务监控。脚本启动程序具灵活定制、可移植性和扩展性强的优点&#xff0c;可以根据需要添加额外的功能、配置选项和自定义行为&#xff0c;从而满足更具体的要求。 脚本编写 vim start_program.sh#!/bin/bas…

[202401C]巨人之力的题解

原题描述&#xff1a; 时间限制: 1000ms 空间限制: 262144kb 题目描述 两千多年以前&#xff0c;身为艾尔迪亚人的尤弥尔意外获得巨人之力&#xff0c;并且创造了九大巨人&#xff0c;其无以匹敌的力量使得整个世界都陷入了无尽的战乱纷争&#xff0c;艾尔迪亚之外的人类过…

第二百七十八回

文章目录 1. 概念介绍2. 使用方法2.1 DropdownMenu2.1 DropdownMenuEntry 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何禁止页面跟随手机自动旋转"相关的内容&#xff0c;本章回中将介绍DropdownMenu组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

ClickHouse与Doris数据库比较

概述 都说“实践是检验真理的唯一标准”&#xff0c;光说不练假把式&#xff0c;那么本文就通过实际的测试来感受一下Doris和clickhouse在读写方面的性能差距&#xff0c;看看Doris盛名之下&#xff0c;是否真有屠龙之技&#xff1b;clickhouse长锋出鞘&#xff0c;是否敢缚苍…