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

yizhihongxing

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日

相关文章

  • vue a标签点击实现赋值方式

    下面是关于“vue a标签点击实现赋值方式”的完整攻略。 思路 在Vue中,我们可以直接通过v-bind指令将数据绑定到HTML标签的属性上,然后通过v-on指令监听标签上的事件,使得在事件触发时可以改变数据的值。因此,针对“vue a标签点击实现赋值方式”的问题,我们的思路是,使用v-bind指令将需要赋值的数据绑定到a标签的属性上,然后使用v-on指令监…

    Vue 2023年5月27日
    00
  • vue.js实现插入数值与表达式的方法分析

    下面是“vue.js实现插入数值与表达式的方法分析”的完整攻略。 1. 插入数值 在 Vue.js 中,我们通常用双花括号 {{}} 来插入一个数据的值。例如: <p>{{ message }}</p> 这里的 message 可以是 Vue 实例中的一个属性,例如: var app = new Vue({ el: ‘#app’, d…

    Vue 2023年5月27日
    00
  • Vue报错:TypeError: Cannot create property ‘xxxx‘ on的解决

    当 Vue 报出 “TypeError: Cannot create property ‘xxxx’ on” 类型的错误时,通常是由于在组件中调用了未定义的数据或方法。这种错误的解决方案可能有很多,我们可以从以下几个方面来处理: 检查组件的数据 首先,我们需要检查组件中使用的数据,确保其已在组件中初始化或定义。如果该数据是作为组件属性传入的,则需要确保传入的…

    Vue 2023年5月27日
    00
  • VueRouter 原理解读之初始化流程

    VueRouter 是 Vue.js 官方的路由管理器,负责管理我们应用程序的路由。VueRouter 的原理可以分为初始化流程、路由监听、处理路由变化等几个方面。在本次对话中,我将为您详细讲解 VueRouter 的初始化流程。 VueRouter 的初始化流程可以分为四个阶段: 创建 Router 实例 注册组件 解析路由配置 监听路由变化 下面我们分别…

    Vue 2023年5月28日
    00
  • 使用Vue.$set()或者Object.assign()修改对象新增响应式属性的方法

    使用Vue.js时,我们通常会遇到在组件渲染时需要动态新增响应式属性的情况。Vue提供了两种方式使对象属性(非响应式的)能被监听到,即Vue.$set()和Object.assign()。 使用Vue.$set()方法 Vue.$set()方法是Vue.js提供的Vue实例方法,用于响应式地向已有对象添加新的属性,或修改已有属性的值。这个方法的第一个参数是目…

    Vue 2023年5月28日
    00
  • Vue echarts画甘特图流程详细讲解

    下面我将详细讲解“Vue echarts画甘特图流程详细讲解”的完整攻略。 1. 甘特图简介 甘特图是一种常用于项目管理的图表类型,用于展示任务的时间轴,显示各个任务的开始时间、结束时间和持续时间。它能够清晰地展示每个任务的进展情况,帮助团队掌握项目进展,及时协调、调整工作计划和资源分配。 2. 准备工作 在使用 Vue 和 echarts 画甘特图之前,我…

    Vue 2023年5月29日
    00
  • vue实现pdf文档在线预览功能

    下面是详细的讲解“vue实现pdf文档在线预览功能”的完整攻略: 确认需求 在开始实现在线预览PDF文档的功能之前,我们需要确定需求。在本节中,我们需要考虑以下问题: 我们将使用哪个PDF库来解析和显示PDF文档? 我们将如何将PDF文档加载到我们的Vue应用程序中? 我们将如何实现PDF文档的渲染和导航? 选择PDF库 在Vue应用程序中实现PDF预览功能…

    Vue 2023年5月28日
    00
  • 详解vue 数组和对象渲染问题

    详解vue 数组和对象渲染问题 在使用Vue进行数据绑定时,数组和对象是常用的数据类型。本文将对Vue数组和对象的渲染问题进行详尽的讲解,并提供两条示例说明,以帮助读者快速掌握数组和对象的渲染方法。 数组渲染 数组渲染是Vue中常见的数据绑定方式,常用的渲染方法有v-for和v-if。v-for可用于渲染数组中所有元素,而v-if则可用于根据数组元素的值来判…

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