详解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日

相关文章

  • Vue2 Dialog弹窗函数式调用实践示例

    下面我将详细讲解“Vue2 Dialog弹窗函数式调用实践示例”的完整攻略,该攻略具体包含以下内容: 添加依赖 在开始使用Vue2 Dialog之前,需要先添加相应的依赖包。可以使用npm或yarn命令进行安装: npm install vue2-dialog –save 或者 yarn add vue2-dialog 依赖安装完成后,我们需要在main.…

    Vue 2023年5月28日
    00
  • JavaScript观察者模式(publish/subscribe)原理与实现方法

    JavaScript观察者模式(publish/subscribe)原理与实现方法 观察者模式,也叫发布订阅模式,是一种对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。这种设计模式在前端开发中应用广泛,比如实现事件监听、多模块协同、组件间通信等。 原理 观察者模式包含如下角色: 主题(Subject):在其中定义一个添加、…

    Vue 2023年5月28日
    00
  • vue-cli项目使用mock数据的方法(借助express)

    以下是详细讲解“vue-cli项目使用mock数据的方法(借助express)”的完整攻略。 前置知识 在讲解具体的实现方法之前,需要先了解一些前置知识: vue-cli:Vue.js 的官方脚手架,可用于快速搭建 Vue.js 项目 mock.js:一个用于生成随机数据的库,可生成各种类型的数据 express.js:一个用于搭建 web 服务器的库,可用…

    Vue 2023年5月28日
    00
  • Vue核心概念Action的总结

    下面是Vue核心概念Action的总结的完整攻略。 什么是Action Action是Vuex服务于mutations的触发器,用于处理异步请求和复杂的逻辑。 Action的语法 在Vuex中,定义一个Action的语法如下: actions: { actionName (context, payload) { // 逻辑处理 } } 其中,actions是…

    Vue 2023年5月27日
    00
  • 使用Vue生成动态表单

    关于使用Vue生成动态表单的完整攻略,我们可以分为以下几个步骤: 步骤一:设计表单数据结构 首先,我们需要根据需求设计表单数据结构,包括表单元素类型、名称、value、placeholder、校验规则等信息。可以采用JSON格式来设计。 例如,我们要生成一个带有输入框、下拉框、单选框、多选框等元素的表单,可以按照如下格式来设计表单数据结构: formItem…

    Vue 2023年5月28日
    00
  • Vuex给state中的对象新添加属性遇到的问题及解决

    当我们给Vuex中的state中的对象添加新属性时,可能会遇到以下问题: 添加新属性后,该属性的初始值可能不会被监听到 在异步操作中添加属性会影响组件的响应性 解决这些问题的方案是使用Vue.set()或this.$set()方法。 Vue.set()和this.$set()都是Vue框架提供的全局方法,用来在响应式对象中设置值。下面,我们分别对Vue.se…

    Vue 2023年5月28日
    00
  • JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例

    下面我将为你讲解JS实现鼠标拖拽盒子移动及右键点击盒子消失效果的完整攻略。 1. 鼠标拖拽盒子移动实现 首先,在HTML代码中准备一个盒子元素,例如: <div id="box"></div> 在CSS中为该盒子设置样式,使其成为一个带边框、背景色的方块: #box { width: 100px; height: …

    Vue 2023年5月28日
    00
  • Vue 2源码解析Parse函数定义

    那么让我们开始讲解“Vue 2源码解析Parse函数定义”的完整攻略。 标题1:Vue 2源码解析Parse函数定义 标题2:什么是Parse函数 在Vue 2的源代码中,Parse函数是用于将字符串模板转换为AST的一个函数。 当我们在Vue应用程序中编写模板时,这些模板都会被转换为VNode,而VNode本质上是一个JavaScript对象,它们构成了V…

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