Vue的Flux框架之Vuex状态管理器

Vue的Flux框架之Vuex状态管理器

Vuex是Vue.js的官方状态管理库,它提供了一种集中式存储管理应用不同组件共享的所有状态的解决方案。Vuex在应用中的作用类似于React的Flux架构中的Store,并借鉴了Redux的一些设计理念。

Vuex的核心概念

Vuex解决了Vue中共享状态管理的问题,关键是它的核心概念非常简单,包括:

  1. State:存储应用级别状态的对象,可以直接通过this.$store.state访问或通过mapState辅助函数将其映射到组件的计算属性中;

  2. Getter:从state中派生出新的状态的函数,类似于Vue组件中的computed属性,可以通过this.$store.getters访问或通过mapGetters辅助函数将其映射到组件的计算属性中;

  3. Mutation:更改state中状态的唯一途径,Mutations是同步操作,它们负责保证状态的唯一性,只能通过store.commit()方法提交一个mutation,可以通过mapMutations辅助函数将Mutation映射到组件的methods中;

  4. Action:通过触发Mutation来异步更改state状态的方法,可以在Action函数中调用API,但是Action本身并不能直接更改state,需要通过commit触发mutation来更改state,可以通过mapActions辅助函数将Action映射到组件的methods中。

Vuex的使用流程

Vuex所有状态管理的逻辑全部存储在一个store对象中,该对象包含四个部分:State、Getter、Mutation和Action。使用Vuex要分以下几个步骤:

  1. 安装Vuex库,声明各个状态管理模块

``` javascript
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  getters: {
    doubleCount(state){
      return state.count * 2
    }
  },
  actions: {
    incrementAsync ({commit}) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  }
})
export default store

```

  1. 在Vue组件中引用Vuex库

``` javascript
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
import { currency } from '@/currency.js'

export default {
  computed: {
    ...mapState([
      'products'
    ]),
    ...mapGetters([
      'convertedPrice'
    ])
  },
  methods: {
    ...mapMutations([
      'reduceProductInventory'
    ]),
    ...mapActions([
      'addToCart'
    ])
  }
}

```

示例说明

示例1:购物车示例

以下简单的购物车示例展示了Vuex中各个核心概念是如何工作的。在该示例中,我们需要将Vue组件中的状态共享给其他组件,同时异步更改状态以更新购物车。

(1)State

首先,定义存储购物车状态的对象,其中包含了需要共享的状态。

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

    Vue.use(Vuex)

    const store = new Vuex.Store({
      state: {
        added: [],
        all: [
          {
            id: '001',
            name: 'iPhone',
            description: 'iPhone是苹果公司推出的一款智能手机。',
            price: 5000
          }
        ]
      }
    })

    export default store

其中,added保存了添加到购物车中的商品,all保存了所有商品列表。

(2)Mutation

定义这些更改状态的方法,我们可以使用Vue的Mutation来更改状态

    mutations: {
      ADD_TO_CART (state, id) {
        const record = state.added.find(p => p.id === id)
        if (!record) {
          state.added.push({
            id,
            quantity: 1
          })
        } else {
          record.quantity++
        }
      }
    }

上述Mutation方法ADD_TO_CART接收一个state对象和需要添加到购物车的商品的id. 该方法将id添加到state中的added数组,如果相同的商品已经在added数组中,则增加quantity数量。

(3)Getter

遵循Vuex中的概念,我们要定义一个计算购物车商品总价的getter

    getters: {
      cartProducts: (state) => {
        return state.added.map(({id, quantity}) => {
          const product = state.all.find(p => p.id === id)
          return {
            name: product.name,
            price: product.price,
            quantity
          }
        })
      },
      cartTotalPrice: (state, getters) => {
        return getters.cartProducts.reduce((total, product) => {
          return total + product.price * product.quantity
        }, 0)
      }
    }

其中,cartProducts方法计算了购物车中加入了哪些商品以及数量。 cartTotalPrice方法使用了cartProducts的计算结果,计算出所选择的商品的总价。注意,此处我们利用了ES6中的解构和计算属性。

(4)Action

我们使用Vue的Action来发送异步请求到服务器,当数据得到响应后,我们提交该Mutation。

    actions: {
      addToCart({commit}, product){
        commit('ADD_TO_CART', product.id)
      }
    }

在上述代码中,我们定义了addToCart方法,接收一个Product对象,并提交一个ADD_TO_CART型Mutation来添加该商品到购物车中。

示例2:Todo List

以下是另一个使用Vuex的Todo列表例子,它展示了Vuex在多组件共享状态中的使用。在该示例中,我们维护一个Todo列表,并在不同组件间共享该状态。

(1)State

定义存储Todo列表状态的state对象。

    const store = new Vuex.Store({
      state: {
        todos: []
      }
    })

其中,todos保存Todo列表中的所有Todo项。

(2)Mutation

定义更改Todo列表状态的ADD_TODO和TOGGLE_TODO两个方法,一个用于添加新的todo项,另一个用于标记一个已有项的完成状态。

    mutations: {
      ADD_TODO (state, text) {
        state.todos.push({
          text: text,
          completed: false
        })
      },
      TOGGLE_TODO (state, todo) {
        todo.completed = !todo.completed
      }
    }

