vue重修之Vuex【上部】

news2024/11/24 12:09:28

文章目录

  • 版权声明
  • 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.coloradmin.cn/o/1135635.html

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

相关文章

Redis快速上手篇(三)(事务+Idea的连接和使用)

Redis事务 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的 所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞。 单独的隔离的操作 官网说明 https://redis.io/docs/interact/transactions/ MULTI、EXEC、…

数据结构,及分类(存储分类、逻辑分类)介绍

一、数据结构&#xff1a; 数据是软件开发的核心。在软件开发过程中基本上就是对数据的新增、删除、修改、查看的操作。 如何合理存储数据&#xff0c;如何有效提升数据操作开发效率&#xff0c;都是软件开发中的重中之重。使用合理的数据结构是非常重要的。 1.1简介&#xff…

【Leetcode】【每日一题】【简单】2520. 统计能整除数字的位数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/count-the-digits-that-divide-a…

分享53个ASP.NET源码总有一个是你想要的

分享53个ASP.NET源码总有一个是你想要的 链接&#xff1a;https://pan.baidu.com/s/1xvqgPHSty70VGlQHoy9NYw?pwd8888 提取码&#xff1a;8888 项目名称 ASP.Net 4.5 论坛源码&#xff0c;支持多数据库 Asp.Net Core 3.x博客同步应用案例 ASP.NET Core MVC SqlSugerCore…

安防监控项目---概要

文章目录 前言一、项目需求二、环境介绍三、关键点四、主框架分析总结 前言 各位小伙伴&#xff0c;在蛰伏了将近有半年的时间又要和大家分享新的知识了&#xff0c;这次和大家分享的是一个项目&#xff0c;因此呢我准备分项目阶段去和大家分享&#xff0c;希望大家都能够在每…

如何满足TIKTOK直播企业四大网络需求,轻松实现直播无卡顿?

说到企业海外直播&#xff0c;大家脑海里一下就想会想到当下爆火的TIKTOK平台&#xff0c;而随着TIKTOK在全球范围大面积铺开推广&#xff0c;不同国家不同市场的活跃用户数纷纷上涨&#xff0c;让更多的电商企业选择在TIKTOK上进行布局获得商机。 对于已布局TIKTOK直播或者待布…

【Linux】开发工具

目录 Linux编译器-gcc/g使用执行命令&#xff1a;我们的.o和库是如何链接的? make/Makefile依赖关系、依赖方法 Linux编译器-gcc/g使用 gcc只能编译c语言&#xff0c;g可以编译c语言也可以编译g 背景知识&#xff1a; 预处理&#xff08;进行宏替换)编译&#xff08;生成汇编)…

我的Windows10下的WSL的使用经历

微软每年都会举办Build开发者大会&#xff0c;近年来越来越受关注的Linux 子系统Windows Subsystem for Linux&#xff08;WSL&#xff09;已经很完善了&#xff0c;我抱着体验一把的心态&#xff0c;也来使用一下这个功能。 各位新手Linux朋友们&#xff0c;有没有想过怎么在…

ubuntu18.4(后改为20.4)部署chatglm2并进行基于 P-Tuning v2 的微调

下载驱动 NVIDIA显卡驱动官方下载地址 下载好对应驱动并放在某个目录下&#xff0c; 在Linux系统中安装NVIDIA显卡驱动前,建议先卸载Linux系统自带的显卡驱动nouveau。 禁用nouveau 首先&#xff0c;编辑黑名单配置。 vim /etc/modprobe.d/blacklist.conf 在文件的最后添加…

Python实现【亚马逊商品】数据采集

亚马逊作为最大的跨境电商平台之一&#xff0c;其产品一直备受关注&#xff0c;因此采集亚马逊产品功能也是部分卖家所需的&#xff0c;下面我们来了解一下采集亚马逊产品是如何操作的。 l 采集网站 【场景描述】采集亚马逊搜索关键词出来的商品信息。 【入口网址】https://…

MES系统在工业生产中的重要性与功能

MES系统在工业生产中的重要性体现在它的信息化管理能力。传统的生产管理方法主要依靠人工操作和纸质文档记录&#xff0c;效率低下且容易出错。而MES系统利用计算机技术和数据库管理&#xff0c;能够实时记录和监控生产数据&#xff0c;提供准确的生产情况分析报告&#xff0c;…

2023年中国高尔夫服饰市场规模、主要品牌及行业发展方向分析[图]

高尔夫服饰是指高尔夫运动的专用服饰&#xff0c;高尔夫运动作为商务交流的手段和工具&#xff0c;具有较强的商务属性&#xff0c;高尔夫服饰除了具备专业功能属性以外&#xff0c;具备较强的时尚性&#xff0c;适合于商务、日常、休闲等多场景穿戴。高尔夫服饰里的主要类别&a…

快速上手视频下载助手:简单操作,高效下载你心仪的影片

在如今的社交媒体时代&#xff0c;视频已成为人们生活中不可或缺的一部分。微信视频号作为新兴的视频平台&#xff0c;吸引了越来越多的用户。然而&#xff0c;与其他视频平台相比&#xff0c;微信视频号并不支持视频下载功能&#xff0c;给用户带来了不便。但是&#xff0c;不…

React之Jsx如何转换成真实DOM

一、是什么 react通过将组件编写的JSX映射到屏幕&#xff0c;以及组件中的状态发生了变化之后 React会将这些「变化」更新到屏幕上 在前面文章了解中&#xff0c;JSX通过babel最终转化成React.createElement这种形式&#xff0c;例如&#xff1a; <div>< img src&q…

Vue 2 生命周期与 Vue 3 生命周期:介绍与差别对比

目录 引言&#xff1a; 一、Vue 2 生命周期介绍&#xff1a; 二、Vue 3 生命周期介绍&#xff1a; 注册周期钩子​ 生命周期图示 生命周期 三、Vue 2 生命周期与 Vue 3 生命周期的差别对比&#xff1a; 引言&#xff1a; Vue.js 是一款流行的 JavaScript 框架&#xff0…

仿真数字正弦波发生器程序

1&#xff09;构建这个IOC程序的程序框架&#xff1a; orangepiorangepi5:/usr/local/EPICS/program/simScope$ ls bin configure db dbd iocBoot lib Makefile simScopeApp2&#xff09;修改configure下RELEASE文件&#xff0c;添加所需的支持模块&#xff0c;此IOC程…

ThinkPad电脑HDMI接口失灵如何解决?

ThinkPad电脑HDMI接口失灵如何解决&#xff1f; 如果平时正常使用的外接显示器&#xff0c;某天突然无法使用了&#xff0c;重新插拔依然无信号的话&#xff0c;可以打开系统的设备管理器&#xff08;快捷键winx&#xff09;&#xff0c;首先看一下监视器的识别情况&#xff0c…

人声分离神仙网站,用过都说好~

在生活中好听的音乐有千千万的&#xff0c;音乐是非常容易可以找到下载下来的&#xff0c;但是背景音乐相当不容易找的&#xff0c;我们看的某短视频的背景音乐我们觉得不错的&#xff0c;想要下载下来的时候&#xff0c;我们都会无从下手不知道如何才可以找到这个相关的背景音…

内网渗透-内网信息收集

内网信息收集 前言 当我们进行外网信息收集&#xff0c;漏洞探测以及漏洞利用后&#xff0c;获得了主机的权限后&#xff0c;我们需要扩大渗透的战果时&#xff0c;这是我们就要进行内网的渗透了&#xff0c;内网渗透最重要的还是前期的信息收集的操作了&#xff0c;就是我们的…