Vue3.0(六):VueX 4.x详解

news2024/11/28 4:34:32

Vuex4状态管理

什么是状态管理

  • 在开发中,我们的应用程序需要处理各种各样的数据,这些数据需要保存在应用程序的某一个位置,对于这些数据的管理,就是 状态管理
  • 目前前端项目越来越复杂,多组件共享同一数据的状态很常见,因此需要一个更加方便地状态管理库

Vuex状态管理

image.png

  • 在Vuex中,组件通过读取Vuex中的State数据状态,显示到页面上
  • 而组件想要修改State中的数据,需要通过Dispatch,提交Mutations进行修改,禁止直接对State进行修改

Vuex安装和基本使用

  • 在用脚手架搭建的过程中,可以直接进行安装

  • 同时,我们也可以手动进行安装 npm install vuex

  • 在安装完成之后,在 src目录下创建store文件夹,并创建index.js文件

//引入createStore函数
import { createStore } from "vuex";

//创建store对象
const store = createStore({
  //会直接把对象返回出去
  state: () => ({
    counter: 100,
  }),
  //等同于以下写法
  //   state() {
  //     return { counter: 100 };
  //   },
});

export default store;
  • 之后再 main.js文件中,引入store即可
import { createApp } from "vue";
import App from "./App.vue";
//引入store对象
import store from "./store";

const app = createApp(App);
//使用store对象
app.use(store);
app.mount("#app");
  • 在组件 template中使用
<div>
    {{$store.state.counter}}
</div>
  • 在options API中使用
    • 通常是在 computed计算属性中进行使用
computed:{
    counterStore(){
        return this.$store.state.counter
    }
}
  • 在composition API中使用
    • 需要引入 useStore函数进行使用
    • 若直接定义变量进行赋值,则不会是响应式 const counter = store.state.counter
    • 需要进行响应式的处理
import { computed, toRef } from "vue";
import { useStore } from "vuex";
const store = useStore();
//可以用计算属性返回
const counter = computed(() => {
  return store.state.counter;
});
//可以通过toRef转成响应式
const counterRef = toRef(store.state.counter);

与单纯的全局对象有什么区别

  • Vuex的状态存储是响应式的
  • 不能直接改变store中的状态(代码上可以直接更改,但是规范上不可以)

单一状态树

  • Vuex使用的是单一状态树
    • 用一个对象就包含了全部应用层级的状态
    • 即一个项目中,只会创建一个store进行状态管理
  • 若多个组件有不同的状态进行管理
    • 可以进行module进行模块化,管理多个组件的状态
  • 优势
    • 单一状态树能够让我们 最直接的方式找到某个状态的片段
    • 方便维护和调试
  • 但是相对于pinia不够灵活

Vuex-Store的State映射到组件中

目的是取状态更为方便一点,就像在组件内部定义变量一样使用

options API–mapState

  • 在options API中我们可以使用 mapState函数进行映射
  • 传入参数
    • 数组:需要是state中存在的属性
    • 对象:用于 state中的属性与组件本身的变量命名冲突
  • 返回值
    • 返回的就是一个函数,可以直接用于computed中
//比如现在store中存在以下属性
//name: "zhangcheng",
//age: "18",
//address: "hebei",

import { mapState } from "vuex";
computed: {
    //传入数组参数
    ...mapState(["name", "age", "address"]),
        //等同于以下写法
        // name() {
        //   return this.$store.state.name
        // }
        //传入对象参数
        ...mapState({
        sName: (state) => state.name,
    }),
},

composition API中将state映射到组件

前面我们知道在vuex中有一个mapState函数,可以帮助我们完成映射

  • mapState返回的函数,内部实际上用到了 this.$store.state
    • 我们知道,composition中,无法使用this,且this中没有$store
  • 而在前面,我们知道composition API中需要用到 useState函数
import { useStore } from "vuex";
const store = useStore();
//通过store.state.name获取
  • 如果想将 useState函数和mapState函数结合使用
    • mapState返回值,传入到computed计算属性中(computed内部接收一个函数)
    • 同时改变 参数的this指向
//获取计算属性
import { computed } from "vue";
//获取mapState与useStore函数
import { mapState, useStore } from "vuex";

//获取返回值,此时的name是一个函数
const { name } = mapState(["name"]);

