深入理解Vuex的作用

深入理解Vuex的作用

什么是Vuex?

Vuex 是一个专门为 Vue.js 设计的状态管理库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

在一个典型的 Vue 应用中,组件之间的通信是通过 props 和事件进行的,这样简单的场景并没有问题,但是在大型的应用中,状态的管理会变得非常复杂。每一个子组件都需要用 props 来传递状态,或者用事件来触发状态的改变,这样既是极为繁琐且容易出错,也不容易维护和扩展。而使用 Vuex 可以高效地解决这个问题。

Vuex 是受到了 Flux 和 Redux 的启发,主要包含以下四个大的概念:

  1. state: 提供唯一的公共数据源,所有共享状态放置于此。
  2. mutations: 可以修改 state 的方法,但是是同步执行的,是Vuex中唯一的修改状态的方式。
  3. actions: 异步执行的操作,是可以包含任意异步操作的方法体,但是它不能直接修改 state。必须通过提交 mutations 来调用 mutations 中的某个方法来修改状态。
  4. getters: 可以直接获取 state 中的数据的方法。

Vuex的几个重要概念

state

state 包含了应用中每个组件都需要的共享状态。通过定义 store 对象中的 state 属性。如下所示:

const store = new Vuex.Store({
  state: {
    count: 0
  }
})

mutations

mutations 是唯一可以修改 state 数据的地方。Vuex 中的 mutations 和事件很像,每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。

定义 mutations:

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      // 变更状态都要通过提交 mutation
      state.count++
    }
  }
})

提交 mutations:

store.commit('increment');

actions

actions 定义处理状态提交的异步操作。actions 函数接收一个 context 参数,这个参数提供了与 store 实例具有相同方法和属性的对象,比如 commit 方法、dispatch 方法、state 实例等等。

定义 actions:

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

提交 actions:

store.dispatch('incrementAsync');

getters

getters 可以看作 store 的计算属性。它们会根据 store 中的 state 计算出新的值,并返回这些值。可以通过 getters 访问到 state。

定义 getters:

const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '...', done: true },
      { id: 2, text: '...', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})

使用 getters:

store.getters.doneTodos;

两个应用场景示例

场景一: 实现购物车功能

在购物车中,有很多的商品,每个商品都可以加入到购物车中,而且每个商品的数量都可以修改,我们使用Vuex来实现:

首先,定义状态:

const store= new Vuex.Store({
    state:{
        goods:[
          {id:1, name:'item1', price:100, qty:10},
          {id:2, name:'item2', price:200, qty:20},
          {id:3, name:'item3', price:300, qty:30},
          {id:4, name:'item4', price:400, qty:40},
        ]
    },
    mutations:{
        incrementQty(state, index){
            state.goods[index].qty++;
        },
        decrementQty(state, index){
            state.goods[index].qty--;
        },
        clearGoods(state){
            state.goods = [];
        }
    }
})

然后,在组件中,可以通过 computed 计算属性来获取 Vuex 中的状态或者通过 methods 方法来调用 mutations 中的函数,比如下面这个例子:

<template>
 <div>
    <table>
      <thead>
        <tr>
          <th>商品名称</th>
          <th>商品单价</th>
          <th>商品数量</th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(good, index) in goods" :key="good.id">
          <td>{{ good.name }}</td>
          <td>{{ good.price }}</td>
          <td>
            <button @click="incrementQty(index)">+</button>
            {{ good.qty }}
            <button @click="decrementQty(index)">-</button>
          </td>
        </tr>
      </tbody>
    </table>
    <button @click="clearGoods">清空购物车</button>
  </div>
</template>

<script>
export default {
  computed: {
    goods() {
      return this.$store.state.goods;
    }
  },
  methods: {
    incrementQty(index) {
        this.$store.commit('incrementQty', index);
    },
    decrementQty(index) {
        this.$store.commit('decrementQty', index);
    },
    clearGoods(){
        this.$store.commit('clearGoods');
    }
  }
}
</script>

场景二: 利用Vuex传递登录状态信息

在网站中,登录状态是需要全局共享的,如果使用全局变量或者 sessionStorage,虽然能够完成数据共享,但是不易管理。而Vuex则在这种情况下显得非常高效,我们可以通过 Vuex 传递登录状态信息。示例如下:

定义状态:

