vuex核心

news2024/11/26 18:26:12

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、什么是状态管理?
  • 二、复杂的状态管理
    • 1.随着代码越来越多,需要管理的状态越来越复杂,当`多个组件共享状态`时,单向数据流的简洁性很容易被破坏
    • 2.我们是否可以通过组件数据的传递来完成呢?
  • Vuex的状态管理
    • 管理不断变化的state本身是非常困难的
    • 因此,我们是否可以考虑将组件的内部状态抽离出来,以一个全局单例(对象)的方式来管理
  • 安装
  • 创建Store
    • Vuex和单纯的全局对象有什么区别呢
  • 单一状态树
  • 组件获取状态
  • 在展开运算符和原来的computed混合使用 mapState
  • getters的基本使用
    • 某些属性我们需要经过变化后再使用,此时,可以使用getters进行操作
  • getters第二个参数
    • getters可以接收第二个参数
  • getters的返回函数
    • getters中的函数本身,可以返回一个函数,在使用的地方相当于可以调用这个函数
  • Mutation基本使用
    • 更改Vuex的store中的状态的唯一方法是提交mutation
  • 携带数据
    • 使用参数 传递数据
    • payload为对象类型时 .
    • 提交方式
  • Mutation常量类型
    • 定义常量:mutation-type.js
    • 定义 mutation
  • mapMutations辅助函数
  • 在setup中使用方式:
  • mutation重要原则
  • actions的基本使用
  • `actions`的`分发`操作
  • actions的辅助函数
  • actions的异步操作
  • module的基本使用
  • module的局部状态
  • module的命名空间


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是状态管理?

✌✌✌🧨🧨🧨

  • 在开发中,应用程序需要处理各种各样的数据,保存在我们应用程序中的某一个位置,那么对于这些数据的管理就可以称之为 状态管理
  • 简单数据是如何管理自己的状态呢
  • 组件化的开发方式,在组件中我们定义data或者在setup中返回使用的数据,可以称之为 state
  • 在模块 template 中使用的数据,渲染成 DOM,称之为View
  • 组件中会产生一些行为事件,处理这些行为事件时,会修改state 称之为 actions

二、复杂的状态管理

1.随着代码越来越多,需要管理的状态越来越复杂,当多个组件共享状态时,单向数据流的简洁性很容易被破坏

  • 多个视图依赖于同一状态
  • 来自不同视图的行为需要变更同一状态

2.我们是否可以通过组件数据的传递来完成呢?

  • 对于一些简单的状态,确实可以通过props的传递或者Provide的方式来共享状态
  • 但是对于复杂的状态管理来说,显然单纯通过传递和共享的方式是不足以解决问题的

Vuex的状态管理

管理不断变化的state本身是非常困难的

  • 状态之间相互会存在依赖,一个状态的变化会引起另一个状态的变化,View页面也有可能会引起状态的变化
  • 当应用程序复杂时,state在什么时候,因为什么原因而发生了变化,发生了怎么样的变化,会变得非常难以控制和追踪

因此,我们是否可以考虑将组件的内部状态抽离出来,以一个全局单例(对象)的方式来管理

  • 在这种模式下,我们的组件树构成了一个巨大的 “视图View”
  • 不管在树的哪个位置,任何组件都能获取状态或者触发行为
  • 通过定义和隔离状态管理中的各个概念,并通过强制性的规则来维护视图和状态间的独立性,我们的代码边会变得更加结构
    化和易于维护、跟踪
  • 这就是Vuex背后的基本思想

安装

  • npm install vuex

  • 计数器案例(组件内定义的方式)
    在这里插入图片描述

创建Store

  • 每一个Vuex应用的核心就是store(仓库)
    本质是一个容器,包含着应用中大部分的状态
    在这里插入图片描述

在这里插入图片描述
入口文件main.js中
在这里插入图片描述
组件中使用 模板使用
在这里插入图片描述
script中使用store
在这里插入图片描述

Vuex和单纯的全局对象有什么区别呢

  • Vuex的状态存储是响应式 全局对象不是响应式的
    当Vue组件从store中读取状态的时候,若store中的状态发生变化,那么相应的组件也会被更新

  • 但是,不能直接改变store中的状态
    改变store中的状态的唯一途径就是提交 (commit) mutation
    这样使得我们可以方便的跟踪每一个状态的变化,从而让我们能够通过一些工具帮助我们更好的管理应用的状态