const store = useStore();
//在传入name的时候,通过bind改变this指向
//因为computed需要传入一个函数,而call和apply返回值都是函数本身的返回值
//而bind返回的是一个函数
const cName = computed(name.bind({ $store: store }));
  • 以上方法比较繁琐,我们可以通过以下方式进行
    • 通过解构的方法,用toRefs包裹即可
import { toRefs } from "vue";
import { useStore } from "vuex";

const store = useStore();
//解构的时候对变量重命名
//注意使用toRefs
const { name: cName, age } = toRefs(store.state);

getter的基本使用

类似于computed计算属性,对state中的数据可以进行复杂逻辑的处理

  • 在定义store对象的时候,可以配置getters选项
  • 第一个参数state,接收的就是state中的变量
  • 第二个参数getters,接收的就是getter中的变量
  • 返回值可以返回一个函数,这样就可以让外界传值进来
//引入createStore函数
import { createStore } from "vuex";

//创建store对象
const store = createStore({
  //会直接把对象返回出去
  state: () => ({
    name: "zhangcheng",
    age: "18",
    address: "hebei",
  }),
  getters: {
    //第一个参数用于接收state中的变量
    nameAge(state) {
      return state.name + state.age; //"zhangcheng18"
    },
    //第二个参数,用于接收getters中的变量
    info(state, getters) {
      return getters.nameAge + state.address; //"zhangcheng18hebei"
    },
    //可以返回一个函数,用于接收变量
    returnInfo(state) {
      return function (name) {
        return `${name} is ${state.name} friend`;
      };
    },
  },
});
  • 实际调用
<div>nameAge{{ $store.getters.nameAge }}</div>
<div>info{{ $store.getters.info }}</div>
<div>returnInfo{{ $store.getters.returnInfo("lisi") }}</div>
nameAgezhangcheng18
infozhangcheng18hebei
returnInfolisi is zhangcheng friend
  • 对于 getters中的变量,也有相应的映射函数,mapGetters的用法同mapState的用法一样

Mutation基本使用

是Vuex中修改State的唯一途径

在mutation中写的都是同步代码,不能写异步代码,比如进行网络请求

  • 首先在创建 创建 store对象时候,配置mutation选项
    • 第一个参数 state用于访问state中的状态
    • 第二个参数 payload用于接收传入的参数
//创建store对象
const store = createStore({
  //会直接把对象返回出去
  state: () => ({
    name: "zhangcheng",
    age: "18",
    address: "hebei",
  }),
  mutations: {
    changeName(state,payload) {
      state.name = payload;
    },
  },
});

在options API中的使用

  • 仅需在对应的methods中,使用commit访问即可
    • commit中的第一个参数,要与mutation中准备调用方法的名字保持一致
methods:{
    change(){
        this.$store.commit("changeName","lisi")
    }
}

image.png

在compositions API中的使用

  • 在setup中,引入useStore函数
  • 调用commit方法即可
import {useStore} from "vuex"

const store = useStore()
const changeInfo = store.commit("changeInfo")

actions的基本使用

  • Action类似于mutation,但是不同的地方在于

    • Action提交的是mutation,而不是直接变更状态
      • 在action中,并不是对State进行修改,而是通过mutation进行修改
    • Action可以包含任何异步操作
  • 在创建store实例的时候

 mutations: {
    changeName(state, payload) {
      state.name = payload;
    },
  },
  actions: {
    changeNameAction(context, payload) {
      //第一个参数相当于store实例,但实际上不是
      //第二个参数是通过dispatch调用方法,传入的参数
      context.commit("changeName", payload);
    },
  },
  • 调用
    • 通过 dispatch函数进行调用
change() {
    this.$store.dispatch("changeNameAction", "lisi");
},

实际用法

  • actions中通常是进行网络请求的
  • 而mutations中是修改state的唯一途径
  • 下面是一个实际案例的做法
    • 我们通过Vuex进行状态管理
    • 在actions中,请求数据,通过commit提交mutation
    • 在mutation中修改state
