使用Vuex进行状态管理

news2024/12/23 13:36:52

在Vue.js应用程序中,状态管理是一个重要的主题。当应用程序变得复杂,组件之间的状态共享和通信变得困难,这时候使用Vuex就会变得十分有用。Vuex是一个专门为Vue.js设计的状态管理库,它提供了一个集中式的状态管理方案,使得状态的修改和访问更加直观和可维护。

1.什么是Vuex?

Vuex是一个专门为Vue.js应用程序开发的状态管理库。它借鉴了Flux和Redux的概念,采用了集中式的状态管理架构。Vuex的核心概念包括状态(State)、Mutation、Action和Getter。

  • 状态(State):应用程序中的数据源,通常通过Vuex的state对象来表示。我们可以在组件中直接访问和使用状态,而不需要手动进行组件之间的传递。

  • Mutation:用于修改状态的方法,类似于事件。每个Mutation都有一个字符串类型的事件类型和一个回调函数,在回调函数中进行状态的修改。Mutations应该是同步的操作。

  • Action:用于处理异步操作和复杂的业务逻辑。Action提交Mutations来修改状态。它可以包含任意异步操作,如HTTP请求、定时器等。Actions是异步的操作。

  • Getter:类似于组件的计算属性,用于从状态中派生出新的数据。Getter的返回值会根据它的依赖被缓存起来,只有当依赖发生改变时才会重新计算。

 

2.如何使用Vuex? 

使用Vuex进行状态管理需要以下几个步骤

1. 安装和配置Vuex

首先,在你的Vue.js项目中安装Vuex。可以通过npm或yarn来进行安装

npm install vuex  //默认安装最新版本

npm install vuex@3.0.0  //指定版本

安装完成后,在你的主应用程序文件中导入Vuex,并使用Vue.use()来启用它

//创建store文件夹,新建一个index.js文件作为主文件,以便后续进行vuex模块区分

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

然后,创建一个新的Vuex实例,并导出它供应用程序使用

//store.js文件

export default new Vuex.Store({
  // 状态、Mutations、Actions和Getters在这里定义
})

与vue-router类似,将Store实例在mian.js中挂载.

 

2. 定义状态(State)

在Vuex实例中,你可以定义应用程序的状态。状态可以是任何JavaScript对象,包含应用程序中需要共享的数据

export default new Vuex.Store({
  state: {
    count: 0,
    todos: []
  }
})

