vue重修之Vuex【上部】

文章目录

  • 版权声明
  • Vuex 概述
    • Vuex 的主要概念和组件
  • vuex的使用
  • 状态 (state)
    • Vuex特点
  • 访问vuex中数据
    • $store访问
    • mapState辅助函数访问
  • 开启严格模式及Vuex的单项数据流
  • 突变(mutations)
    • mutations初识
    • 带参 mutations
    • 辅助函数 mapMutations
  • 动作(Actions)
    • 辅助函数 mapActions
  • vuex mutations VS actions
  • 获取器(Getters)
  • 总结

版权声明

  • 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明,所有版权属于黑马程序员或相关权利人所有。本博客的目的仅为个人学习和交流之用,并非商业用途。
  • 我在整理学习笔记的过程中尽力确保准确性,但无法保证内容的完整性和时效性。本博客的内容可能会随着时间的推移而过时或需要更新。
  • 若您是黑马程序员或相关权利人,如有任何侵犯版权的地方,请您及时联系我,我将立即予以删除或进行必要的修改。
  • 对于其他读者,请在阅读本博客内容时保持遵守相关法律法规和道德准则,谨慎参考,并自行承担因此产生的风险和责任。本博客中的部分观点和意见仅代表我个人,不代表黑马程序员的立场。

Vuex 概述

  • uex 是一个用于 Vue.js 的状态管理库【状态就是数据】。简言之,Vuex 是一个插件,可以帮我们管理 Vue 通用的数据 (多组件共享的数据)。
  • 使用场景
    在这里插入图片描述

  • 优势
    • 共同维护一份数据,数据集中化管理
    • 响应式变化
    • 操作简洁
      在这里插入图片描述

Vuex 的主要概念和组件

  • 状态(State):Vuex 中的状态是存储应用程序数据的地方,通常表示为 JavaScript 对象。

  • 获取器(Getters):获取器用于根据当前状态计算派生状态类似于存储库中的计算属性。

  • 突变(Mutations):突变是修改状态的唯一方式。它们是同步的,通过明确定义状态如何改变,有助于维护可预测的状态。

  • 动作(Actions):动作用于执行异步操作和触发突变。适合进行诸如发出 API 请求然后根据结果提交突变等任务。

  • 模块(Modules):Vuex 允许将存储划分为模块。这对于较大的应用程序有助于将状态、突变、动作和获取器组织成更小、更可管理的部分。

  • Vuex 特别适用于较大的应用程序,其中状态管理可能变得复杂。

  • 它强制执行单向数据流,并使更容易跟踪应用程序状态变化的来源。这种可预测性有助于调试和维护不断增长的应用程序。

vuex的使用

  • Vue.js 应用程序中设置 Vuex 的一般步骤
    在这里插入图片描述
  1. 安装(Installation):你需要将 Vuex 安装为依赖项,可以使用 npm 或 yarn 进行安装。

    npm i vuex@3 # vue2适用
    
  2. 存储配置(Store Configuration):通过定义状态、突变、动作和获取器来创建一个存储。

    • 为了维护项目目录的整洁,在src目录下新建一个store目录其下放置一个index.js文件。
      在这里插入图片描述
       // store.js
       import Vue from 'vue'
       import Vuex from 'vuex'
    
       Vue.use(Vuex)
    
       const store = new Vuex.Store({
         state: {
           // 在这里定义应用程序的状态
         },
         mutations: {
           // 在这里定义突变函数
         },
         actions: {
           // 在这里定义动作函数
         },
         getters: {
           // 在这里定义获取器函数
         }
       })
       export default store
    
  3. 在 main.js 中导入挂载到 Vue 实例上

    import Vue from 'vue'
    import App from './App.vue'
    import store from './store'
    
    Vue.config.productionTip = false
    
    new Vue({
      render: h => h(App),
      store
    }).$mount('#app')
    
  4. 测试打印Vuex

    created(){
      console.log(this.$store)
    }
    

状态 (state)

  • “state”(状态)是指应用程序中的数据的集合,通常表示为一个包含各种属性的 JavaScript 对象。这些属性可以包括应用程序的配置、用户信息、页面内容、各种设置等。
  • State提供唯一的公共数据源,所有共享的数据都要统一放到Store中的State中存储。
  • store 对象的 state 属性中定义应用程序的状态