//创建store对象
const store = createStore({
  //会直接把对象返回出去
  state: () => ({
    list: [],
  }),
  mutations: {
    //修改state
    changeName(state, payload) {
      state.list = payload;
    },
  },
  actions: {
    //进行网络请求,并且提交commit申请
    changeNameAction(context, payload) {
      fetch(xxxxx)
        .then((res) => {
          return res.json();
        })
        .then((res) => {
          context.commit("changeName", res);
        });
    },
  },
});
  • 若在组件中,通过 dispatch函数调用了actions中的方法,也想拿到返回值
    • 那么这个方法需要返回一个promise
actions:{
    changeName(){
        return new Promise((resolve)=>{
            resolve(123)
        })
    }
}

//实际调用的时候
this.$store.dispatch("changeName").then((res)=>{
    console.log(res)
})

module的基本使用

  • 在使用Vuex进行状态管理的时候,难免维护的状态会十分庞大

  • 因此我们可以使用 modules将store分割成模块

  • 每个模块都拥有自己的state、mutation、action、getter,甚至可以嵌套子模块

  • 创建一个模块

export default{
    state:()=>({}),
    getters:{},
    mutations:{},
    actions:{}
}
  • 在 创建 store对象的时候,引入模块
import homeModule from "../home.js"
import { createStore } from "vuex";

const store = createStore({
    modules:{
        //引入模块的名字:实际引入的模块
        home:homeModule
    }
})

//在实际使用中,mutation以及action、getters   可以直接读取
//而读取state中的数据有所变化
store.state.home.name

module的局部状态

上面我们知道可以进行分模块的操作

  • 那么我们想在模块中,访问根模块的内容需要怎么访问

  • 比如在 home模块中

getters:{
    changeCounter(state,getters,rootState){
        //state是本模块中的状态
        //getters是本模块中的getters
        //rootState是根模块的state
    }
}
//同理mutation和actions
  • actions、mutations和getters中的命名不能与根组件中重复

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

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

相关文章

高校危化试剂管理:Java与SpringBoot的革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

机器学习2---逻辑回归(基础准备)

逻辑回归是基于线性回归是直线分的也可以做多分类 ## 数学基础 import numpy as np np.pi # 三角函数 np.sin() np.cos() np.tan() # 指数 y3**x # 对数 np.log10(10) np.log2(2) np.e np.log(np.e) #ln(e)# 对数运算 # log(AB) log(A) logB np.log(3*4)np.log(3)np.log(4) #…

HTML5+CSS3+移动web——HTML 基础

目录 一、标签语法 HTML的基本框架 1. 标题标签 2. 段落标签 3. 换行和水平线 4. 文本格式化标签 5. 图像标签 6. 路径 相对路径 绝对路径 7. 超链接标签 8. 音频 9. 视频 10. 注释 二、标签结构 一、标签语法 HTML 超文本标记语言——HyperText Markup Langua…

【大数据Hive】hive 表设计常用优化策略

目录 一、前言 二、hive 普通表查询原理 2.1 操作演示说明 2.1.1 创建一张表&#xff0c;并加载数据 2.1.2 统计3月24号的登录人数 2.1.3 查询原理过程总结 2.2 普通表结构带来的问题 三、hive分区表设计 3.1 区表结构 - 分区设计思想 3.2 操作演示 3.2.1 创建分区表…

如何使用六图一表七种武器

六图一表七种武器用于质量管理&#xff1a; 描述当遇到问题时应该用那张图来解决&#xff1a; 一、如果题目说出了质量问题需要找原因&#xff1f; 解&#xff1a;用因果图&#xff0c;因果图也称石川图或鱼骨图 二、如果要判断过程是否稳定受控&#xff1f; 解&#xff1a…

谷歌浏览器,如何将常用打开的网站创建快捷方式到电脑桌面?

打开谷歌浏览器&#xff0c;打开想要创建的快捷方式的网页 点击浏览器右上角的三个点&#xff1a; 点击选择【更多工具】 选择【创建快捷方式】 然后&#xff0c;在浏览器上方会弹出一个框&#xff0c;让命名此创建的快捷方式的名称 命名好之后&#xff0c;再点击【创…

Python-web自动化-Playwright的学习

Python-web自动化-Playwright的学习 1. 安装playwright2. 界面等待3. 自动化代码助手4. 定位元素1. css selector定位2. xpath定位3. get_by_XXX定位 5. 操作元素1. 单选框、复选框2. select下拉框3. 网页操作4. 框架页 frame5. 窗口切换6. 截屏 1. 安装playwright pip命令 pi…

