Vue3最佳实践 第六章 Pinia,Vuex与axios,VueUse 2(Vuex)

news2024/11/22 8:57:55

Vuex 状态管理

  Vuex 是一种集中管理所有组件中数据的机制。它和Pinia一样都是解决使用 props 和 $emit 事件在组件之间传递数据时,当组件之间频繁传递,层级增加时管理数据就变得困难。Vue 的官方状态管理库已更改为Pinia,Pinia 具有与 Vue 几乎完全相同它还增强的很多API的功能。Vuex 虽然仍在维护中,但是它不会在添加的新功能了,Vuex 应用程序迁移到 Pinia它可能会是一个更好的选择。在这里我们还会讲解一下Vuex 的使用方法,以方便大家在迁移Vuex的时候更加方便。Vuex官网https://vuex.vuejs.org/

创建项目后,进入项目文件夹,执行npm install命令安装vuex

第一章 Vue3项目创建 1 Vue CLI 创建vue项目
第一章 Vue3项目创建 2 使用 Webpack 5 搭建 vue项目
第一章 Vue3项目创建 3 Vite 创建 vue项目
第二章 Vue3 基础语法指令
第三章 Vue Router路由器的使用
第四章 VUE常用 UI 库 1 ( element-plus,Ant ,naiveui,ArcoDesign)
第四章 VUE常用 UI 库 2 ( ailwind 后台框架)
第五章 Vue 组件应用 1( Props )
第五章 Vue 组件应用 2 ( Emit )
第五章 Vue 组件应用 3( Slots )
第五章 Vue 组件应用 4 ( provide 和 inject )
第五章 Vue 组件应用 5 (Vue 插件)
第六章 Pinia,Vuex与axios,VueUse 1(Pinia)
第六章 Pinia,Vuex与axios,VueUse 2(Vuex)
第六章 Pinia,Vuex与axios,VueUse 3(VueUse)
第六章 Pinia,Vuex与axios,VueUse 4(axios)

npm install vuex@next --save

安装完vuex后,可以通过查看package.json来查看安装的vuex版本。

  "dependencies": {
    "pinia": "^2.0.28",
    "vue": "^3.2.45",
    "vuex": "^4.0.2"
  },

在创建main.js中创建一个vuex对象作为全局的数据管理器,将这个vuex对象app.use到Vue项目中。

import { createApp } from 'vue'
import App from './App.vue'
import { createStore } from "vuex";
//vuex中的数据保存环境
const store = createStore({
    state: {
        message: '我是你第条Vuex数据'
    },
    mutations: {
    },
    actions: {
    },
    modules: {
    }
});
const app = createApp(App)
app.use(store)
app.mount('#app')

Vuex中的这三个属性state,Getters,Actions在Pinia中都有了解过,Mutations,Modules在后边会有所介绍。

1Vuex 使用

  我们在App.vue中模板中使用** s t o r e . s t a t e . m e s s a g e ∗ ∗ 可以获得 V u e x 中保存的共享数据 m e s s a g e 值。项目中所有的其他组件都可以使用 store.state.message **可以获得Vuex中保存的共享数据message值。项目中所有的其他组件都可以使用 store.state.message可以获得Vuex中保存的共享数据message值。项目中所有的其他组件都可以使用store共享数据中的值。

<script setup>
import VuexIndex from "./components/VuexIndex.vue"
</script>
<template>
   <div id="app">
    <h1>学习与使用Vuex </h1>
    <h4>{{ $store.state.message }}</h4>
   </div>
   <VuexIndex></VuexIndex>
</template>

在components文件夹中创建一个VuexIndex.vue组件,在组件中使用useStore 解构方法获得Vuex中的数据内容。

<script setup>
 import { useStore } from 'vuex';
 const store = useStore();
</script>
<template>
    <h1>VuexIndex子组件</h1>
{{store}}
</template>

  在浏览器上显示学习与“使用Vuex 的内容”和store对象中的内容,说明我们保存在Vuex中的共享数据生效了。

在这里插入图片描述

Vuex 共享和管理数据,因此可以从任何组件以相同的方式访问它

方法与对象说明使用方法
createStore创建数据共享器import { createStore } from “vuex”
useStore获得数据共享器import { useStore } from ‘vuex’
$store模板中获得数据共享对象$store.state.属性

2 Vuex 基础属性

Vuex 中主要是操作States,Actions、Mutations和getters属性的。

在这里插入图片描述

  在项目中的store文件夹中下创建vuexIndex.js文件,我们将main.js文件中创建createStore部分的代码移植到vuexIndex.js文件中,在vuexIndex.js文件中来实现store数据共享器的功能。

