详解Vuex的属性和作用

以下是“详解Vuex的属性和作用”的完整攻略。

什么是Vuex

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

Vuex的核心概念

Vuex中包括了5个核心概念:

state

它表示保存整个应用状态的对象。初始状态可以在这里定义,并且它可以包含很多的属性。

getter

Vuex允许在store中定义“getter”(可以认为是store的计算属性)。Getter接受state作为其第一个参数,并且我们可以基于它来计算出一个新的状态。

mutation

改变state的唯一方法就是提交mutation。mutation就像事件,每个mutation都有一个字符串类型的事件类型和一个回调函数。这个回调函数就是我们实际进行状态更改的地方。

action

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。

module

用于将单一的store拆分为多个模块。

Vuex的属性

在Vuex中我们可以通过一些属性来访问store中的状态:

Getters

我们可以通过 getters 进行一些复杂的计算,访问 state 中的值。

const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: '任务1', done: true },
      { id: 2, text: '任务2', done: false },
      { id: 3, text: '任务3', done: true }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    },
    doneTodoCount: (state, getters) => {
      return getters.doneTodos.length
    },
    getTodoById: (state) => (id) => {
      return state.todos.find(todo => todo.id === id)
    }
  }
})
  • 第一个getter函数 doneTodos 返回所有已完成任务的 todo。
  • 第二个getter函数doneTodoCount 返回已完成任务数量。
  • 第三个getter函数getTodoById 返回匹配todo的id

Mutations

我们使用mutation来变更状态,一般情况下,我们会通过一个类型和回调函数来注册一个mutation:

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

当我们需要改变state里面的数据时,我们可以通过commit。举个例子:

store.commit('increment')

Actions

actions 和 mutations 类似,它们都是用来改变状态的,但是actions和mutations之间的区别是:

  • 使用mutations更改state是同步的,而actions更改state是异步的。
  • 提交mutations可以改变store中的状态,提交actions可以包含异步操作,提交mutations之前经常使用actions来处理数据。

actions是可以包含任意异步操作的,可以直接访问到全局的state,比如调用api接口:

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

store.dispatch('asyncIncrement')

代码中定义了一个异步的action方法asyncIncrement。在异步操作成功后,通过commit调用同步的mutation来更新state里的数据。

Modules

当store对象变得非常大时,我们需要将其拆分为较小和更具体的模块 - 每个模块都有自己的 state、mutations、actions 和 getters 等。

const moduleA = {
  state: {},
  mutations: {},
  actions: {},
  getters: {}
}

const moduleB = {
  state: {},
  mutations: {},
  actions: {},
  getters: {}
}

const store = new Vuex.Store({
  modules: {
    moduleA,
    moduleB
  }
})

例子

以下是一个简单的示例,演示如何在Vuex中应用它的属性和方法。这个例子基于一个简单的todo列表。

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

Vue.use(Vuex)

const state = {
  todos: [
    { id: 1, text: '任务1', done: true },
    { id: 2, text: '任务2', done: false },
    { id: 3, text: '任务3', done: true }
  ]
}

const getters = {
  doneTodos: state => {
    return state.todos.filter(todo => todo.done)
  },
  doneTodoCount: (state, getters) => {
    return getters.doneTodos.length
  }
}

const mutations = {
  addTodo: (state, todo) => {
    state.todos.push(todo)
  },
  toggleTodo: (state, todo) => {
    todo.done = !todo.done
  }
}

const actions = {
  addTodo: ({ commit }, todo) => {
    commit('addTodo', todo)
  },
  toggleTodo: ({ commit }, todo) => {
    commit('toggleTodo', todo)
  }
}

export default new Vuex.Store({
  state,
  getters,
  mutations,
  actions
})

然后,在我们的Vue组件中使用store:

<template>
  <div>
    <h1>Todo List</h1>
    <ul>
      <li v-for="todo in todos" :key="todo.id">
        <input type="checkbox" :checked="todo.done" @click="toggleTodo(todo)">
        {{ todo.text }}
      </li>
    </ul>
    <form v-on:submit.prevent="addTodo">
      <label for="task">添加任务</label>
      <input type="text" id="task" v-model="newTodoText">
      <button type="submit">添加</button>
    </form>
    <p>当前已完成任务 {{ doneTodoCount }}/{{ todos.length }}</p>
  </div>
</template>

<script>
import { mapGetters, mapActions } from 'vuex'
export default {
  data() {
    return {
      newTodoText: ''
    }
  },
  computed: {
    ...mapGetters([
      'doneTodos',
      'doneTodoCount'
    ]),
    todos() {
      return this.$store.state.todos
    }
  },
  methods: {
    ...mapActions([
      'addTodo',
      'toggleTodo'
    ]),
  }
}
</script>

在此Vue组件中,我们使用了mapGettersmapActions函数,来将store中的getters和actions映射到Vue组件中。此外,我们还从store里直接获取state中的todos数据。

另一个例子,假设在前面的例子中,我们需要根据数据从后台调用用户信息。代码如下:

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

Vue.use(Vuex)

const state = {
  todos: [
    { id: 1, text: '任务1', done: true, userId: 1 },
    { id: 2, text: '任务2', done: false, userId: 1 },
    { id: 3, text: '任务3', done: true, userId: 2 }
  ],
  users: {
    1: { id: 1, name: 'Lucy' },
    2: { id: 2, name: 'Lily' }
  }
}