【Windows】常用快捷键

文章目录 文本编辑相关快捷键窗口管理和操作系统快捷键浏览器快捷键其他常用快捷键系统无响应快捷键 快捷键&#xff1a;shortcut key、keyboard shortcuts。 文本编辑相关快捷键 这部分是非常常用的内容&#xff0c;在很多编辑器中都适用的&#xff0c;比如csdn的markdown和t…

Python 数据分析库之polars使用详解

概要 数据分析是现代应用程序和业务决策的关键组成部分。Python 作为一门强大的编程语言,拥有丰富的数据处理库和工具,其中之一就是 Polars。Polars 是一个现代化的数据操作和分析库,它提供了高性能的数据操作功能,支持链式方法调用,并且兼容 Pandas 和 Arrow 格式。本文…

每日一练——月落乌啼算钱

题目&#xff1a; 举例&#xff1a; 输入&#xff1a;6&#xff0c;输出&#xff1a;8.00 最开始看到这道题还有点蒙&#xff0c;但是看到他的公式想起了斐波那契数列 1,1,2,3,5,8...... 由前两个数相加得到第三个数&#xff0c;为An2An1An。 可以得出这个题目中所给的通项就…

Hive的Join连接、谓词下推

前言 Hive-3.1.2版本支持6种join语法。分别是&#xff1a;inner join&#xff08;内连接&#xff09;、left join&#xff08;左连接&#xff09;、right join&#xff08;右连接&#xff09;、full outer join&#xff08;全外连接&#xff09;、left semi join&#xff08;左…

猫头虎分享:localhost和127.0.0.1的区别是什么?

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Java+SpringBoot构建智能捐赠管理平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

(AtCoder Beginner Contest 334) --- F - Christmas Present 2 -- 题解

F - Christmas Present 2 F - Christmas Present 2 题目大意&#xff1a; 思路解析&#xff1a; 因为他是顺序前往每个孩子的家&#xff0c;前往时必须要带一个礼物&#xff0c;并且最多只能带k个礼物&#xff0c;所以它每次前往最多k个孩子之后就要回到初始点重新出发。…

linux应用 进程间通信之消息队列(POSIX)

1、前言 1.1 定义 POSIX消息队列是Linux中一种进程间通信机制&#xff0c;允许进程通过发送和接收消息来交换数据。这些消息在队列中按优先级顺序存储和传递。 1.2 应用场景 当多个进程需要共享或交换数据时。实现进程间的解耦和异步通信。作为缓冲区&#xff0c;处理速度不…

剑指offer——二进制中1的个数

目录 1. 题目描述2. 可能引起死循环的想法3. 改进后的代码4. 给面试官惊喜的代码 1. 题目描述 请实现一个函数&#xff0c;输入一个整数&#xff0c;输出该数二进制表示中1的个数。例如把9表示成二进制位1001&#xff0c;有2位是1&#xff0c;因此如果输入9&#xff0c;该函数输…

Javaweb之SpringBootWeb案例之AOP概述及入门的详细解析

2.1 AOP概述 什么是AOP&#xff1f; AOP英文全称&#xff1a;Aspect Oriented Programming&#xff08;面向切面编程、面向方面编程&#xff09;&#xff0c;其实说白了&#xff0c;面向切面编程就是面向特定方法编程。 那什么又是面向方法编程呢&#xff0c;为什么又需要面向…

概率论中不确定性的来源-简单不确定的规则

更多AI技术入门知识与工具使用请看下面链接&#xff1a; https://student-api.iyincaishijiao.com/t/iNSVmUE8/

openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存

文章目录 openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存217.1 查看内存状况217.2 性能参数分析 openGauss学习笔记-217 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-内存 获取openGauss节点的CPU、内存、I/O和网络资源使用情况&…

酒店押金预授权怎么开通?微信酒店押金+房态+门锁关联 +电子押金单 解决方案

一、酒店押金管理有哪些&#xff1f; 1.渠道有银行预授权 2.微信押金支付 3.酒店押金系统 4.支付押金管理 二、银行预授权模式 酒店押金预授权通常是在客人办理入住时进行的&#xff0c;酒店会要求客人提供信用卡或借记卡的卡号、有效期、持卡人姓名等信息&#xff0c;然后…