const store = new Vuex.Store({
  // state 状态, 即数据, 类似于vue组件中的data,
  // 区别:
  // 1.data 是组件自己的数据, 
  // 2.state 中的数据整个vue项目的组件都能访问到
  state: {
    user: null,
    settings: {
      theme: 'light',
      language: 'en',
    },
    // 其他应用程序状态
  },
  // 其他配置项
})

Vuex特点

  • Vuex 中状态的一些重要特点
    • Centralized: Vuex 中的状态是集中管理的,这意味着所有组件都可以访问相同的状态数据,而不需要通过复杂的组件传递数据来实现共享。

    • Reactive: Vuex 的状态是响应式的。当状态发生变化时,依赖于该状态的组件会自动更新以反映这些变化。

    • Read-Only: Vuex 的状态是只读的。这意味着你不能直接在组件中修改状态,而是需要通过 mutations 来进行修改。这有助于维护状态的可预测性。

    • Single Source of Truth: Vuex 鼓励将应用程序的状态集中到一个单一的状态树中,使其成为整个应用程序的“唯一数据源”。这有助于简化状态的管理和维护。

    • Predictable: 由于状态的修改只能通过 mutations 来进行,因此状态的变化变得可预测,易于调试和维护。

访问vuex中数据

  1. 通过$store直接访问 —> {{ $store.state.count }}
  2. 通过辅助函数mapState 映射计算属性 —> {{ count }}

$store访问

  • 通过$store访问的语法
    获取 store:
     1.Vue模板中获取 this.$store
     2.js文件中获取 import 导入 store
    
    
    模板中:     {{ $store.state.xxx }}
    组件逻辑中:  this.$store.state.xxx
    JS模块中:   store.state.xxx
    
  • 模板中使用
    • 在组件中访问 Vuex 中的状态,可以使用 this.$store.state 来获取状态的值
<template>
  <div>
    <p>User: {{ $store.state.user }}</p>
    <p>Theme: {{ $store.state.settings.theme }}</p>
  </div>
</template>
  • 组件逻辑中使用
    • 将state属性定义在计算属性中
    <h1>state的数据 - {{ count }}</h1>
    
    // 把state中数据,定义在组件内的计算属性中
      computed: {
        count () {
          return this.$store.state.count
        }
      }
    
  • js文件中使用
//main.js

import store from "@/store"

console.log(store.state.count)

mapState辅助函数访问

  • mapState是辅助函数,把store中的数据映射到 组件的计算属性中, 它属于一种方便的用法
    在这里插入图片描述
  • 第一步:导入mapState (mapState是vuex中的一个函数)
    import { mapState } from 'vuex'
    
  • 第二步:采用数组形式引入state属性
    mapState(['count']) 
    
    • 上面的代码等价于
    count () {
        return this.$store.state.count
    }
    
  • 第三步:利用展开运算符将导出的状态映射给计算属性
      computed: {
        ...mapState(['count'])
      }
    
     <div> state的数据:{{ count }}</div>
    

开启严格模式及Vuex的单项数据流

  • vuex 同样遵循单向数据流,组件中不能直接修改仓库的数据
  1. 直接在组件中修改Vuex中state的值
    在这里插入图片描述
  • Son1.vue
button @click="handleAdd">+ 1</button>

methods:{
	 handleAdd (n) {
      // 错误代码(vue默认不会监测,监测需要成本)
       this.$store.state.count++
      // console.log(this.$store.state.count) 
    },
}
  1. 开启严格模式
    • 通过 strict: true 可以开启严格模式,开启严格模式后,直接修改state中的值会报错
    • state数据的修改只能通过mutations,并且mutations必须是同步的
      在这里插入图片描述

突变(mutations)

mutations初识

  1. 定义mutations
const store  = new Vuex.Store({
  state: {
    count: 0
  },
  // 定义mutations
  mutations: {
     
  }
})
  1. 格式说明
  • mutations是一个对象,对象中存放修改state的方法
mutations: {
    // 方法里参数 第一个参数是当前store的state属性
    // payload 载荷 运输参数 调用mutaiions的时候 可以传递参数 传递载荷
    addCount (state) {
      state.count += 1
    }
  }
  1. 组件中提交 mutations
this.$store.commit('addCount')

