vue简单的store详解

Vue简单的Store详解

在Vue中,通过使用Vuex来管理应用的状态。它包含了一个全局的状态管理器,通过单向数据流的方式来管理数据。Vuex可以集中管理组件之间的数据共享,以及对数据的具体控制。

Vuex Store

在Vuex中,一个store就是把用户的所有状态集中到一起的容器,可以通过store中的state来管理用户的所有状态。在store中,可以通过mutation或者action更新state的值,然后在组件中监听state的变化来控制组件的显示。

创建store

在创建store之前,需要先安装Vuex,可以通过npm包管理来安装。

npm install vuex --save

在Vue项目中,一般在main.js中导入vuex,并通过Vue.use()来启用:

import Vuex from 'vuex'
import Vue from 'vue'

Vue.use(Vuex)

const store = new Vuex.Store({
  state: {
   // 用户的状态
  },
  getters: {
   // 可以理解为store中的计算属性,派生新的状态,并且会缓存计算结果
  },
  mutations: {
   // 更新状态的唯一方式,在这里进行同步操作
  },
  actions: {
   // 在这里进行异步的操作,然后通过commit把结果传递给mutation来同步状态
  }
})

其中,state就是用户的状态,通过getter来派生出新的状态,mutation用来更新状态,action用于异步更新状态。

实例示例

假设我们要实现一个简单的购物车功能,在不同的页面中可以增加商品,然后在购物车页面中查看,移除,清空商品。我们可以将购物车状态保存在store中,通过mutation来更新。

  • 创建状态
const store = new Vuex.Store({
  state: {
    cartList: []
  },
  getters: {
    cartCount: state => {
      return state.cartList.length
    }
  },
  mutations: {
    addToCart: (state, goods) => {
      state.cartList.push(goods)
    },
    removeFromCart: (state, goods) => {
      const index = state.cartList.findIndex(item => item.id === goods.id)
      if (index !== -1) {
        state.cartList.splice(index, 1)
      }
    },
    clearCart: state => {
      state.cartList = []
    }
  },
  actions: {
    addGoods: ({ commit }, goods) => {
      setTimeout(() => {
        commit('addToCart', goods)
      }, 1000)
    }
  }
})

首先,我们创建了一个购物车状态cartList,它是一个空数组。接着定义了一个cartCount用于计算购物车数量,并且定义了三个mutation:addToCart, removeFromCart 和 clearCart。addToCart用于添加商品到购物车,removeFromCart用于从购物车中移除商品,clearCart用于清空购物车。

然后定义了一个action,用于异步添加商品到购物车。假设添加的商品需要通过ajax请求后端获取,然后再添加到购物车中,这个异步操作就可以在action中完成。购物车添加成功后,通过mutation来同步更新状态。因为我们要等待异步操作完成之后才能添加商品到购物车中,所以我们使用setTimeout来模拟异步操作。

  • 使用状态
<template>
  <div>
    <p>{{ cartCount }} items in the cart</p>
    <button @click="addGoods">Add a good</button>
    <button @click="removeGoods">Remove a good</button>
    <button @click="clearCart">Clear cart</button>
  </div>
</template>

<script>
  export default {
    methods: {
      addGoods () {
        const goods = { id: Date.now(), name: 'Goods', price: '10.00' }
        this.$store.dispatch('addGoods', goods)
      },
      removeGoods () {
        const goods = { id: Date.now(), name: 'Goods', price: '10.00' }
        this.$store.commit('removeFromCart', goods)
      },
      clearCart () {
        this.$store.commit('clearCart')
      }
    },
    computed: {
      cartCount () {
        return this.$store.getters.cartCount
      }
    }
  }
</script>

