前端开发中的状态管理与网络请求封装

news2025/1/22 8:05:31

本文将对比 Vuex 和 Pinia 在状态管理中的使用,并介绍如何封装 Axios 进行网络请求。此外,我们还将讨论动态路由、404 页面跳转以及面包屑导航的实现。

话不多说,正文开始~~~

一、状态管理:Vuex 与 Pinia 对比

1. Vuex

Vuex 是 Vue.js 官方推荐的状态管理库,适用于 Vue2 和 Vue3。它的核心概念包括:

  • State:存储应用的状态数据。
  • Getters:从 State 中派生出一些状态,类似于计算属性。
  • Mutations:同步修改 State 的方法。
  • Actions:异步操作,通常用于提交 Mutations。
  • Modules:将 Store 分割成模块,便于管理大型应用的状态。

2. Pinia

Pinia 是 Vue3 推荐的状态管理库,相较于 Vuex,它更加轻量且易于使用。Pinia 的核心特点包括:

  • 更简单的 API:Pinia 的 API 更加简洁,去除了 Vuex 中的 Mutations,直接使用 Actions 进行同步和异步操作。
  • 更好的 TypeScript 支持:Pinia 天生支持 TypeScript,提供了更好的类型推断和代码提示。
  • 模块化:Pinia 自动支持模块化,无需手动划分模块。

3. 使用 Pinia 实现跨组件状态管理

以下是一个简单的 Pinia 示例:

  1. 安装 Pinia

    npm install pinia
    
  2. 创建 Store
    src/stores 目录下创建 userStore.js

    import { defineStore } from 'pinia';
    
    export const useUserStore = defineStore('user', {
      state: () => ({
        userInfo: null,
        isLoggedIn: false,
      }),
      actions: {
        login(userInfo) {
          this.userInfo = userInfo;
          this.isLoggedIn = true;
        },
        logout() {
          this.userInfo = null;
          this.isLoggedIn = false;
        },
      },
    });
    
  3. 在组件中使用 Store

    <script setup>
    import { useUserStore } from '@/stores/userStore';
    
    const userStore = useUserStore();
    
    const handleLogin = () => {
      userStore.login({ name: 'John Doe' });
    };
    
    const handleLogout = () => {
      userStore.logout();
    };
    </script>
    
    <template>
      <div>
        <p v-if="userStore.isLoggedIn">Welcome, {{ userStore.userInfo.name }}</p>
        <button @click="handleLogin">Login</button>
        <button @click="handleLogout">Logout</button>
      </div>
    </template>
    

二、封装 Axios 进行网络请求

在实际项目中,我们通常会对 Axios 进行封装,以便统一处理请求和响应。以下是一个简单的 Axios 封装示例:

  1. 安装 Axios

    npm install axios
    
  2. 创建 Axios 实例
    src/utils 目录下创建 request.js

    import axios from 'axios';
    
    const instance = axios.create({
      baseURL: process.env.VITE_API_BASE_URL,
      timeout: 10000,
    });
    
    instance.interceptors.request.use(
      (config) => {
        const token = localStorage.getItem('token');
        if (token) {
          config.headers.Authorization = `Bearer ${token}`;
        }
        return config;
      },
      (error) => {
        return Promise.reject(error);
      }
    );
    
    instance.interceptors.response.use(
      (response) => {
        return response.data;
      },
      (error) => {
        return Promise.reject(error);
      }
    );
    
    export default instance;
    
  3. 在组件中使用封装后的 Axios

    import request from '@/utils/request';
    
    const fetchUserData = async () => {
      try {
        const response = await request.get('/api/user');
        console.log(response);
      } catch (error) {
        console.error(error);
      }
    };
    

三、登录鉴权与动态路由

在后台管理系统中,登录鉴权和动态路由是常见的需求。以下是实现这些功能的步骤:

1. 动态路由

  • 动态添加路由:根据用户的权限动态加载路由,使用 addRoute 方法动态添加路由。
  • 404 页面跳转:如果没有匹配的路由,跳转到 404 页面。

2. 面包屑导航

面包屑导航可以帮助用户了解当前页面的位置。可以通过路由的 meta 信息动态生成面包屑。