import { createStore } from "vuex";
//vuex中的数据环境
export const store = createStore({
    state: {
        message: '我是你第一个Vuex数据'
    },
    mutations: {
    },
    actions: {
    },
    modules: {
    }
});

  修改main.js中的代码使用引入的方法引入store对象,使用vue组件use方法加入store数据共享器到整个项目环境中。

import { createApp } from 'vue'
import App from './App.vue'
import {store} from './stores/vuexIndex'
const app = createApp(App)
app.use(store)
app.mount('#app')

1 state值设置

  现在让我们使用 Vuex来 装入一个用户列表集合,在 store\vuexIndex.js 文件中store对象中的state加入用户列表信息。

import { createStore } from "vuex";
//vuex中的数据环境
export const store = createStore({
    state: {
        message: '我是你第一个Vuex数据',
        users:[
            {name: 'zhtbs', dept:'部门一', post:"经理",id:1},
            {name: 'kimy', dept: '部门一',post:"工人",id:2},
            {name: 'linda', dept: '部门二',post:"工人",id:3}
          ]
    }
});

  在子组件中VuexIndex.vue中使用store.state属性将它内面的users集合绑定都模板中v-for指令,将用户内容循环遍历出来。

<script setup>
 import { useStore } from 'vuex';
 const store = useStore();
</script>
<template>
    <h1>VuexIndex子组件</h1>
 <ul>
 <li v-for="user in store.state.users">
     名称:{{ user.name }} 
     部门:{{ user.dept }} 
     职务:{{ user.post }}
  </li>
  </ul>
</template>

2 getters设置

import { createStore } from "vuex";
//vuex中的数据环境
export const store = createStore({
    ......
    getters: {
        //统计
        Countusers : function(state){
            return state.users.length;
        }
    }
});
<script setup>
 import { useStore } from 'vuex';
 const store = useStore();
  // 获得用户列表数量
 let count=store.getters.Countusers;
</script>
<template>
    <h1>VuexIndex子组件</h1>
 <ul>
  	<li v-for="user in store.state.users">
        名称:{{ user.name }} 
        部门:{{ user.dept }} 
        职务:{{ user.post }}
    </li>
  </ul>
  <h3>列表数量:{{count}}</h3>
</template>

  它只能在被描述为计算属性的组件中使用。如果你想在其他组件中做同样的处理,你需要为每个组件编写相同的代码。但是,如果您使用 Getters,它们将存储在 Vuex 存储中,因此您可以以相同的方式从其他组件使用它们。

3 mutations动作

​ Vuex 中的mutations属性中是定义修改state 值的方法。在Vue 组件中引入store对象,通过执行store对象中mutations方法来修改store对象中state的值。

mutations 方法默认第一参数是state

mutations: {
increment : function(state) {
}
}

  修改vuexIndex.js代码在store对象中的mutations属性下创建方法increment,在这个方法中使用方法参数state,这个参数state就是整个store中的state,将state中count值进行累加。

import { createStore } from "vuex";
//vuex中的数据环境
export const store = createStore({
    state: {
        count: 0,
    },
    //更新动作
    mutations: {
        increment : function(state) {
          state.count++
        }
      },
      actions: {
      }
});

  Vuex 存储状态的改变方法是定义在mutations属性中动作,在组件中useStore对象使用commit函数触发mutations动作事件。大家都能理解state中的数据更新都是通过mutations属性中的动作来完成的。
  在App.vue中代码中按钮中绑定increment事件,在increment事件中使用commit方法执行store中的increment方法,increment方法功能是store对象state值count累计加1。

<script setup>
import VuexIndex from './components/VuexIndex.vue'
import { useStore } from 'vuex';
 const store = useStore();
const increment=()=>{
   store.commit('increment')
}
</script>
<template>
 <h1>学习与使用Vuex </h1>
 <button v-on:click="increment">count  累计+1</button>
 <h1>Count:{{ this.$store.state.count }}</h1>
</template>

在浏览中看到的结果是。

在这里插入图片描述

4 Actions 更新

​  Vuex 也提供别外一种用于更新状态值的函数 Actions。Actions与 mutations 功能一样都是用于更新状态state中的值,但有这两个属性也是有所区别的。

  1. Actions是通过mutations 来更新state中的值, 而不是自己直接改变state中状态。
  2. Actions操作可以包括异步处理功能。

  在VuexIndex.js文件中创建actions属性,在actions属性中写入actionszht方法,在actionszht方法完成执行计算器累加功能。
  actionszht方法中会传入一个context参数,context参数是Store对象中的全局环境,使用这个context全局环境的commit方法将mutations属性中的increment方法加入进来。
actionszht方法就可以使用mutations中的increment方法进行计数器累加功能了。