(3)Getter

定义一个所有todo项的计算属性。

    getters: {
      allTodoItems: state => state.todos
    }

(4)Action

定义一个异步方法,用于清除完成的todo项。

    actions: {
      clearCompleted: ({commit}) => {
        commit('CLEAR_COMPLETED')
      }
    }

最后,为了向其他组件公开store对象,我们要在Vue组件中引用Vuex库并注入-store。

    import { mapState } from 'vuex'
    export default {
      name: 'TodoList',
      computed: {
        ...mapState({
          todos: state => state.todos
        }),
        allDone: {
          get () {
            return this.remaining === 0
          },
          set (value) {
            this.$store.commit('MARK_ALL', value)
          }
        }
      }
    }

在该组件中,我们使用了mapState来绑定computed项中的数据到store中的state.todos。当对allDone属性进行读取和写入时,我们将使用mapMutations映射来自动调用store.commit()方法。

以上就是关于Vue的Flux框架之Vuex状态管理器的介绍,同时给出了购物车和Todo List两个示例说明,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue的Flux框架之Vuex状态管理器 - Python技术站

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

相关文章

  • Vue3中简单使用Mock.js方法实例分析

    让我来详细讲解“Vue3中简单使用Mock.js方法实例分析”的完整攻略。 什么是Mock.js Mock.js是一个前端模拟数据生成库,可以轻松生成随机数据,拦截 Ajax 请求及设置模拟数据,支持为前后端分离开发提供帮助。Mock.js可以帮助前端开发人员快速构建原型,演示和测试。 在Vue开发中,我们可以使用Mock.js来模拟后端接口,以方便本地开发…

    Vue 2023年5月28日
    00
  • vue上传文件formData上传的解决全流程

    下面我来详细讲解“Vue上传文件formData上传的解决全流程”的完整攻略。本攻略将围绕如下四个方面展开: 介绍formData的基本概念 通过vue实现文件formData上传的步骤 以图片上传为例进行演示 以文件上传为例进行演示 1. formData的基本概念 form是HTML表单的一个本质,每个form控制一组WEB控件,这些控件包括输入框,按钮…

    Vue 2023年5月28日
    00
  • 微信小程序 JS动态修改样式的实现代码

    下面是详细的攻略: 1. 前置知识 在讲解微信小程序 JS 动态修改样式的实现代码前,我先介绍一下需要了解的前置知识。 1.1 小程序样式 小程序的样式可以分为两种:全局样式和局部样式。 全局样式:通过 app.wxss 文件定义,作用于整个小程序; 局部样式:通过在组件中定义样式(例如:.wxml 文件中的 class 或 style 属性),只作用于当前…

    Vue 2023年5月27日
    00
  • 关于element ui的菜单default-active默认选中的问题

    关于element ui的菜单default-active默认选中的问题: 1. 理解 default-active 属性 default-active 属性是 Element UI 中菜单组件 el-menu 的一个选项,作用是设置菜单默认选中的项。使用该属性时,只需将需要默认选中的菜单项的 index 值设置给 default-active 即可。 例如…

    Vue 2023年5月28日
    00
  • 15个Vue技巧,你都知道吗

    15个Vue技巧,你都知道吗 本篇攻略将讲解15个Vue的技巧,旨在提高您的Vue开发效率。 技巧一:使用v-for循环时,给每一项设置key 在使用v-for循环时,需要给每一项设置一个唯一的key值,以便在更新数据时能够快速定位需要更新的元素,否则会出现性能问题。 <template> <ul> <li v-for=&quo…

    Vue 2023年5月27日
    00
  • vuex存储数据的几种方法实例详解

    我为您详细讲解“Vuex存储数据的几种方法实例详解”的攻略。 什么是Vuex Vuex是Vue.js应用程序中的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 组件中存储数据的问题 在Vue.js应用程序中,对于一个组件来说,如果它的状态发生变化,这个变化对于其他组件是不可见的;如果多个组件共享同一…

    Vue 2023年5月28日
    00
  • Vue中v-for的数据分组实例

    接下来我将为你讲解“Vue中v-for的数据分组实例”的完整攻略,让你更好的掌握Vue中v-for的数据处理机制。 对于大多数的Vue初学者来说,熟练掌握v-for指令是非常基础且关键的一步,而其中较为复杂的一个用法就是数据分组。在Vue中使用v-for指令对数据进行分组可以使数据的结构更加清晰,利于后续的数据处理和展示。 那么如何在Vue中实现数据分组呢?…

    Vue 2023年5月27日
    00
  • Vue axios 将传递的json数据转为form data的例子

    当我们使用 Vue.js 和 axios 进行数据交互时,通常会使用 JSON 数据格式来传递数据。但在某些情况下,我们需要将 JSON 数据转换成 FormData 格式,例如在使用 Form 表单上传文件时。下面是一个 Vue axios 将传递的 JSON 数据转为 FormData 的例子: 步骤一:安装 axios 首先需要安装 axios,可以使…

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