const store = new Vuex.Store({
  state: {
    isLoggedIn: false
  },
  mutations: {
    login (state) {
      state.isLoggedIn = true
    },
    logout (state) {
      state.isLoggedIn = false
    }
  }
})

使用状态:

我们可以在组件的生命周期中读取状态值,如果状态值为 true,则代表用户已经登录:

export default {
  mounted() {
    if(this.$store.state.isLoggedIn){
        // 用户已登录,执行相关操作
    }else{
        // 用户未登录,执行相关操作
    }
  }
}

同时,在登录和退出时,我们需要调用 mutations 改变状态,如下:

methods: {
  login() {
    // 登录操作
    this.$store.commit('login');
  },
  logout(){
    // 退出登录操作
      this.$store.commit('logout');
  }
}

总结

以上就是Vuex的基本使用方法和两个应用场景,其中包括状态、mutations、actions 以及 getters 的定义方式和使用方式。熟练使用Vuex能够大大简化组件间的通信,在管理大型应用的时候也非常有用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解Vuex的作用 - Python技术站

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

相关文章

  • vue.js入门教程之基础语法小结

    针对题目“vue.js入门教程之基础语法小结”的攻略,我将分别从以下几个方面来进行详细讲解。 一、前置知识 在进行Vue.js的学习之前,需要掌握一定的HTML/CSS/JavaScript基础知识。其中JavaScript是最为关键的一个部分,因为Vue.js本身就是一个JavaScript框架。同时,掌握ES6语法,能够在写Vue.js代码时更加便利。 …

    Vue 2023年5月28日
    00
  • Java超详细大文件分片上传代码

    对于Java超详细大文件分片上传的攻略,我们可以从以下几个步骤进行讲解: 1.了解分片上传的原理 分片上传是将一个大文件分割为多个小文件进行上传,这样能够减少单次上传的数据量,降低上传失败的概率,同时也能够保证上传的效率和速度。 2.准备分片上传所需的工具和编码环境 开发分片上传所需的工具主要有Java开发环境、Maven构建工具以及SpringBoot框架…

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

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

    Vue 2023年5月28日
    00
  • Vue Cli项目重构为Vite的方法步骤

    Vue Cli项目重构为Vite的方法步骤: 安装Vite 首先,需要通过npm或yarn来全局安装Vite。可以使用以下命令来安装: npm install -g vite 或 yarn global add vite 创建新的Vite项目 使用Vite创建新项目时,可以选择手动创建或使用预设模板。推荐使用预设模板来快速创建新项目。可用的预设模板包括Rea…

    Vue 2023年5月28日
    00
  • vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

    下面是详细讲解 vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component 的完整攻略。 1. 什么是 vue-cli3? Vue CLI 是一个官方发布的 Vue.js 项目脚手架,提供了标准化、插件化的 Vue 项目开发体验。vue-cli3 是 Vue CLI 的第三个版本,相较于前两个版本,vue-c…

    Vue 2023年5月28日
    00
  • Vue在自定义指令绑定的处理函数中传递参数

    自定义指令在Vue中是一个很实用的特性,可以用于很多场景,例如对表单数据的自动验证,在DOM元素渲染前做一些操作等。 在开发过程中,我们有时需要在自定义指令的绑定处理函数中传递一些参数,来实现更加灵活多样的功能。那么如何在Vue自定义指令中传递参数呢? 下面是两个实例说明: 实例1:传递固定的参数 如果我们要在自定义指令中传递一些固定的参数,例如一个字符串,…

    Vue 2023年5月28日
    00
  • Vue如何实现利用vuex永久储存数据

    Vue是一款前端框架,通过数据驱动方式来实现组件化开发,而Vuex则是Vue的一个状态管理工具,它提供了集中式存储管理应用的所有组件的数据,并保证状态改变是可预测的。在Vue中,我们可以利用Vuex实现永久储存数据。下面就具体介绍一下如何实现。 1. 安装Vuex 在使用Vuex之前,我们需要确保安装了Vuex。可以通过以下命令安装: npm install…

    Vue 2023年5月28日
    00
  • Vue中ref、reactive、toRef、toRefs、$refs的基本用法总结

    以下是Vue中ref、reactive、toRef、toRefs、$refs的完整攻略: 1. ref ref 可以将组件或DOM元素在父组件中进行标识。同时,也可以在父组件中使用 $refs 访问到子组件或DOM元素。使用ref的方式如下: <template> <div> <input type="text&quo…

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