深入理解Vuex的作用

yizhihongxing

深入理解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-element-admin配置小结

    我会详细地讲解一下“vue-element-admin配置小结”的完整攻略。 1. 安装 vue-element-admin 是基于Vue.js2.0和Element-ui的后台管理系统的解决方案。要使用它,首先需要安装Node.js、npm或yarn等基本前端开发环境。 安装方式: # 使用npm $ npm install -g vue-cli $ np…

    Vue 2023年5月28日
    00
  • Vue组件之非单文件组件的使用详解

    下面我将为您详细讲解“Vue组件之非单文件组件的使用详解”的完整攻略。 什么是非单文件组件? 非单文件组件是指将组件的HTML、JS、CSS等代码都写在同一个文件中,并使用Vue.extend()方法将其构造成组件的一种方式。这种方式比较旧,但在一些老的Vue项目中仍有应用。目前Vue的官方文档已经不推荐使用这种方式。 非单文件组件的优缺点 优点 代码简单。…

    Vue 2023年5月28日
    00
  • vue实现前端列表多条件筛选

    下面是“vue实现前端列表多条件筛选”的完整攻略: 准备工作 首先需要引入Vue.js和element-ui组件库。除此之外,还需要一个数据列表和一个查询条件对象。 实现步骤 1. 查询条件的展示 使用element-ui组件库提供的Form组件渲染查询表单。每个查询条件使用FormItem包装,FormItem的label属性即为查询条件的名称,Prop属…

    Vue 2023年5月28日
    00
  • Vue关于组件化开发知识点详解

    下面是关于Vue的组件化开发的详细攻略。 1. 什么是组件化开发 组件化开发是一种将一个大型项目拆分成多个小的可重用组件的方法。每个组件都封装了自己的数据和方法,可在不同的页面和应用中被重复利用。 Vue.js 是一个专注于数据驱动的渐进式 JavaScript 框架,它通过其丰富的生命周期钩子函数和强大的响应式数据绑定机制,使得组件化开发得以高效实现。 2…

    Vue 2023年5月27日
    00
  • vue 函数调用加括号与不加括号的区别

    在 Vue 中,使用函数的时候,可以加括号也可以不加括号。但这两者之间是有一些区别的。下面是详细介绍“vue 函数调用加括号与不加括号的区别”的攻略。 加括号和不加括号的区别 加括号和不加括号的区别是在函数是否被调用的时候。如果加括号,函数就被立即调用了,如果不加括号,函数只是被赋值给一个变量,函数不会被立即执行。 举个例子,当我们有一个函数 foo: fu…

    Vue 2023年5月28日
    00
  • 详解Vue组件之作用域插槽

    当我们使用Vue构建前端应用时,尤其是当我们需要扩展组件功能时,Vue组件是不可避免的。Vue的组件化系统使用了所谓的作用域插槽(scope slots)以让组件的扩展更加灵活和强大。在本文中,我们将会讨论Vue的作用域插槽。 什么是作用域插槽? 作用域插槽是Vue组件中最强大的特性之一,它让父组件可以在子组件的视图中插入内容,并访问子组件的内部数据。尤其是…

    Vue 2023年5月27日
    00
  • vue中process.env的具体使用

    下面就是关于”Vue中process.env的具体使用”的完整攻略。 什么是process.env 在Node.js中,process.env是一个对象,包含当前shell的所有环境变量。 在Vue中的process.env是一种环境变量集合,包含了我们当前运行的Vue应用程序的所有环境变量。 此时,我们可以利用process.env对象来获取不同环境所需要…

    Vue 2023年5月29日
    00
  • vue 中简单使用mock的示例代码详解

    下面是“vue 中简单使用mock的示例代码详解”的完整攻略。 1、什么是Mock? Mock是一种基于规则自动生成数据模拟的工具,常用于代码调试以及前后端分离开发环境中数据接口的测试。Mock通过配置生成模拟数据,并可以实现前后端分离开发流程中前端提前获取数据模型,更好地完成页面的实现。 2、Mock.js介绍 Mock.js是一款前后端分离开发中常用的模…

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