const getters = {
  todoList: state => {
    return state.todos.map((todo) => {
      todo.user = state.users[todo.userId]
      return todo
    })
  }
}

const store = new Vuex.Store({
  state,
  getters
})

export default store

在这个例子中,我们有一个新的“users”状态,它包含一个id到user对象的映射。getters传递给我们的“todoList”映射包含了“user”对象。我们可以简单地在模板中访问这个属性。

<template>
  <div>
    <ul>
      <li v-for="todo in todoList" :key="todo.id">
        <input type="checkbox" :checked="todo.done" @change="toggleDone(todo)">
        {{ todo.text }}
        <span>{{ todo.user.name }}</span>
      </li>
    </ul>
  </div>
</template>

<script>
import { mapGetters, mapActions } from 'vuex'
export default{
  computed: {
    ...mapGetters([
      'todoList'
    ])
  },
  methods: {
    ...mapActions([
      'toggleDone'
    ]),
  }
}
</script>

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

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

相关文章

  • ant design vue嵌套表格及表格内部编辑的用法说明

    Ant Design Vue 是一个基于 Vue.js 的 UI 组件库,是蚂蚁金服开源的一款 UI 组件库,主要目的是为开发人员提供高质量的企业级 UI 组件,支持 react、vue 以及 angular 三个框架。Ant Design Vue 组件库包含众多组件,如按钮、输入框、表格、弹窗、菜单等,最为优秀的一个组件就是表格。在表格中,Ant Desi…

    Vue 2023年5月28日
    00
  • vue实现秒杀倒计时组件

    关于如何使用vue实现秒杀倒计时组件,以下是详细讲解: 1. 确认需求 在开始开发之前,我们需要先明确需求,确定倒计时组件的功能和样式要求。例如,我们的秒杀倒计时需要支持以下功能: 显示倒计时的小时、分钟和秒钟; 支持自定义倒计时的截止时间; 支持在倒计时结束时触发自定义回调事件; 样式需求:支持自定义组件的大小、字体样式和颜色等属性。 2. 开始开发 2.…

    Vue 2023年5月29日
    00
  • Vue3使用时应避免的10个错误总结

    下面就是关于“Vue3使用时应避免的10个错误总结”的完整攻略。 1. 避免在setup函数之外使用响应式数据 setup函数之外的代码主要是为了定义变量或者引用组件。我们还需要明确的一点就是,setup函数是在组件实例被创建之前被调用的,所以setup函数外部的代码是在它之前执行的。如果你使用了响应式数据去创建变量或者引用组件,就会出现bug。 示例: c…

    Vue 2023年5月29日
    00
  • 解决antd日期选择组件,添加value就无法点击下一年和下一月问题

    对于 Ant Design 的日期选择组件 DatePicker,如果我们在使用时添加了 value 属性,会发现无法点击下一年和下一月。这是因为添加了 value 属性后,Ant Design 会把组件的选中日期固定为这个值,并禁用掉下一年和下一月的按钮。解决这个问题的方法非常简单,在代码中添加一个叫做 allowClear 的属性,并将该属性的值设为 t…

    Vue 2023年5月29日
    00
  • 在vue项目实现一个ctrl+f的搜索功能

    下面是实现“在Vue项目实现一个Ctrl+F的搜索功能”的攻略。 一、需求分析 在Vue项目中实现Ctrl+F搜索功能的主要目的是让用户快速找到需要查看的内容,提高用户体验。在实现过程中需要考虑以下几个因素: 功能实现方式:Ctrl+F搜索功能的实现方式有多种,例如使用原生JavaScript实现、使用Vue指令或组件实现等,我们需要选择合适自己项目的方式。…

    Vue 2023年5月28日
    00
  • vue项目中轮询状态更改方式(钩子函数)

    在 Vue 项目中,轮询状态更改是一种经常使用的操作,它可以帮助我们动态地更新组件中的数据。Vue 提供了一系列钩子函数,我们可以使用这些钩子函数来实现轮询操作。 以下是实现轮询状态更改的完整攻略: 创建一个定时器 我们可以使用 setInterval() 方法来创建一个定时器,定期执行某个函数。在 Vue 中,我们可以在 mounted() 钩子函数中创建…

    Vue 2023年5月28日
    00
  • vuex在vite&vue3中的简单使用说明

    下面是“vuex在vite&vue3中的简单使用说明”的完整攻略: Vue3项目中使用Vuex 在Vue3项目中使用Vuex需要先安装vuex: npm install vuex –save 然后在src目录下新建store目录,在store目录下新建index.js文件: import { createStore } from ‘vuex’ co…

    Vue 2023年5月28日
    00
  • JavaScript进阶(四)原型与原型链用法实例分析

    关于“JavaScript进阶(四)原型与原型链用法实例分析”的完整攻略,以下是详细讲解: 什么是原型 JavaScript 中的每个对象都有一个指向它的原型。原型是一个包含属性和方法的对象,它可以被用来共享那些在多个实例之间共享内容的属性和方法。当我们在一个实例中访问一个属性或者一个方法时,它会先在实例本身中查找该属性或方法,如果没有找到,就会去实例的原型…

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