Vuex 快速入门(简单易懂)

Vuex 快速入门(简单易懂)

前言

Vuex是Vue.js的一个状态管理工具,可以方便地处理组件之间的数据共享问题。本文将介绍Vuex的基本概念和使用方法。

Vuex的基本概念

Vuex包含了五个基本概念:

  • State:存储数据的地方,可以在组件中直接访问,但是不能直接修改
  • Getter:相当于State的计算属性,可以根据State计算出新的值,并缓存起来
  • Mutation:修改State的唯一途径,必须是同步的操作
  • Action:异步操作State的方式,可以通过Action调用多个Mutation
  • Module:将Store分割成多个模块,方便管理和使用

Vuex的使用方法

安装和引入

npm install vuex --save

在main.js中引入Vuex,并创建一个全局的Store:

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

Vue.use(Vuex)

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

new Vue({
  el: '#app',
  store, // 将store注入到Vue实例中
  template: '<App/>',
  components: { App }
})

访问和修改State

computed: {
  count () {
    return this.$store.state.count
  },
  doubleCount () {
    return this.$store.getters.doubleCount
  }
}

methods: {
  increment () {
    this.$store.commit('increment')
  },
  decrement () {
    this.$store.commit('decrement')
  },
  incrementAsync () {
    this.$store.dispatch('incrementAsync')
  }
}

在组件中使用Getter和Action

computed: {
  doubleCount () {
    return this.$store.getters.doubleCount
  }
},
methods: {
  incrementAsync () {
    this.$store.dispatch('incrementAsync')
  }
}

在组件中使用MapState、MapGetter、MapMutation和MapAction

import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'

computed: {
  ...mapState({
    count: state => state.count
  }),
  ...mapGetters([
    'doubleCount'
  ])
},
methods: {
  ...mapMutations([
    'increment',
    'decrement'
  ]),
  ...mapActions([
    'incrementAsync'
  ])
}

Vuex的示例

示例1:计数器

<template>
  <div>
    <p>Count: {{ count }}</p>
    <p>Double Count: {{ doubleCount }}</p>
    <button @click="increment">+1</button>
    <button @click="decrement">-1</button>
    <button @click="incrementAsync">+1 Async</button>
  </div>
</template>

<script>
export default {
  computed: {
    ...mapState({
      count: state => state.count
    }),
    ...mapGetters([
      'doubleCount'
    ])
  },
  methods: {
    ...mapMutations([
      'increment',
      'decrement'
    ]),
    ...mapActions([
      'incrementAsync'
    ])
  }
}
</script>
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    },
    decrement (state) {
      state.count--
    }
  },
  getters: {
    doubleCount: state => state.count * 2
  },
  actions: {
    incrementAsync ({ commit }) {
      setTimeout(() => {
        commit('increment')
      }, 1000)
    }
  }
})

示例2:购物车

<template>
  <div>
    <div>
      <div v-for="(product, index) in products" :key="product.id">
        <p>{{ product.name }} - {{ product.price }}</p>
        <button @click="addToCart(index)">Add to Cart</button>
      </div>
    </div>
    <div>
      <h1>Cart</h1>
      <div v-for="(product, index) in cart" :key="index">
        <p>{{ product.name }} - {{ product.price }}</p>
        <button @click="removeFromCart(index)">Remove from Cart</button>
      </div>
      <p>Total: {{ cartTotal }}</p>
    </div>
  </div>
</template>

<script>
export default {
  data () {
    return {
      products: [
        { id: 1, name: 'Product A', price: 100 },
        { id: 2, name: 'Product B', price: 200 },
        { id: 3, name: 'Product C', price: 300 }
      ]
    }
  },
  computed: {
    cart () {
      return this.$store.state.cart
    },
    cartTotal () {
      return this.$store.getters.cartTotal
    }
  },
  methods: {
    addToCart (index) {
      const product = this.products[index]
      this.$store.commit('addToCart', product)
    },
    removeFromCart (index) {
      this.$store.commit('removeFromCart', index)
    }
  }
}
</script>
const store = new Vuex.Store({
  state: {
    cart: []
  },
  mutations: {
    addToCart (state, product) {
      state.cart.push(product)
    },
    removeFromCart (state, index) {
      state.cart.splice(index, 1)
    }
  },
  getters: {
    cartTotal: state => {
      return state.cart.reduce((total, product) => {
        return total + product.price
      }, 0)
    }
  }
})

