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日

相关文章

  • webpack4打包vue前端多页面项目

    关于“webpack4打包vue前端多页面项目”的攻略,我会从以下几个方面进行详细讲解: 安装webpack及相关依赖 配置webpack 多页面配置 示例说明 下面我们将一步一步进行讲解。 1. 安装webpack及相关依赖 首先,我们需要全局安装webpack和webpack-cli,这里我使用的是webpack4版本: npm install webp…

    Vue 2023年5月28日
    00
  • vue 动态style 拼接宽度问题

    关于“vue动态style拼接宽度问题”的完整攻略,我们可以从以下几个方面进行讲解: 一、vue动态style的基本使用 在vue中,我们可以通过v-bind指令的方式动态绑定样式属性,例如: <div v-bind:style="{ color: activeColor, fontSize: fontSize + ‘px’ }"&…

    Vue 2023年5月27日
    00
  • VUE3+mqtt封装解决多页面使用需重复连接等问题(附实例)

    一、介绍 本篇攻略主要讲解如何使用Vue 3和MQTT封装解决多页面需要重复连接的问题。 基于MQTT协议的Web应用程序可以实现快速响应和低延迟的实时数据更新,并且可以处理大规模的并发连接。本文将提供一个示例代码,打破传统多页面应用程序多次连接MQTT服务器的限制。 二、MQTT介绍 MQTT是一种基于发布(publish)/订阅(subscribe)模式…

    Vue 2023年5月28日
    00
  • uniapp中设置全局页面背景色的简单教程

    当我们需要为Uniapp中的多个页面同时设置相同的背景色时,可以使用全局样式来方便地实现这一目的。下面是在Uniapp中设置全局页面背景色的简单教程: 设置全局样式 在 App.vue 中的 <style> 标签中添加全局样式,例如: page { background-color: #f5f5f5; } 这里的 page 选择器表示所有页面的根…

    Vue 2023年5月28日
    00
  • ES6中常见基本知识点的基本使用实例汇总

    ES6中常见基本知识点的基本使用实例汇总,我来给大家讲解一下。 1. let和const let和const是ES6新增的关键字,用来声明变量和常量。其中let用于声明可变的变量,const用于声明不变的常量。 let count = 0; // 可变的变量 count = 1; const MAX_COUNT = 10; // 不变的常量 MAX_COUN…

    Vue 2023年5月28日
    00
  • 一步步讲解Vue如何启动项目

    作为Vue项目的作者,我很乐意为您介绍如何启动Vue项目。下面是一步步讲解的完整攻略: 步骤一:安装 Node.js Vue.js 是一个基于Node.js构建的应用程序框架,因此,为了启动 Vue 项目,首先需要安装 Node.js。请访问 Node.js 官网 下载并安装 Node.js 的最新版本。 步骤二:使用 Vue CLI 快速创建一个 Vue …

    Vue 2023年5月28日
    00
  • vue 实现在函数中触发路由跳转的示例

    当我们在使用 Vue.js 开发 SPA(单页应用)时,使用路由跳转是必不可少的功能。在函数中触发路由跳转,可以让我们更加灵活地控制页面跳转,满足我们的设计需求。下面是实现这一功能的完整攻略: 创建 Vue 项目并安装所需依赖 我们首先需要创建一个 Vue 项目并在其中安装所需的依赖。可以使用 Vue CLI 快速创建一个项目,然后在项目根目录下运行以下命令…

    Vue 2023年5月28日
    00
  • Vue组件间的通信pubsub-js实现步骤解析

    下面我将详细讲解“Vue组件间的通信pubsub-js实现步骤解析”。 什么是pubsub-js? pubsub-js是一个基于发布/订阅模式的Javascript库,提供了一种解耦的方式,让我们的代码更加灵活和易于维护。在Vue组件间的通信中,我们可以使用pubsub-js来实现跨组件的数据传递。 pubsub-js的安装 我们可以使用npm或yarn在项…

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