我们也可以进行模块化,状态和数据复杂的时候,方便管理

 在tab.js中,注意在Vuex主模块中引入文件

 获取state中的数据

 computed: {
    count() {
      return this.$store.state.count
    },
    todos() {
      return this.$store.state.todos
    }

如果是采用模块化的

 computed: {
    count() {
      return this.$store.state.tab.count
    },
    todos() {
      return this.$store.state.tab.todos
    }

 

mapState 辅助函数

当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。我们就要使用到mapState辅助函数

 computed: {
    ...mapState(['count', 'todos'])
  }

我们首先从vuex中导入了mapState辅助函数。然后,在computed选项中,使用展开运算符(...)和mapState函数来将counttodos映射为组件的计算属性。

这样,我们可以直接在模板中使用counttodos,而不需要使用this.$store.state.countthis.$store.state.todos来获取状态。

 computed: {
    ...mapState('tab', ['count']),
    ...mapState('tab', ['todos'])
  }

注意,在使用模块化的状态时,我们需要在mapState函数的第一个参数中指定对应的模块名称。

例如,...mapState("tab", ["count"])表示将counter模块中的count状态映射为count计算属性。

3. 定义Mutations

定义Mutations来修改状态。每个Mutation都有一个字符串类型的事件类型和一个回调函数,在回调函数中进行状态的修改

export default new Vuex.Store({
state: {
    count: 0,
    todos: []
},
mutations: {
    increment(state) {
        state.count++
   },
    addTodo(state, todo) {
        state.todos.push(todo)
   }
}
})

 

4. 调用Mutations

在组件中,你可以使用`this.$store.commit()`方法来调用Mutations并修改状态

 methods: {
    increment() {
      this.$store.commit('increment')
    },
    addTodo() {
      this.$store.commit('addTodo', { id: Date.now(), text: this.newTodoText })
      this.newTodoText = ''
    }
  }

模块化的方法

 methods: {
    increment() {
      this.$store.commit('tab/increment')
    },
    addTodo() {
      this.$store.commit('tab/addTodo', { id: Date.now(), text: this.newTodoText })
      this.newTodoText = ''
    }
  }

 mapMutations辅助函数

 methods: {
    ...mapMutations(['increment']),

    add(){
        this.increment(参数)
    }
  }

methods选项中,使用mapMutations函数将increment Mutations映射为组件的方法。这样,我们可以直接在组件中调用increment方法,而无需使用this.$store.commit("increment")来提交Mutations。

如果你想给映射的Mutations方法起一个不同于Mutations名称的方法名,可以使用对象形式的映射

methods: {
    ...mapMutations({
      increase: 'increment'
    }),
    add(){
      this.increase(参数)
    }
  }

模块化方法

methods: {
    ...mapMutations('tab', ['increment'])
  }

 注意使用辅助函数需要在组件引用

 

5. 定义Actions

Actions用于处理异步操作和复杂的业务逻辑。它提交Mutations来修改状态。在Actions中可以包含任意异步操作,如HTTP请求、定时器等

export default new Vuex.Store({
  state: {
    count: 0,
    todos: []
  },
  mutations: {
    increment(state) {
      state.count++
    },
    addTodo(state, todo) {
      state.todos.push(todo)
    }
  },
  actions: {
    incrementAsync(context) {
      setTimeout(() => {
        context.commit('increment')
      }, 1000)
    }
  }
})

 

6. 调用Actions

在组件中,你可以使用this.$store.dispatch()方法来调用Actions

this.$store.dispatch('incrementAsync')

 

7. 定义Getters

Getters用于从状态中派生出新的数据,类似于组件的计算属性。Getter的返回值会根据它的依赖被缓存起来,只有当依赖发生改变时才会重新计算

export default new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: 'Buy groceries', completed: false },
      { id: 2, text: 'Do laundry', completed: true }
    ]
  },
  getters: {
    completedTodos(state) {
      return state.todos.filter(todo => todo.completed)
    },
    incompleteTodos(state) {
      return state.todos.filter(todo => !todo.completed)
    }
  }
})

在组件中,你可以使用this.$store.getters来访问Getter的值