结论

Vuex是Vue.js的一个状态管理工具,方便处理组件之间的数据共享问题。Vuex包含了五个基本概念:State、Getter、Mutation、Action和Module。在组件中使用Vuex可以提高代码的复用性和可维护性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vuex 快速入门(简单易懂) - Python技术站

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

相关文章

  • 这15个Vue指令,让你的项目开发爽到爆

    下面我将详细介绍“这15个Vue指令,让你的项目开发爽到爆”的完整攻略。 一、官方指令 1. v-if、v-else、v-else-if v-if:如果条件为true,则渲染元素。 v-else:如果在同一父元素中的 v-if 或 v-else-if 的条件不成立,则渲染元素。 v-else-if:在同一元素上添加一个条件,如果前面所有的 v-if 和 v-…

    Vue 2023年5月29日
    00
  • vue+element的表格实现批量删除功能示例代码

    下面是 “vue+element的表格实现批量删除功能示例代码” 的完整攻略: 1. 安装 Element UI 和 Axios 在开始之前,你需要先安装 Element UI 和 Axios,可以使用 npm 来安装: npm install element-ui axios –save 同时在文件中引入: import Vue from ‘vue’ i…

    Vue 2023年5月28日
    00
  • VUE响应式原理的实现详解

    VUE响应式原理的实现详解 介绍 VUE是一个MVVM模式的渐进式框架,其中响应式是VUE的核心特性之一,使得数据与界面保持同步,大大提高了开发效率。本文将阐述VUE响应式原理的实现,帮助读者更加深入理解VUE框架。 数据劫持 VUE的响应式实现依赖于ES5的get和set方法。在一个对象被创建时,遍历对象上的所有属性,将其转化为getter/setter,…

    Vue 2023年5月27日
    00
  • vue-router传递参数的几种方式实例详解

    下面我来详细讲解“vue-router传递参数的几种方式实例详解”的完整攻略。 1. 传递参数的基本方式 在vue-router中,我们可以通过在router-link组件的to属性中传递参数,然后在目标组件中通过$route.params获取参数。具体步骤如下: 设置router-link组件的to属性,传递参数。例如: // 在组件中使用router-l…

    Vue 2023年5月27日
    00
  • vue中使用vue-pdf组件实现文件预览及相应报错解决

    下面是“vue中使用vue-pdf组件实现文件预览及相应报错解决”的完整攻略: 1. 安装依赖 首先需要安装 vue-pdf 和 pdfjs-dist 两个依赖,在终端中运行以下命令: npm install vue-pdf pdfjs-dist 2. 引入依赖 在需要使用 vue-pdf 的组件中,引入该组件: <template> <d…

    Vue 2023年5月28日
    00
  • 基于vue-draggable 实现三级拖动排序效果

    当我们需要实现在前端页面中完成三级拖动排序效果的时候,可以使用vue-draggable组件来完成。具体实现步骤如下: 步骤一:安装vue-draggable 首先要安装vue-draggable组件: npm install vuedraggable 步骤二:定义基本结构 在Vue组件中,我们需要定义一些基本的结构,包括三个列表,两个按钮等。可以参考以下代…

    Vue 2023年5月27日
    00
  • 优雅地使用loading(推荐)

    优雅地使用loading(推荐) 在Web应用程序中,常常需要使用loading提示来增加用户体验,并为用户提供反馈信息。然而,如果loading的呈现不恰当,可能会让用户感觉烦躁、失去信心。因此,我们需要知道如何优雅地使用loading,尽可能减少其对用户的影响。 选择loading样式和位置 在使用loading时,样式和位置是很重要的。一般来说,loa…

    Vue 2023年5月27日
    00
  • Vue this.$router.push(参数)实现页面跳转操作

    当我们使用Vue.js构建单页面应用时,有时需要在不同的页面之间进行路由跳转。Vue Router提供了一些方法来实现这一功能,其中之一是$this.$router.push()方法。以下是关于如何使用$this.$router.push()方法实现页面跳转操作的完整攻略。 前置准备 要使用Vue Router,需先安装Vue Router模块并配置路由。 …

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