Vue详细讲解Vuex状态管理的实现

yizhihongxing

Vue详细讲解Vuex状态管理的实现

什么是Vuex

Vuex是Vue.js的官方状态管理插件,它将组件之间共享的状态抽取出来,以一个全局单例模式管理,实现了在共享状态时一些问题的规避,使代码更容易理解和维护。

Vuex的状态管理机制

Vuex的状态管理机制可以从以下三个方面来解释:

State

状态是存储在Vuex store上的单一状态树,相当于Vue模板上的data。每一个Vuex应用的中央唯一数据存储中都有一个store实例,包含了所有的状态。可以通过store.state来访问。

// store.js
import Vuex from 'vuex'
import Vue from 'vue'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  }
})

上面的代码实现了一个简单的store,包含了一个数值型state变量count,初始值为0。

可以在组件中通过this.$store.state.count来访问该状态。

Getter

Getter就是store的计算属性,相当于Vue模板上的computed。Vuex的store中,Getter相当于从store中派生方法的概念,在通过computed派生出新的属性时,Getter也可以根据需要派生出新的状态。

Getter接受state作为其第一个参数,可以定义计算属性,Getter会缓存计算结果并告诉你何时重新计算(当依赖的状态发生变化时)。

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

在上面的代码中,我们新定义了一个Getter,返回已完成的列表。可以在组件中通过this.$store.getters.doneTodos来访问。这样,无论todos状态如何改变,只有当done属性变化时,该Getter才会被重新计算。

Mutation

Mutation是用于修改状态的唯一方法,相当于Vue模板上的methods。Mutation改变store中的状态的唯一方法是提交mutation,mutation就像事件一样来描述发生了什么,每个mutation都有一个字符串类型的操作命名,一个回调函数和一个payload,payload是通常会被作为回调函数的入参传进来。

Mutation必须是同步的,一旦提交了mutation,我们就可以确保state已经同步完成了更新。

// store.js
export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment: (state, payload) => {
      state.count += payload.amount
    }
  },
  actions: {
    increment: ({commit}, payload) => {
      commit('increment', payload)
    }
  }
})

在上面的代码中,我们新定义了一个mutation,名为increment,可接受一些额外的参数amount,以更新count变量。

我们可以在组件中派发一个mutation,来实现该操作(假设没有开启严格模式):

// MyComponent.vue
methods: {
    increment () {
      this.$store.commit('increment', { amount: 10 })
    }
}

Action

Action是异步操作,而且可以包含任意异步操作。Action提供给你一个使用异步请求更新状态的方法,并且可以保证该过程是同步的。

Action利用mutation中commit的概念。Action通过store.dispatch方法异步的提交mutation,最终改变state状态。通常Action将服务端请求得到的数据提交给Mutation,成功处理一些业务逻辑后通过Mutation更新State中的状态。

// store.js
export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment: (state, payload) => {
      state.count += payload.amount
    }
  },
  actions: {
    incrementAsync ({commit}, payload) {
      setTimeout(() => {
        commit('increment', payload)
      }, 1000)
    }
  }
})

在上面的代码中,我们新定义了一个Action,名为incrementAsync,受到payload的委托,在1秒钟后再提交该mutation。

我们可以在组件中派发一个Action,来实现该操作(假设没有开启严格模式):

// MyComponent.vue
methods: {
    incrementAsync () {
      this.$store.dispatch('incrementAsync', { amount: 10 })
    }
}

Vuex的核心概念

Store

Store是一个容器,它包含着应用中的所有状态。一个Vuex的Store是由唯一的一个store实例来管理的。

State

State就是存储在Store中的状态数据,State机制遵循源流驱动所提出的思想——即State可以作为源流数据,而对该数据的更新只能通过Action来派发Mutation,进而同步改变State的状态。

Getter

Getter是对State的派生数据,类似于Vue模板中的computed计算属性。Getter常作为模板中computed属性的依赖源。

Mutation

Mutation是同步的改变State中数据的唯一方法。在Mutation中建议只处理简单的动作,这种处理方式可以更容易地跟踪代码的变化。Mutation通过一系列类型名来更新State中的数据。

Action

Action允许更改State的异步数据或更复杂的逻辑,使Action中包含的异步操作可以访问到State并且可以派发Mutation。同时Action的Promise也可以在组件内使用。

Module

Module允许我们将一些较大状态的数据重构为一些具有独立功能的小模块,每个Module具有自己的State、Getter、Mutation和Action。这样,即使应用的状态不断变化或者持续增加,整个代码库也能保持整洁和可维护性。

Vuex实现示例

在Vue项目中使用Vuex非常方便,以下是其中两个示例。

示例一:计数器

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment: state => state.count++,
    decrement: state => state.count--
  },
  actions: {
    increment: ({ commit }) => commit('increment'),
    decrement: ({ commit }) => commit('decrement')
  }
})
<!-- Counter.vue -->
<template>
  <div>
    <h1>Count: {{$store.state.count}}</h1>
    <button @click="$store.dispatch('increment')">+1</button>
    <button @click="$store.dispatch('decrement')">-1</button>
  </div>
</template>

<script>
export default {
  name: 'Counter'
}
</script>

示例二:待办事项

// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: 'todo1', done: true },
      { id: 2, text: 'todo2', done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  },
  mutations: {
    toggle: (state, id) => {
      const todo = state.todos.find(todo => todo.id === id)
      todo.done = !todo.done
    },
    add: (state, todo) => {
      state.todos.push(todo)
    }
  },
  actions: {
    toggle: ({commit}, id) => {
      commit('toggle', id)
    },
    add: ({commit}, text) => {
      const todo = {
        id: Date.now(),
        text,
        done: false
      }
      commit('add', todo)
    }
  }
})
<!-- TodoList.vue -->
<template>
  <div>
    <ul>
      <li v-for="todo in $store.state.todos" :key="todo.id">
        <span :class="{ done: todo.done }">{{ todo.text }}</span>
        <button @click="$store.dispatch('toggle', todo.id)">Toggle</button>
      </li>
    </ul>
    <input type="text" v-model="text">
    <button @click="$store.dispatch('add', text)">Add</button>
  </div>
</template>

<script>
export default {
  name: 'TodoList',
  data() {
    return {
      text: ''
    }
  },
  mounted() {
    console.log(this.$store.getters.doneTodos)
  }
}
</script>

<style>
  .done { text-decoration: line-through; }
</style>

结论

Vuex是Vue.js的状态管理插件,可以有效地帮助我们管理应用程序的状态,在使用中体现了源流驱动的思想、模块化的技术手段、设计模式上的优化,其实现机制基于State、Getter、Mutation和Action四个核心概念,可以帮助前端工程师更加规范化、系统化地管理自己的前端代码,提高工作效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue详细讲解Vuex状态管理的实现 - Python技术站

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

相关文章

  • JS实现的幻灯片切换显示效果

    当下,网站的幻灯片切换效果越来越流行,JS作为前端语言自然是实现幻灯片切换的最佳选择。下面我将详细讲解JS实现的幻灯片切换显示效果的攻略,包含如何引入JS库,如何使用JS实现切换效果等重要内容。 引入JS库 要实现幻灯片切换效果,首先要引入JS库。目前比较流行的JS库有jQuery和Zepto.js,我们可以根据项目的实际需求选择不同的库进行引入。比如我们使…

    Vue 2023年5月28日
    00
  • vue如何实现跨页面传递与接收数组并赋值

    跨页面传递与接收数组并赋值,可以通过vue-router的params来实现。 步骤如下: 路由设置 在路由设置中,可以通过props将参数传递给下一个页面。在这个例子中,我们使用props将数组传递给下一个页面。假定我们的路由为: { path: ‘/page2/:id’, name: ‘page2’, component: Page2, props: t…

    Vue 2023年5月28日
    00
  • Vue实现动态响应数据变化

    实现动态响应数据变化是 Vue.js 的核心特性之一,它使得数据变化时能够自动更新视图。以下是 Vue 实现动态响应数据变化的详细攻略。 1. Vue 实例的响应式数据 在 Vue 实例中声明的每个属性都是响应式的,也就是说,当数据发生变化时,视图会自动更新。例如,在以下 Vue 代码中,当 message 数据发生变化时,页面中绑定的 {{ message…

    Vue 2023年5月28日
    00
  • 手把手带你搭建一个node cli的方法示例

    下面是手把手带你搭建一个node cli的方法示例的完整攻略: 前置知识 在开始搭建之前,我们需要掌握一些基础知识: Node.js的基本使用 npm包管理器的使用 shell命令行的基本使用 如果你还不会这些基础知识,建议先学习一下。 步骤 1. 初始化项目 首先,我们需要创建一个新的目录,进入目录后使用以下命令进行项目初始化: npm init -y 这…

    Vue 2023年5月29日
    00
  • Vue中计算属性和监听属性及数据的响应式更新和依赖收集基本原理讲解

    下面是“Vue中计算属性和监听属性及数据的响应式更新和依赖收集基本原理讲解”的完整攻略。 计算属性 定义 计算属性是Vue实例中的属性,它可以根据其他数据和方法的值计算出一个新值。计算属性指向了Vue实例的数据,当数据改变时,计算属性也会自动更新。 用法 在Vue实例中,我们可以通过在computed选项中定义一个计算属性: new Vue({ data: …

    Vue 2023年5月28日
    00
  • vue 如何添加全局函数或全局变量以及单页面的title设置总结

    根据您的需求,我会详细讲解“Vue 如何添加全局函数或全局变量以及单页面的 title 设置总结”的完整攻略,包含两个示例用于进一步说明。 一、Vue 如何添加全局函数或全局变量 在 Vue 中,我们可以方便地在全局使用自定义函数和变量,这样可以简化业务逻辑,提高开发效率。以下是实现此功能的方法: 1.1 添加全局函数 在 Vue 中添加全局函数的方式是通过…

    Vue 2023年5月28日
    00
  • vue使用Vue.extend方法仿写个loading加载中效果实例

    下面是详细讲解“vue使用Vue.extend方法仿写个loading加载中效果实例”的完整攻略: 1. Vue.extend方法简介 Vue.extend是Vue.js中一个全局API,它接受一个参数对象并返回一个新的组件构造函数,这个构造函数可以被像任何其它组件一样被实例化。 其主要作用是定义可复用的组件模板,这些模板可以在后面使用到。 2. 实现过程 …

    Vue 2023年5月29日
    00
  • vue实现移动端拖动排序

    下面我将为您详细讲解“vue实现移动端拖动排序”的完整攻略。 1. 安装vue相关依赖 首先需要安装vue相关依赖,包括vue本身以及vue移动端手势库vue-touch。 npm install vue –save npm install vue-touch@next –save 2. 引入vue相关依赖 在你的vue项目入口文件中引入vue及vue-…

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