带参 mutations

  • 提交 mutation 是可以传递参数的 this.$store.commit('xxx', 参数)
  1. 提供mutation函数(带参数)
    mutations: {
      ...
      addCount (state, count) {
        state.count = count
      }
    }
    
  2. 提交mutation
    handle ( ) {
      this.$store.commit('addCount', 10)
    }
    
  3. 小tips: 提交的参数只能是一个, 如果有多个参数要传, 可以传递一个对象
    this.$store.commit('addCount', {
      count: 10
    })
    

辅助函数 mapMutations

  • mapMutations 和 mapState很像,它是把位于mutations中的方法提取了出来,映射到组件methods中。
    import  { mapMutations } from 'vuex'
    methods: {
        ...mapMutations(['addCount'])
    }
    //等价于
    methods: {
      // commit(方法名, 载荷参数)
      addCount () {
          this.$store.commit('addCount')
      }
    }
    
    • 在组件中,可以直接通过this.addCount调用
    <button @click="addCount">+1</button>
    
  • 请注意: Vuex中mutations中要求不能写异步代码,如果有异步的ajax请求,应该放置在actions中

动作(Actions)

  • actions是用于处理异步操作的,例如从服务器获取数据或执行复杂的计算。Actions可以包含任何异步操作,但是它们最终需要调用mutations来更新state中的数据。

  • Actions是通过dispatch方法来调用的,dispatch方法接收一个action的名称和一个可选的payload参数。当调用dispatch方法时,它会触发一个action,并且可以在action中执行任何异步操作。

  1. 定义actions
mutations: {
  changeCount (state, newCount) {
    state.count = newCount
  }
}


actions: {
  setAsyncCount (context, num) {
    // 一秒后, 给一个数, 去修改 num
    setTimeout(() => {
      context.commit('changeCount', num)
    }, 1000)
  }
}
  1. 组件中通过dispatch调用
setAsyncCount () {
  this.$store.dispatch('setAsyncCount', 666)
}

在这里插入图片描述

辅助函数 mapActions

  • mapActions 是把位于 actions中的方法提取了出来,映射到组件methods中
  • Son.vue
    import { mapActions } from 'vuex'
    methods: {
       ...mapActions(['changeCountAction'])
    }
    
    //mapActions映射的代码 本质上是以下代码的写法
    //methods: {
    //  changeCountAction (n) {
    //    this.$store.dispatch('changeCountAction', n)
    //  },
    //}
    
  • 直接通过 this.方法 就可以调用
    <button @click="changeCountAction(200)">+异步</button>
    

vuex mutations VS actions

MutationsActions
目的修改state中的数据执行异步操作、调用多个mutations
同步/异步同步操作可以是同步或异步操作
使用场景更新state中的数据执行异步请求、处理复杂逻辑
调用方式使用commit方法调用使用dispatch方法调用
响应不能返回任何值,只能修改state可以返回Promise或异步操作的结果
跟踪可以在devtools中跟踪mutations的调用可以在devtools中跟踪actions的调用
  • 总体来说
    • mutations适用于同步操作,用于修改state中的数据。它们是可追踪的,可以在devtools中查看它们的调用。
    • actions适用于执行异步操作、调用多个mutations或处理复杂逻辑。它们可以是同步或异步操作,并且可以返回Promise或异步操作的结果。
    • 在调用上,mutations使用commit方法,而actions使用dispatch方法。

获取器(Getters)

  • getters用于从store中获取数据,类似于计算属性,可以基于store中的state计算出一个新的值。
  • getters可以看作是store的计算属性,它们的值会被缓存起来,只有当所依赖的state发生变化时才会重新计算。
  • 好处:可以将数据的处理逻辑从组件中抽离出来,将其放在store中,从而使得组件更加简洁和易于维护。另外,getters还可以在多个组件中共享和重复使用,避免了代码的冗余。

  • getter示例:
    • 定义doneTodos的getter,它基于store中的todos数组计算出一个新的数组,该数组包含所有已完成的todo对象
    const getters = {
     //getters: {
     // getters函数的第一个参数是 state
     // 必须要有返回值
      doneTodos: state => {
        return state.todos.filter(todo => todo.done)
      }
    }
    
  • 访问getters
    • 使用store访问getters
    {{ $store.getters.doneTodos}}
    
    • 在组件中使用这个getter,使用mapGetters辅助函数