单一状态树

  • Vuex使用单一状态树
    一个对象就包含了全部的应用层级的状态
    采用的SSOT是单一数据源
  • 意味 每个应用将仅仅包含一个 store 实例
    单状态树和模块化并不冲突,
  • 优势:
    相比较保存到多个Store对象中,后期的维护会变得复杂
    单一状态树可以最直接的方式找到某个状态的片段
    利于后期维护和调试,

组件获取状态

  • 在模块中获取时,表达式过长,使用计算属性也较为繁琐
  • 所以,如果有很多个状态都需要获取的话,我们使用vuex提供的辅助函数,mapState 映射
    展开运算符和原来的computed混合使用
    参数:
    方式一:对象类型
    方式二:数组类型

在展开运算符和原来的computed混合使用 mapState

在这里插入图片描述

getters的基本使用

某些属性我们需要经过变化后再使用,此时,可以使用getters进行操作

store/index.js
在这里插入图片描述
在这里插入图片描述

getters第二个参数

getters可以接收第二个参数

在这里插入图片描述

getters的返回函数

getters中的函数本身,可以返回一个函数,在使用的地方相当于可以调用这个函数

Mutation基本使用

更改Vuex的store中的状态的唯一方法是提交mutation

在这里插入图片描述

携带数据

使用参数 传递数据

在这里插入图片描述

payload为对象类型时 .

在这里插入图片描述

提交方式

在这里插入图片描述

Mutation常量类型

定义常量:mutation-type.js

export const ADD_NUMBER = ‘ADD_NUMBER’

定义 mutation

[ADD_NUMBER](state,payload){
	state.counter += payload.count
}

提交mutation

 $store.commit({type:ADD_NUMBER,count:100}) 

mapMutations辅助函数

-快速映射到对应的方法中:

methods:{
	...mapMutations({k:v}),
	...mapMutations(["",""])
}

在setup中使用方式:

const mutations = mapMutations(['','']);
const mutations-cs = mapMutations({k:v})

mutation重要原则

  • 要求 必须是同步函数
    会记录mutation的日记
    每一条mutation被记录,devtools都需要捕捉到前一状态和后一状态的快照;
    目的是可以追踪到数据的变化,如果发送网络请求的话需要如何操作

actions的基本使用

  • Action类似于mutation,不同在于:
    action提交的是mutation,而不是直接变更状态;
  • 另外重要的一点:action可以包含任意异步操作
actions:{
	increment(context){
		context.commit('increment')	
	}
}
  • 这里有一个重要的参数 context
    context是一个和store实例具有相同方法和属性的context对象;
    那我们就可以从其中获取到commit方法来提交一个mutation,或通过context.state和context.getters来获取state和getters;
  • 但是它和store对象有区别

actions分发操作

  • 如何使用action,进行内容分发 也可以携带参数
    分发使用的是 store上的 dispatch函数;
submitbtn(){
	this.$store.dispatch("subbtn",{message:"111222"});
}
  • 也可以对象的形式进行分发
submitbtn(){
	this.$store.dispatch({
		type:"",
		message:"",	
	})
}

actions的辅助函数

  • action也有对应的辅助函数:
    对象类型方式:
    数组类型方式:
methods:{
	...mapActions(['','']),
	...mapActions({k:v})
}

actions的异步操作

  • 通常是异步的,监听什么时候结束呢
    通过返回Promise,在Promise的then中处理完成后的操作
actions:{
	increment(context){
		return new Promise((res)=>{
			setTimeout(()=>{
				context.commit("increment")
				res("异步触发了")
			})
		})
		}
}
const store = useStore();
const increment = ()=>{
	store.dispatch("increment").then(res=>{
		console.log(res,"异步好了")
		})
}

module的基本使用

  • Module的定义
    由于使用单一状态树,应用的所有状态会集中到一个比较大的对象,随着复杂度递增,store对象变得很臃肿;
    为了解决此问题,Vuex允许将store分割
    每个分割的模块可以拥有自己的state/mutation/action/getter/嵌套子模块
