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

这篇具有很好参考价值的文章主要介绍了【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>

【Vue】使用 Vuex 作为状态管理,vue.js,前端,javascript文章来源地址https://www.toymoban.com/news/detail-816679.html

到了这里,关于【Vue】使用 Vuex 作为状态管理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【vue3】前端应用中使用WebSocket与服务器进行通信并管理连接状态。

    1、写一个hook函数 url 是WebSocket的服务器地址,其中 Math.random() 用于生成一个随机数,以避免缓存问题。 onConnected 、 onDisconnected 和 onError 是连接建立、断开和出错时的回调函数,你可以根据实际需求来定义它们。 onMessageDefault 是当接收到消息时的默认处理函数,在这里将接收

    2024年02月09日
    浏览(62)
  • Vue | Vue.js 全家桶 Pinia状态管理

    🖥️ Vue .js专栏:Node.js Vue.js 全家桶 Pinia状态管理 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ 👉 你的一键三连是我更新的最大动力❤️ 目录 一、Pinia和Vuex的对比 什么是Pinia呢? Pina和

    2024年01月16日
    浏览(53)
  • vue­-router路由和前端状态 管理

    vue­-router路由基本加载 可以分为四步 :具体流程如下 : 安装 在命令行中 进入到自己的项目目录输入一下命令 安装依赖: npm install --save vue-router 在需要用到路由跳转的模块中引用(本文是在在入口文件 main.js 进行设置) import router from ‘vue-router’ Vue.use(router) 配置路由文件,

    2024年02月02日
    浏览(47)
  • 10 使用Vue+axios+Vuex实现登录后前端数据本地化存储实战

    这已经是《 Vue + SpringBoot前后端分离项目实战 》专栏的前端部分第8篇博客了, 服务端部分 由天哥(天哥主页)负责,目前专栏目录如下: Vue + SpringBoot前后端分离项目实战 - 前端部分 1. 手把手带你做一套毕业设计-征程开启 2. 我应该把毕业设计做到什么程度才能过关? 3

    2024年02月16日
    浏览(41)
  • Vue + Element UI 前端篇(八):管理应用状态

    1. 引入背景 像先前我们是有导航菜单栏收缩和展开功能的,但是因为组件封装的原因,隐藏按钮在头部组件,而导航菜单在导航菜单组件,这样就涉及到了组件收缩状态的共享问题。收缩展开按钮触发收缩状态的修改,导航菜单需要根据收缩状态来设置导航栏的宽度。这样就

    2024年02月09日
    浏览(62)
  • vue中vuex的五个属性和基本用法,另加js-cookie的使用

    VueX 是一个专门为 Vue.js 应用设计的状态管理构架,统一管理和维护各个vue组件的可变化状态(你可以理解成 vue 组件里的某些 data )。 state, getters, mutations, actions, modules。 1. state: vuex的基本数据,用来存储变量 2. geeter: 从基本数据(state)派生的数据,相当于state的计算属性 3.

    2024年02月14日
    浏览(43)
  • VueSupercharge 精通指南:构建超级状态管理 Vue.js 应用

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 这个状态自管理应用包含以下几个部分: 状态,驱动应用的数据源; 视图,以声明方式将状态映射到视图;

    2024年01月20日
    浏览(40)
  • 使用Vue+Vuex+CSS3完成管理端响应式架构模板实战

    上节回顾 上一节我们通过引入 md5 ,对密码进行了不可逆加密;然后对 用户名 和 密码 进行了数据整理,发送axios请求,同时引入了 Vuex前端本地化数据管理 ,将用户名和token进行存储。还不明白上下文的同学可以回头去专栏看一下:使用Vue+axios+Vuex实现登录后前端数据本地化

    2023年04月15日
    浏览(39)
  • Vue项目保持用户登录状态(localStorage + vuex 刷新页面后状态依然保持)

            在前端项目开发中,实现用户的登陆注册功能时常常会有一个问题,那就是我们设置的登录状态,在浏览器页面刷新后就消失了,这其实只是因为我们没有保存用户状态。 这里小马演示使用的是 localStorage   +   vuex 方法(其他诸如 sessionStorage、cookie 等用法相同,

    2023年04月08日
    浏览(38)
  • 11 使用Vue+Vuex+CSS3完成管理端响应式架构模板实战

    上节回顾 上一节我们通过引入 md5 ,对密码进行了不可逆加密;然后对 用户名 和 密码 进行了数据整理,发送axios请求,同时引入了 Vuex前端本地化数据管理 ,将用户名和token进行存储。还不明白上下文的同学可以回头去专栏看一下:使用Vue+axios+Vuex实现登录后前端数据本地化

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包