以下是一个简单的实现示例:

  1. 动态路由与 404 页面

    import { createRouter, createWebHistory } from 'vue-router';
    
    const routes = [
      {
        path: '/',
        component: () => import('@/views/Home.vue'),
      },
      {
        path: '/login',
        component: () => import('@/views/Login.vue'),
      },
      {
        path: '/:pathMatch(.*)*',
        component: () => import('@/views/NotFound.vue'),
      },
    ];
    
    const router = createRouter({
      history: createWebHistory(),
      routes,
    });
    
    router.beforeEach((to, from, next) => {
      const isLoggedIn = localStorage.getItem('token');
      if (to.path !== '/login' && !isLoggedIn) {
        next('/login');
      } else {
        next();
      }
    });
    
    export default router;
    ```![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/bb1e899be70845dc9c1a98246113d393.webp#pic_center)
    
    
    
  2. 面包屑导航

    <script setup>
    import { useRoute } from 'vue-router';
    
    const route = useRoute();
    const breadcrumbs = computed(() => {
      return route.matched.map((record) => ({
        text: record.meta.breadcrumb,
        path: record.path,
      }));
    });
    </script>
    
    <template>
      <div>
        <nav>
          <span v-for="(crumb, index) in breadcrumbs" :key="index">
            <router-link :to="crumb.path">{{ crumb.text }}</router-link>
            <span v-if="index < breadcrumbs.length - 1"> / </span>
          </span>
        </nav>
      </div>
    </template>
    

四、HTTP 与 HTTPS

  • 1. HTTP
    HTTP(HyperText Transfer Protocol)是用于传输超文本的应用层协议。它是明文传输的,容易被中间人攻击。

  • 2. HTTPS
    HTTPS(HyperText Transfer Protocol Secure)是 HTTP 的安全版本,通过 SSL/TLS 加密传输数据,防止数据被窃取或篡改。

3. 使用 HTTPS

  • 获取 SSL 证书:可以从证书颁发机构(CA)获取 SSL 证书,或者使用 Let’s Encrypt 免费获取。
  • 配置服务器:在服务器上配置 SSL 证书,启用 HTTPS。
  • 前端配置:确保前端请求的 API 地址使用 HTTPS。

五、总结

通过对比 Vuex 和 Pinia,我们可以看到 Pinia 在 Vue3 中更加简洁和高效。封装 Axios 可以帮助我们统一处理网络请求,提高代码的可维护性。

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

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

相关文章

AI 大爆发时代,音视频未来路在何方?

AI 大模型突然大火了 回顾2024年&#xff0c;计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程&#xff1a; 萌芽期&#xff1a;&#xff08;1950-2005&#xff09; 1956年&#xff1a;计算机专家约翰麦卡锡首次提出“人工智能”概念&#xff0c;标志…

OpenEuler学习笔记(三):为什么要搞OpenEuler?

为什么要搞OpenEuler&#xff1f; 技术自主可控需求 在信息技术领域&#xff0c;操作系统是关键的基础软件。过去&#xff0c;很多关键技术被国外厂商掌控&#xff0c;存在技术“卡脖子”的风险。OpenEuler的出现可以为国内提供一个自主可控的操作系统选择。例如&#xff0c;在…

linux下的NFS和FTP部署

目录 NFS应用场景架构通信原理部署权限认证Kerberos5其他认证方式 命令serverclient查看测试系统重启后自动挂载 NFS 共享 高可用实现 FTP对比一些ftp服务器1. **vsftpd (Very Secure FTP Daemon)**2. **ProFTPD (Professional FTP Daemon)**3. **Pure-FTPd**4. **WU-FTPD (Was…

STM32-keil安装时遇到的一些问题以及解决方案

前言&#xff1a; 本人项目需要使用到STM32,故需配置keil 5&#xff0c;在配置时遇到了以下问题&#xff0c;并找到相应的解决方案&#xff0c;希望能够为遇到相同问题的道友提供一些解决思路 1、提示缺少&#xff08;missing&#xff09;version 5编译器 step1&#xff1a;找…

mfc操作json示例

首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…

AI可信论坛亮点:合合信息分享视觉内容安全技术前沿

前言 在当今科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活与工作方式。作为AI领域的重要盛会&#xff0c;CSIG青年科学家会议AI可信论坛汇聚了众多青年科学家与业界精英&#xff0c;共同探讨AI技术的最新进展、挑…

调试Hadoop源代码

个人博客地址&#xff1a;调试Hadoop源代码 | 一张假钞的真实世界 Hadoop版本 Hadoop 2.7.3 调试模式下启动Hadoop NameNode 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中设置NameNode启动的JVM参数&#xff0c;如下&#xff1a; export HADOOP_NAMENODE_OPTS"-Xdeb…

Ability Kit-程序框架服务(类似Android Activity)

文章目录 Ability Kit&#xff08;程序框架服务&#xff09;简介Stage模型开发概述Stage模型应用组件应用/组件级配置UIAbility组件概述概述声明配置 生命周期概述生命周期状态说明Create状态WindowStageCreate**和**WindowStageDestroy状态WindowStageWillDestroy状态Foregrou…

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…

哈尔滨有双线服务器租用吗?

哈尔滨有双线服务器租用吗&#xff1f;双线服务器是一种针对哈尔滨特有的网络环境优化的服务器解决方案&#xff0c;它能够同时支持中国电信和中国联通或移动其中两家主要ISP&#xff08;互联网服务提供商&#xff09;的连接。 由于中国南方地区多采用电信网络&#xff0c;而北…

三天急速通关Java基础知识:Day1 基本语法

三天急速通关JAVA基础知识&#xff1a;Day1 基本语法 0 文章说明1 关键字 Keywords2 注释 Comments2.1 单行注释2.2 多行注释2.3 文档注释 3 数据类型 Data Types3.1 基本数据类型3.2 引用数据类型 4 变量与常量 Variables and Constant5 运算符 Operators6 字符串 String7 输入…

JVM 面试八股文

目录 1. 前言 2. JVM 简介 3. JVM 内存划分 3.1 为什么要进行内存划分 3.2 内存划分的核心区域 3.2.1 核心区域一: 程序计数器 3.2.2 核心区域二: 元数据区 3.2.3 核心区域三: 栈 3.2.4 核心区域四: 堆 4. JVM 类加载机制 4.1 类加载的步骤 4.1.1 步骤一: 加载 4…

《AI赋能中国制造2025:智能变革,制造未来》

引言&#xff1a;开启智能制造新时代 在全球制造业格局深度调整的当下&#xff0c;科技变革与产业转型的浪潮汹涌澎湃。2015 年&#xff0c;我国重磅推出《中国制造 2025》这一宏伟战略&#xff0c;它如同一座灯塔&#xff0c;为中国制造业驶向高端化、智能化、绿色化的彼岸指明…

Observability:最大化可观察性 AI 助手体验的 5 大提示(prompts)

作者&#xff1a;来自 Elastic Zoia_AUBRY 在过去三年担任客户工程师期间&#xff0c;我遇到了数百名客户&#xff0c;他们最常问的问题之一是&#xff1a;“我的数据在 Elastic 中&#xff1b;我该如何利用它获得最大优势&#xff1f;”。 如果这适用于你&#xff0c;那么本…

Mysql常见问题处理集锦

Mysql常见问题处理集锦 root用户密码忘记&#xff0c;重置的操作(windows上的操作)MySQL报错&#xff1a;ERROR 1118 (42000): Row size too large. 或者 Row size too large (&#xff1e; 8126).场景&#xff1a;报错原因解决办法 详解行大小限制示例&#xff1a;内容来源于网…

【前端】用OSS增强Hexo的搜索功能

文章目录 前言配置 _config.fluid.yml云端实时更新 local-search.xml解决 OSS.Bucket 的跨域问题 前言 原文地址&#xff1a;https://blog.dwj601.cn/FrontEnd/Hexo/hexo-enhance-local-search-with-oss/ 考虑到某著名云服务商提供的云服务器在两年的 99 计划后续费价格高达四…

ROS2 与机器人视觉入门教程(ROS2 OpenCV)

系列文章目录 前言 由于现有的ROS2与计算机视觉&#xff08;特别是机器人视觉&#xff09;教程较少&#xff0c;因此根据以往所学与积累的经验&#xff0c;对ROS2与机器人视觉相关理论与代码进行分析说明。 本文简要介绍了机器人视觉。首先介绍 ROS2 中图像发布者和订阅者的基…

02内存结构篇(D1_自动内存管理)

目录 一、内存管理 1. C/C程序员 2. Java程序员 二、运行时数据区 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. Java堆 5. 方法区 运行时常量池 三、Hotspot运行时数据区 四、分配JVM内存空间 分配堆的大小 分配方法区的大小 分配线程空间的大小 一、内存管…

C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程

通过本课程的学习&#xff0c;你可以掌握C#编程的重点&#xff0c;享受编程的乐趣。 在本课程之前&#xff0c;你无需具备任何C#的基础知识&#xff0c;只要能操作电脑即可。 不过&#xff0c;希望你的数学不是体育老师教的。好的程序是数理化的实现与模拟。没有较好的数学基础…

BGP边界网关协议(Border Gateway Protocol)路由引入、路由反射器

一、路由引入背景 BGP协议本身不发现路由&#xff0c;因此需要将其他协议路由&#xff08;如IGP路由等&#xff09;引入到BGP路由表中&#xff0c;从而将这些路由在AS之内和AS之间传播。 BGP协议支持通过以下两种方式引入路由&#xff1a; Import方式&#xff1a;按协议类型将…