详解Vuex的属性和作用

yizhihongxing

以下是“详解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日

相关文章

  • Vue中的生命周期介绍

    下面是关于Vue中的生命周期介绍的完整攻略及示例: 什么是Vue的生命周期 Vue生命周期是指Vue组件从创建到销毁的整个过程中,它所要经历的各个阶段。Vue生命周期分为8个不同的阶段,每个阶段都有相应的钩子函数,可以在相应的时候进行自定义操作。 Vue生命周期的8个钩子函数 下面是Vue生命周期的8个钩子函数,从创建到销毁依次为: beforeCreate…

    Vue 2023年5月29日
    00
  • Vue 搭建Vuex环境详解

    Vue 搭建Vuex环境详解 简介 Vuex是Vue.js的官方状态管理库,它可以更好的管理Vue.js应用中的数据流,包括数据的状态、存储和同步。社区中已经有很多文章介绍Vuex的基础使用,本文将详细讲解如何在Vue.js中搭建Vuex环境,并提供两个示例说明。 搭建Vuex环境 安装Vuex 在Vue.js项目中使用Vuex,需要先安装它。 npm in…

    Vue 2023年5月28日
    00
  • 关于vue.extend的使用及说明

    关于vue.extend的使用及说明,以下是完整的攻略: 了解vue.extend 在Vue.js中,vue.extend是一个非常有用的方法,它可以用来创建可复用的组件构造器。这个构造器可以用来创建多个Vue实例。 通常,如果我们要在一个组件的基础上创建另一个组件,我们会使用Vue.extend方法。 在Vue.js的源代码中,Vue.extend的实现很…

    Vue 2023年5月28日
    00
  • vue实现购物车的小练习

    Vue实现购物车的小练习是一个非常适合新手练手的小项目。 在这个练习中,我们将使用Vue.js框架来实现一个简单的购物车系统。下面是这个项目的完整攻略: 步骤1:准备项目 在开始之前,我们需要确保已经安装好了Vue.js库。我们可以通过以下方式进行安装: npm install vue 步骤2:创建购物车组件 购物车组件是整个项目的核心,它需要完成的功能有:…

    Vue 2023年5月29日
    00
  • Vue如何引用public中的js文件

    当需要在Vue项目中引入public文件夹中的js文件时,有以下两种方法: 方法一:使用HTML标签引入 可以在public/index.html中使用script标签引入js文件,在Vue组件中使用即可。例如,在public目录下有一个名为test.js的js文件,可在public/index.html中添加如下代码: <!DOCTYPE html&…

    Vue 2023年5月28日
    00
  • vue项目网页自适应等比例放大缩小实例代码

    下面是关于 vue 项目网页自适应等比例放大缩小实例代码的详细攻略。 1. CSS3实现 实现网页自适应等比例放大缩小的方式之一是利用 CSS3 的 transform 属性来实现。具体实现步骤如下: 在 head 标签中添加 viewport meta 标签,以适配不同设备。 <head> <meta name="viewpor…

    Vue 2023年5月28日
    00
  • Vue导入excel文件的两种方式(form表单和el-upload)

    如果要在Vue中实现导入Excel文件的功能,通常有两种方式:通过form表单提交和使用el-upload组件。下面对这两种方式进行详细介绍。 使用form表单提交 使用form表单提交的方式相对简单,需要在页面中添加一个input元素,并且指定type为“file”。在用户进行选择文件上传操作时,会触发input元素的change事件回调函数,然后在回调函…

    Vue 2023年5月28日
    00
  • Vue3基于countUp.js实现数字滚动的插件

    Vue3基于countUp.js实现数字滚动的插件就是一个可以在Vue3中方便地实现数字滚动效果的插件。下面将介绍实现该插件的完整攻略: 确认需求和安装countUp.js 首先需要明确需求,确认需要实现数字滚动的具体元素和动画效果等。然后需要安装countUp.js插件,在Vue3项目中引入countUp.js的CDN链接或安装countUp.js的NPM…

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