import { createStore } from "vuex";
//vuex中的数据环境
export const store = createStore({
    state: {
        count: 0,
    }, 
    mutations: {
        increment : function(state) {
          state.count++
        }
      },
      actions: {
        actionszht: function(context){
            context.commit('increment')
        }
      }
});

  让我们在 App.vue 中加入这个的 actionszht 方法,进行计数器累加工作。Commit 用于执行 mutation,而 dispatch 方法用于执行 action。

<script setup>
import { useStore } from 'vuex';
const store = useStore();
const increment=()=>{
   store.dispatch('actionszht')
}
</script>
<template>
  <button v-on:click="increment">count增加1</button>
  <h1>Count:{{ this.$store.state.count }}</h1>
</template>

除了 state 和 commit 之外,context 还可以使用 dispatch 和 getters 方法。

Actions异步处理

  异步处理常用于使用axios从服务器获取数据等情况。如果使用setTimeout函数获取图像进行异步处理,处理过程如下。3 秒后,突变增量被执行,计数增加 1。

actions: {
	incrementOne: function(context){
	    setTimeout(() => {
	      context.commit('increment')
	    }, 3000)
	}
}

  通过到目前为止的解释,我们已经解释了下图中所有的Actions、Mutations和States。如果你能看懂下图,我想你差不多能理解 Vuex 的概念了。

  为了检查您的理解,让我们根据文档中经常出现的计数示例,按照下图中的流程进行操作。

##3 Vuex 模块化

  至此,Vuex 中存储的状态、突变、动作和 getter 都存储在 store\index.js 文件中。如果你的应用很小,你可以只用 index.js 文件来管理 Vuex 状态,但是随着应用的增长,代码量会越来越大,变得难以管理。
  Vuex 允许模块化。模块化允许您根据文件的功能分离文件。例如,如果您的应用程序具有用户身份验证功能,请创建一个名为 user.js 的单独文件。为每个函数分离文件使代码管理更容易。

在 store 文件夹下创建一个 modules 文件夹,并创建一个 user.js 文件。

export const user = {
  namespaced: true,
  state: {
    user: null,
  },
  mutations: {
    setUser(state, payload) {
      state.user = payload;
    },
  },
  actions: {
    login({ commit }) {
    //登录业务
    },
    goout({ commit }) {
    //退出业务
    },
  },
  getters:{
  },
};

创建的用户模块可以在 store\index.js 文件中设置,如下所示。

import { createStore } from "vuex";
import user from "./user";
//vuex中的数据环境
export const store = createStore({
  modules: {
    //导入模板到主模块中
    user,
  },
    state: {
    },
    getters: {
    },
    mutations: {
    },
    actions: {
    }
});

访问时为$store.state.user.user。此外,如果您想通过调度执行登录处理,它将是 dispatch(‘user/login’)。由于设置了 namespaced: true ,它变成了 user/login 而不是 login,并且可以使用命名空间设置操作。如果未设置 namespaced,它将是 dispatch(‘login’)。

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

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

相关文章

微信小程序-1

微信开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ 报错在调试器的console里找 一、结构 Ctrl 放大字体 Ctrl - 缩小 设置 - - - 外观设置 - - - 可以修改喜欢的主题颜色 index.js index.json index.wxml 》 html <view class"box&qu…

【kubernetes】kubernetes中的StatefulSet使用

TOC 1 为什么需要StatefulSet 常规的应用通常使用Deployment&#xff0c;如果需要在所有机器上部署则使用DaemonSet&#xff0c;但是有这样一类应用&#xff0c;它们在运行时需要存储一些数据&#xff0c;并且当Pod在其它节点上重建时也希望这些数据能够在重建后的Pod上获取&…

Python爬虫案例入门教程(纯小白向)——夜读书屋小说

Python爬虫案例——夜读书屋小说 前言 如果你是python小白并且对爬虫有着浓厚的兴趣&#xff0c;但是面对网上错综复杂的实战案例看也看不懂&#xff0c;那么你可以尝试阅读我的文章&#xff0c;我也是从零基础python开始学习爬虫&#xff0c;非常清楚在过程中所遇到的困难&am…

字符编码的了解

前言&#xff1a; 在编写文件读取功能的过程中&#xff0c;我遭遇了一个棘手的乱码难题。经过细致的排查&#xff0c;发现这一问题的根源在于文件的字符编码。为了帮助大家有效地克服编码差异所带来的开发挑战&#xff0c;因此&#xff0c;我收集了字符集编码的相关知识&#x…

想要精通算法和SQL的成长之路 - 旋转链表

想要精通算法和SQL的成长之路 - 旋转链表 前言一. 旋转链表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 旋转链表 原题链接 由于k的大小可能超过链表长度&#xff0c;因此我们需要根据链表长度取模。那么我们首先需要去计算链表的长度是多少&#xff1a; if (head …