import { mapGetters } from 'vuex'

export default {
  computed: {
    ...mapGetters([
      'doneTodos'
    ])
  }
}

总结

  • 关于Vuex中state、getters、mutations和actions的使用总结:
StateGettersMutationsActions
用途存储应用程序的数据从state中派生出计算属性修改state中的数据执行异步操作、调用多个mutations
直接访问使用this.$store.state使用this.$store.getters不直接访问,通过commit方法调用不直接访问,通过dispatch方法调用
用法示例this.$store.state.countthis.$store.getters.doneTodosthis.$store.commit(‘increment’)this.$store.dispatch(‘fetchData’)
参数接收state作为参数接收state和payload作为参数接收context对象作为参数
返回值返回基于state的计算属性或派生数据无返回值,只能修改state可以返回Promise或异步操作的结果
异步操作不适用不适用不适用适用
跟踪可以在devtools中跟踪getters的调用可以在devtools中跟踪mutations的调用可以在devtools中跟踪actions的调用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

N——>BatchSize 数据维度理解和处理(chun, cat, squeeze, unsqueeze)

数据处理之N——>BatchSize N——>batch_size train_data TensorDataset(torch.Tensor(x_train).double(), torch.Tensor(y_train).double()) train_loader DataLoader(train_data, batch_sizeargs.bs, shuffleTrue, drop_lastTrue) for batch_idx, (inputs, results…

自动化测试07Selenium01

目录 什么是自动化测试 Selenium介绍 Selenium是什么 Selenium特点 工作原理 SeleniumJava环境搭建 Selenium常用的API使用 定位元素findElement CSS选择语法 id选择器&#xff1a;#id 类选择 .class 标签选择器 标签名 后代选择器 父级选择器 自己选择器 xpath …

Django实现音乐网站 (22)

使用Python Django框架做一个音乐网站&#xff0c; 本篇音乐播放器功能完善&#xff1a;顺序播放、设置播放数、歌词滚动等功能。 目录 顺序播放 设置顺序播放 单曲播放数 添加路由 视图处理 模板处理 歌词滚动 视图内容返回修改 样式设置 模板内容 歌词滚动脚本 歌…

【C++代码】安排行程,N皇后,解数独--代码随想录

题目&#xff1a;重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先生&#xff0c;所以该行程必…

[Docker]二.Docker 镜像,仓库,容器介绍以及详解

一.Docker 镜像,容器,仓库的简单介绍 通俗来讲:镜像相当于VM虚拟机中的ios文件,容器相当于虚拟机系统,仓库相当于系统中的进程或者执行文件,容器是通过镜像创建的 1.镜像 Docker 镜像就是一个 Linux 的文件系统&#xff08; Root FileSystem &#xff09;&#xff0c;这个文…

一百九十五、MySQL——MySQL数据库创建只读权限的账号(附流程截图)

一、目的 在团队开发过程中&#xff0c;为了实现数据共享以及避免其他团队修改库表数据&#xff0c;需要提供数据库只读权限的账号&#xff0c;因此以MySQL数据库为例&#xff0c;创建MySQL数据库只读权限的账号 二、实施步骤 &#xff08;一&#xff09;第一步&#xff0c;…

栈(Stack)的概念+MyStack的实现+栈的应用

文章目录 栈&#xff08;Stack&#xff09;一、 栈的概念1.栈的方法2.源码分析 二、MyStack的实现1.MyStack的成员变量2.push方法3.isEmpty方法和pop方法4.peek方法 三、栈的应用1.将递归转化为循环1.调用递归打印2.通过栈逆序打印链表 栈&#xff08;Stack&#xff09; 一、 栈…

Nginx动静分离

为了加快网站的解析速度&#xff0c;可以把动态页面和静态页面由不同的服务器来解析&#xff0c;加快解析速度。降低原来单个服务器的压力。 在动静分离的tomcat的时候比较明显&#xff0c;因为tomcat解析静态很慢&#xff0c;其实这些原理的话都很好理解&#xff0c;简单来说&…

T113-S3-buildroot文件系统tar解压缩gz文件

目录 前言 一、现象描述 二、解决方案 三、tar解压缩.gz文件 总结 前言 本文主要介绍全志T113-S3平台官方SDK&#xff0c;buildroot文件系统tar不支持.gz文件解压缩的问题以及如何配置buildroot文件系统解决该问题的方法介绍。 一、现象描述 在buildroot文件系统中&#xff…

Doceker-compose——容器群集编排管理工具

目录 Docker-compose 1、Docker-compose 的三大概念 2、YAML文件格式及编写注意事项 1&#xff09;使用 YAML 时需要注意下面事项 2&#xff09;ymal文件格式 3&#xff09;json格式 3、Docker Compose配置常用字段 4、Docker-compose的四种重启策略 5、Docker Compos…

强劲升级,太极2.x你值得拥有!

嗨&#xff0c;大家好&#xff0c;最近桃桃没顾得上给大家分享好用好玩的软件。 还记得前段时间给大家分享的太极1.0软件&#xff1f; 最近大佬对软件进行了全新升级&#xff0c;升级后的功能更强更稳定&#xff0c;轻度用户使用基本功能就已经足够了&#xff0c;壕无人性的同学…

Openssl数据安全传输平台004:Socket C-API封装为C++类 / 服务端及客户端代码框架和实现

文章目录 0. 代码仓库1. 客户端C API2. 客户端C API的封装分析2.1 sckClient_init()和sckClient_destroy()2.2 sckClient_connect2.3 sckClient_closeconn()2.4 sckClient_send()2.5 sckClient_rev()2.6 sck_FreeMem 3. 客户端C API4. 服务端C API5. 服务端C6. 客户端和服务端代…

Ubuntu 安装 npm 和 node

前言 最近学习VUE&#xff0c;在ubuntu 2204 上配置开发环境&#xff0c;涉及到npm node nodejs vue-Cli脚手架等内容&#xff0c;做以记录。 一、node nodejs npm nvm 区别 &#xff1f; node 是框架&#xff0c;类似python的解释器。nodejs 是编程语言&#xff0c;是js语言的…

题目 1053: 二级C语言-平均值计算(python详解)——练气三层初期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

外网nat+nat server,内网做路由过滤,以及ppp CHAR认证 企业网搭建

作业 网络拓扑图如下所示&#xff1a; 要求&#xff1a;做适当的截图&#xff0c;表示完成相应的操作。 按照网络拓扑要求搭建网络结构&#xff0c;按照个人学号配置每个节点的IP地址&#xff0c;其中X为班级号&#xff0c;Y为学号末尾2位&#xff1b;Y1为学号末尾2位1&#…

uniapp接入萤石微信小程序插件

萤石官方提供了一些适用于uniapp / 小程序的方案 如 小程序半屏 hls rtmp 等 都TM有坑 文档写的依托答辩 本文参考了uniapp小程序插件 以及 萤石微信小程序插件接入文档 效果如下 1. 插件申请 登录您的小程序微信公众平台&#xff0c;点击左侧菜单栏&#xff0c;进入设置页…

【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】

准备工作&#xff1a;CentOS 7系统&#xff0c;并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意&#xff1a;这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…

OpenCV中world模块介绍

OpenCV中有很多模块&#xff0c;模块间保持最小的依赖关系&#xff0c;用户可以根据自己的实际需要链接相关的库&#xff0c;而不需链接所有的库&#xff0c;这样在最终交付应用程序时可以减少总库的大小。但如果需要依赖OpenCV的库太多,有时会带来不方便&#xff0c;此时可以使…

线上答题活动小程序结合线下大屏复盘总结

线上答题活动小程序结合线下大屏复盘总结 ~ 说来话长&#xff0c;这个活动也接近尾声了&#xff0c;从刚开始着手开发&#xff0c;到现在已过去半年&#xff0c;好不夸张的&#xff0c;当时从4月份开始接触&#xff0c;现在已经十月份了 该小程序我发下主界面截图&#xff0…

【RocketMQ集群】Linux搭建RocketMQ双主双从集群

在当今大数据时代&#xff0c;消息队列系统成为了构建高可用、可扩展和可靠的分布式应用的重要组件之一。而Apache RocketMQ作为一款开源的分布式消息中间件&#xff0c;以其高吞吐量、低延迟和可靠性而备受青睐。为了满足大规模应用的需求&#xff0c;搭建RocketMQ集群是一种常…
最新文章