在组件中,通过调用store的dispatch和commit方法来进行状态的修改,通过计算属性来获取当前购物车数量。在添加商品到购物车中时,调用了dispatch方法,这会触发action的处理过程,然后通过commit方法把结果传递给mutation进行同步。在从购物车中移除商品和清空购物车时,调用了commit方法,它们是同步更新状态的,没有异步操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue简单的store详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • gojs实现蚂蚁线动画效果

    为了实现蚂蚁线动画效果,可以使用gojs库中的动画和数据模型功能。下面是实现该效果的完整攻略: 创建GoJS图表数据模型 蚂蚁线动画效果需要使用GoJS的Layout模块。在Layout模块的输入上,需要创建一个数据模型,以描述要排列的节点及它们之间的连接关系。数据模型可以由JSON对象创建,包含节点和联系人数组。示例: var data = { nodeD…

    Vue 2023年5月28日
    00
  • vue-cli中的babel配置文件.babelrc实例详解

    Vue-cli中的babel配置文件.babelrc实例详解,这涉及到Vue-cli项目的ES6转码和其他一些相关问题。 1. Babel是什么? Babel是一个广受欢迎的JavaScript编译器,它可以将ES6(ES2015)以上的JavaScript代码编译为ES5代码。由于许多浏览器缺乏支持,因此Babel可以使你在更多的浏览器环境中实现更先进的J…

    Vue 2023年5月28日
    00
  • Vue接口封装的完整步骤记录

    以下是Vue接口封装的完整步骤记录的攻略: 1. 确定接口需求 在进行接口封装之前,首先需要明确接口的需求,包括但不限于接口的用途、参数、API文档等。这可以帮助我们更好地理解业务需求,从而设计出更好的API接口。 具体来说,需要确定以下几点: 接口的用途:明确该接口的作用,它是提供了什么功能?这对我们后续的接口设计有很大的帮助。 接口的参数:需要确定接口所…

    Vue 2023年5月27日
    00
  • JS 实现获取对象属性个数的方法小结

    JS 实现获取对象属性个数的方法小结 在 JavaScript 中,我们可以通过不同的方法获取对象的属性个数,下面是几种常见方法的介绍以及示例说明。 方法一:Object.keys() Object.keys() 方法返回一个由指定对象自身的属性名组成的数组,我们可以通过获取该数组的长度来获取到对象的属性个数。 const obj = { name: ‘Jo…

    Vue 2023年5月28日
    00
  • vue与vue-i18n结合实现后台数据的多语言切换方法

    下面是“vue与vue-i18n结合实现后台数据的多语言切换方法”的完整攻略: 1. 安装和配置vue-i18n 首先需要在项目中安装和配置vue-i18n,安装命令为: npm install vue-i18n –save 然后在main.js中引入vue-i18n并进行配置: import Vue from ‘vue’ import App from …

    Vue 2023年5月28日
    00
  • uniapp路由uni-simple-router实例详解

    uni-app路由 – uni-simple-router实例详解 引言 在uni-app的开发中,使用Vue.js的开发方式来创建页面,同时也使用了Vue-router来处理路由逻辑。但是,uni-app的路由也可以使用uni-simple-router来实现。uni-simple-router是一个轻量级的路由库,它使用Vue.js同样的路由API来实现…

    Vue 2023年5月28日
    00
  • 详解vue-cli下ESlint 配置说明

    下面我将为你提供详细的“详解vue-cli下ESlint 配置说明”的攻略。 1. 前言 ESLint 是一个可以帮助我们约束代码风格的工具,Vue CLI 集成了 ESLint,我们可以直接在 Vue 项目里进行代码风格检查。如果要通过 ESLint 实现代码的自动修复功能,需要借助于 Prettier 这个代码格式化工具。 2. ESLint 配置文件 …

    Vue 2023年5月28日
    00
  • 基于vue实现8小时带刻度的时间轴根据当前时间实时定位功能

    下面是基于Vue实现8小时带刻度的时间轴根据当前时间实时定位功能的完整攻略: 1.需求分析 时间轴分为8个小时 时间轴刻度需对应具体时刻,如每小时1个刻度 时间轴需根据当前实际时间进行实时定位,可自动滚动到相应时刻 2. 实现方式 使用Vue框架实现,具体步骤如下: 2.1 创建Vue项目 创建一个新项目,命名为time-axis,安装所需依赖: // 安装…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部