computed: {
  completedTodos() {
    return this.$store.getters.completedTodos
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Logisim 头歌 偶校验编码设计图解及代码(计算机组成原理)

努力是为了不平庸~ 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 急的同学请直接点击目录跳到下方解答处!! 目录 图解: 代码题解(免费): 实…

PyTorch-Sequential

Cifar-10用的模型结构: 第一次卷积 (3,32,32) to (32,32,32) 卷积核(55),我们需要进行一下计算,看看padding和stride是多少: 未引入Sequential前: import torch from torch import nn from torch.nn impo…

如何用chatGPT赚钱?

赚钱思路 1)初级-账号 对于新事物的出现,很多人对此都是抱着一个看热闹的态度,大家对于这个东西的整体认知水平是很低的! 所以这个时候的思路就是快速去抢占市场,去各个平台发一些和ChatGPT相关的视频和文章去抢占市…

速递:惠州学院生科院副院长谢海伟一行莅临易基因科技参观交流 | 校企合作

2023年05月26日上午,惠州学院生命科学学院副院长谢海伟教授、陈兆贵教授、陈勇智博士、龚浩博士及生科院本科毕业生陈佳良一行5人莅临深圳市易基因科技有限公司参观交流,并举行“惠州学院实践教学基地“挂牌仪式。易基因总经理王君文、副总经理丁振东等公…

vue项目中使用depcheck检查缺失的依赖项目

使用depcheck检查缺失的项目依赖 由来:今天在做地铁的时候,刷短视频发现一个非常好用的东西,分享一下 它可以帮助我们找出问题,在 package.json 中,每个依赖包如何被使用、哪些依赖包没有用处、哪些依赖包缺失。它是解…

EMC测试中放大器的线性度验证

在进行EMC抗扰度测试时,必须在所有适用的测试频率下检查所用射频功率放大器的线性度。检查方法如下: 确定产生测试电平所需的功率,包括调制。例如: 测试电平:10v /m 调制:80% AM, 1 kHz 所需场强包括调制:18 V/m 辐射抗干扰校准配置示例 在特…

【LED子系统】九、数据结构详解(番外篇)

个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录…

AI大爆炸 | ChatGPT引爆AI热潮,大佬怎么看?

ChatGPT在AI领域点起的大火,从去年烧到了今年。以ChatGPT为代表的AIGC(人工智能生成内容)在全球风靡,多个代表性AI大模型纷纷涌现,不少业内人士高呼以人机智能融合为主要特征的“AI 2.0时代”已经来临。      有人为人工智能引领未来的广…

jQuery-表中数据的添加与删除

<!DOCTYPE HTML> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8"> <title>表中数据的添加与删除</title> <link rel"stylesheet" type"text/css&quo…

vue插槽使用总结

什么是插槽解决什么问题插槽的分类默认插槽具名插槽作用域插槽 什么是插槽 插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的标签。…

Arcgis小技巧【13】——数据统计(Statistics)相关工具汇总

在Arcgis中可以通过属性表中字段的【统计】功能或使用统计相关的工具对属性表进行数据统计。 在Arcgis工具箱中有一组【统计分析】工具集&#xff0c;不仅包含对属性数据执行标准统计分析&#xff08;例如平均值、最小值、最大值和标准差&#xff09;的工具&#xff0c;也包含…

理解时序数据库的时间线

在当今数据爆炸的时代&#xff0c;时序数据已经成为企业和组织中不可或缺的一部分。它们包括了从传感器、监控设备、日志记录系统和金融交易等多种来源的大量数据&#xff0c;这些数据按照时间顺序排列&#xff0c;记录了各种事件和活动的发生和变化。时序数据的分析和处理对于…

通过python封装1688图片搜索商品数据接口,拍立淘API接口

1688图片搜索API封装接口是一个可以帮助用户快速使用1688图片搜索API的接口封装库。该接口封装库可以帮助用户快速引入1688图片搜索API&#xff0c;并提供各种参数配置和封装的API调用方法&#xff0c;以方便用户快速实现自己的图片搜索需求。 该接口封装库将1688图片搜索API的…

Redis Hash(散列表)实现原理看这篇就够了

1. 是什么 Redis Hash&#xff08;散列表&#xff09;是一种 field-value pairs&#xff08;键值对&#xff09;集合类型&#xff0c;类似于 Python 中的字典、Java 中的 HashMap。一个 field 对应一个 value&#xff0c;你可以通过 field 在 O(1) 时间复杂度查 field 找关联的…

Qt+QtWebApp开发笔记(四):http服务器使用Session和Cookie实现用户密码登录和注销功能

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/130921152 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

信号量对象没有所有者

相较于互斥对象(Mutex)和临界区对象(Critical Section) &#xff0c;信号量没有所有者&#xff0c;它们只有计数。 ReleaseSemaphore 函数将会以指定的数量增加对应信号量对象的计数。 (增加计数这个动作&#xff0c;可能会释放正在等待的线程&#xff09;但是释放信号量的线程…

metaIPC2.0 SDK实现webRTC对讲IPC

概述 metaRTC新推出P2P版metaIPC2.0 sdk版本&#xff0c;基于mqtt通信&#xff0c;同时支持windows/linux/android操作系统&#xff0c;支持国内如海思/君正/瑞芯微/MSTAR等主流芯片。 metaIPC2.0支持linux/android/windows IPC&#xff0c;客户端支持浏览器/APP/windows和li…

【JavaSE】Java基础语法(二十七):Set集合和 TreeSet

文章目录 1. Set集合1.1Set集合概述和特点【应用】1.2Set集合的使用【应用】 2.TreeSet集合2.1TreeSet集合概述和特点【应用】2.2TreeSet集合基本使用【应用】2.3自然排序Comparable的使用【应用】2.4比较器排序Comparator的使用【应用】2.4两种比较方式总结 1. Set集合 1.1Se…

数据库必备知识:脏读和幻读的定义及应对策略

随着数据库应用的广泛使用&#xff0c;数据库并发性和一致性的问题成为了引起重视的问题之一。其中&#xff0c;脏读&#xff08;Dirty Read&#xff09;和幻读&#xff08;Phantom Read&#xff09;是常见的并发访问问题&#xff0c;本文将对脏读、幻读进行详细介绍&#xff0…

炸裂!GPT-4 开始自主进化,打造一个虚拟世界!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 此前 GitHub 曾诞生过一个名为 Auto-GPT 的开源项目&#xff0c;让 AI 能够根据人类给出的目的&#xff0c;自动设定任务的优先级&#xff0c;尝试自行优化代码、自动改 Bug 等操作。不得不…