const home= {
	state(){return {}},
	mutations:{},
	actions:{},
	getters:{}
},
const moduleB = {
	state:()=>({}),
	mutations:{},
	actions:{},
	getters:{}
}
const store = createStore({
	modules:{
		home:moduleA,
		b:moduleB
	}
})
store.state.home //home模块的状态

module的局部状态

-对于模块内部的 mutation和 getter,接收的第一个参数是 模块的局部状态对象

 mutations:{
        //第二个参数 接收传递的数据
       increment(state,payload){
            console.log(store.state.counter);
            // 获取对象方式
            store.state.counter += payload.count    
        },
        changeName(state){
            state.name = '局座高明'
        },
        changeBanner(state,banners){
            state.banners = banners
        }
    },
	随着模块的增加 组件派发的方法名称增加,在仓库模块中需要格外小心如果都存在相同名称的方法, 名称是否冲突 那么能否

module的命名空间

  • 默认情况下,模块内部的action和mutation是注册在全局的命名空间中的
  • 这样使得多个模块能够对同一个 action或mutation作出响应
  • Getter同样也默认注册在全局命名空间;
  • 如果希望模块具有高度的封装度和复用性,可以添加配置项 namespaced:true 的方式使其成为带命名空间的模块;
    当模块注册后,它的所有 getter/action/mutation都会自动根据模块注册的路径调整命名;
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

​刷爆朋友圈!前百度总裁陆奇最新AI重磅演讲:我的大模型世界观​

陆奇的演讲刷屏了,我认真看了他的演讲稿,收获颇丰。 陆奇提到,人类社会的发展,大致可分为:农业化、工业化和数字化三个阶段。 在三个递进的阶段中,人类一直在探索如何减少烦琐且消耗能量的体力和脑力劳动&a…

安装 MySQL 8 如何在生产环境中

文章结构 安装生产环境安装 MySQLDocker 安装 MySQL 相关资源网址 安装 生产环境安装 MySQL 一般的,我们使用 RPM 包的方式完成 MySQL 的安装,本教程参考了官方的安装说明,安装的具体步骤如下: 什么是 RPM: rpm&…

chatgpt赋能python:Python代码怎么读?

Python代码怎么读? Python是一种高级编程语言,它具有明确简洁的语法和丰富的资源库。它是一个简单易学的语言,非常适合编写快速原型。 但是,对于初学者来说,Python代码可能看起来有点吓人。好消息是,Pyth…

前端基础(HTML)——html介绍 常用标签 几个案例

引出 html是啥,常见的标签,几个例子 一、概述 1.1 HTML是什么? Hyper Text Markup Language (超文本标记语言) 简写:HTML,HTML 通过标签来标记要显示的网页中的各个部分。网页文件本身是一种文本文件, 通过在文本文…

solr快速上手:创建核心/索引/core(四)

0. 引言 上节,我们讲解了solr的核心配置文件managed-schema,了解定义索引的核心配置标签,今天我们来实操配置,创建一个索引 solr快速上手:solr简介及安装(一) solr快速上手:核心概…

chatgpt赋能python:Python修改上一行:简化你的工作流程

Python修改上一行:简化你的工作流程 作为一名有10年Python编程经验的工程师,我一直在探索更加高效的工作方式。今天,我想向大家分享的是Python修改上一行的技巧,让你的工作流程更加简化,提高工作效率。 什么是Python…

【利用AI让知识体系化】进程和线程

文章目录 1. 介绍1.1 什么是进程1.2 什么是线程1.3 进程和线程之间的关系 2. 进程的概念2.1 进程的定义2.2 进程的特征2.3 进程的状态2.4 进程的调度 3. 线程的概念3.1 线程的定义3.2 线程的优点3.3 线程的实现3.4 线程的调度 4. 进程和线程的比较4.1 进程和线程的区别4.2 进程…

chatgpt赋能python:Python修改Word二级标题的SEO优化

Python修改Word二级标题的SEO优化 Python是一种非常流行的编程语言,可以用于许多各种各样的应用程序。其中之一是用Python处理文档,其中一个重要的任务是修改文档中的标题。二级标题是英文文档中非常常见的元素,这篇文章将介绍如何使用Pytho…