C# GraphicsPath 类学习

先在窗体放2个picturebox&#xff0c; 然后看一下如下代码&#xff1b; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; us…

Pytorch基础:Tensor的transpose方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;transpose是Tensor的一个重要方法&#xff0c;同时它也是一个torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.transpo…

window安装压缩版postgresql

环境&#xff1a; window 11 专业版postgresql-16.0-1-windows-x64-binaries.zip 一、下载 1.1 从官网下载 https://www.postgresql.org/download/windows/ 1.2 从百度网盘下载 链接&#xff1a;https://pan.baidu.com/s/1fmQbgWSzX4hN07Lgdzfz0g?pwddzyy 提取码&#…

汇编语言王爽第4版实验8答案(和你想的不一样)

实验8 分析一个奇怪的程序 E:\mywork\asm\p906.asm C:\>edit p906.asm assume cs:codecode segmentmov ax,4c00hint 21h start: mov ax,0 s:nop ; nop的机器码占一个字节nopmov di, offset smov si, offset s2mov ax, cs:[si]mov cs:[di],ax s0:jmp short s s1:mov ax,0in…

tauri为窗口添加阴影效果

需求 为窗口添加阴影效果&#xff0c;让窗口显得更立体。 实现方案 通过 tauri 中的 window-shadows 依赖实现。 编码 修改 label 标签内容 修改 src-tauri/tauri.conf.json 文件&#xff0c;设置 label 字段为 “customization” 增加shadows的依赖 修改 src-tauri…

第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项

视频教程汇总帖&#xff1a;【学以致用&#xff0c;授人以渔】2023视频教程汇总&#xff0c;DSP第12期&#xff0c;ThreadX第8期&#xff0c;BSP驱动第26期&#xff0c;USB实战第5期&#xff0c;GUI实战第3期&#xff08;2023-10-01&#xff09; - STM32F429 - 硬汉嵌入式论坛 …

函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系

1.函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系 1.1 傅里叶级数中的系数公式推导 我们先来推导一下傅里叶级数中的系数公式&#xff0c;其实笔者已经写过一篇相关笔记&#xff0c;详见&#xff1a;为什么要把一个函数分解成三角函数?(傅利叶级数) f ( x )…

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…

【数据结构】HashSet的底层数据结构

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 HashSet 一、 HashSet 集合的底层数据结构二…

GraphPad Prism 10 for Mac(统计分析绘图软件)

GraphPad Prism是一款专业的统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。 以下是 GraphPad Prism 的主要功能和特点&#xff1a; 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数…

RFID与人工智能的融合:物联网时代的智能化变革

随着物联网技术的不断发展&#xff0c;现实世界与数字世界的桥梁已经被打通。物联网通过各种传感器&#xff0c;将现实世界中的光、电、热等信号转化为有价值的数据。这些数据可以通过RFID技术进行自动收集和传输&#xff0c;然后经由人工智能算法进行分析、建模和预测&#xf…

【LeetCode算法系列题解】第76~80题

CONTENTS LeetCode 76. 最小覆盖子串&#xff08;困难&#xff09;LeetCode 77. 组合&#xff08;中等&#xff09;LeetCode 78. 子集&#xff08;中等&#xff09;LeetCode 79. 单词搜索&#xff08;中等&#xff09; LeetCode 76. 最小覆盖子串&#xff08;困难&#xff09; …

Java下正面解除警告Unchecked cast: ‘java.lang.Object‘ to ‘java.util.ArrayList‘

就是我在反序列化时&#xff0c;遇到这样一个警告&#xff1a; Unchecked cast: java.lang.Object to java.util.ArrayList<com.work1.Student>然后我去网上查&#xff0c;有些人说用SuppressWarnings(“unchecked”)去忽略警告&#xff0c;但是我觉得作为一名合格的程序…

SNERT预备队招新CTF体验赛-Web(SWCTF)

目录 1、F12 2、robots 3、game1-喂青蛙 4、game 2 - flap bird 5、game 3 - Clash 6、Get&Post 7、sql &#xff08;1&#xff09;手工注入 &#xff08;2&#xff09;工具注入 8、命令执行漏洞 9、文件上传漏洞 10、文件泄露 11、php反序列化漏洞 12、PHP绕…

【网络编程】UDP数据报套接字编程和TCP流套接字编程

文章目录 1. 网络编程基础1.1 为什么需要网络编程&#xff1f;1.2 网络编程是什么&#xff1f;1.3 概念 2. Socket套接字3. UDP数据报套接字编程3.1 DatagramSocket API3.2 DatagramPacket API3.3 InetSocketAddress API 4. UDP构建服务端客户端&#xff08;一发一收&#xff0…