【MySQL新手到通关】第七章 聚合函数

文章目录 0. 前置1. 聚合函数介绍1.1 AVG 和 SUM 函数1.2 MIN 和 MAX 函数1.3 COUNT函数 2. GROUP BY2.1 基本使用 3. HAVING3.1 基本使用3.2 WHERE和HAVING的对比 0. 前置 为了方便测试,我们导入一些数据 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ------…

chatgpt赋能python:Python代码优化:如何放大你的SEO效果

Python 代码优化:如何放大你的SEO效果 Python语言编写的代码相较于其他编程语言而言具有一定的优势,因为Python语言编写的代码可读性高且易于维护,同时Python也支持多种不同的应用场景,包括网络编程,数据分析&#xf…

chatgpt赋能python:Python从文本中提取年份月份的方法

Python从文本中提取年份月份的方法 Python作为一种高效、优秀的编程语言,被广泛应用于文本分析、数据分析等领域。其中,从文本中提取年份月份是一项常见的工作。本文将介绍Python如何从文本中提取年份月份的方法,让您能够更好地应用Python进…

基于循环神经网络的语言模型:RNNLM、GRULM

基于循环神经网络的语言模型:RNNLM RNNLM首次提出是在《Recurrent neural network based language model》这篇非常重要的神经网络语言模型论文种,发表于2010年。这篇论文的主要贡献是: 首次提出并实现了一种基于循环神经网络(Recurrent Neural Network)的语言模型…

Linux 目录结构_安装Xshell6和Xftp6教程加 Xshell无法启动:要继续使用此程序........,的解决方法

Linux 目录结构 基本介绍 linux 的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录。深刻理解linux 树状文件目录是非常重要的,这里我给大家说明一下。记住一句经典的话:在…

chatgpt赋能python:Python代码怎么自动排序?全面解析!

Python代码怎么自动排序?全面解析! 在软件开发中,很多时候需要对数据进行排序操作,以便更好的管理和使用数据。Python提供了多种排序算法和排序函数,支持自定义排序规则,灵活多样。本文将为大家介绍常见的…

chatgpt赋能python:Python修改默认字体为黑体

Python修改默认字体为黑体 介绍 Python是一种高级编程语言,被广泛应用于人工智能、大数据分析、Web开发等领域。在Python中,字体颜色和样式对于代码阅读和可读性影响很大。然而,用Python自带的默认字体,代码阅读可能会产生疲劳感…

物流货物跟踪管理系统的设计与实现(论文+源码)_kaic

摘 要 为解决物流货物跟踪过程中,跟踪相关信息滞后的问题,本毕业项目设计了物流货物跟踪管理系统。本系统基于B/S架构,采用SSH技术,VUE框架,VS2019平台,Sqlserver数据库,实现了物流公司模块、…

linux系统从零开始搭建CICD jenkins环境

1、操作系统与环境 本文教你从零开始搭建jenkins环境,开始你的CICD之旅。 1.1 系统与安装环境 本文的环境为云服务器环境,系统为linux Red-hat系统。版本信息如下: Linux version 3.10.0-1160.88.1.el7.x86_64 (mockbuildkbuilder.bsys.ce…

基于Java的旅游网站的设计与实现(论文+源码)_kaic

摘 要 旅游业走过了改革开放,到现在依旧蓬勃发展。但是放眼国际社会,我们在旅游业发展的深度和广度上所做的努力还远远不够。在中国,旅游业也将成为经济崛起中的重要一环。目前,我们生活在一个信息时代里。无论是工作,…

chatgpt赋能python:Python:一种强大的编程语言

Python:一种强大的编程语言 介绍 Python是一种高级编程语言,旨在提高开发者的生产力和代码可读性。它是一种动态语言,使编写代码变得更加简单和容易。许多大型组织和企业都使用Python作为主要的编程语言,包括微软、Facebook、Go…

Java开发SDK详解

一、服务端开发 1、前言 1)最近在对接外部平台的接口,对方提供了一个sdk,开发中直接引入到项目中。自己只需要组装参数,直接调用sdk中的方法就可以实现接口对接。 2)sdk中包含了参数校验,加密验签&#x…