VUE2项目:尚品汇-axios二次封装请求以及VUEX的状态管理库

news2024/11/26 19:22:28

上一篇:VUE2项目:尚品汇VUE-CLI脚手架初始化项目以及路由组件分析(一)

目录

    • axios二次封装
    • API接口管理与解决跨域
      • API接口管理
      • nprogress进度条配置
    • VUEX状态管理库
    • 三级分类动态背景颜色
    • 防抖
    • 三级联动跳转路由分析

axios二次封装

项目需要使用到请求与响应的拦截器,分别在请求前与响应后做一些请求的响应处理,使用request.js文件对axios进行封装,前提是需要安装axios

安装:npm install --save axios

在这里插入图片描述
request.js全局封装

import axios from "axios";

// 引入进度条
import nprogress from 'nprogress';
// 引入进度条样式
import "nprogress/nprogress.css"

const requests = axios.create({
    //基础路径,发请求会带上api,每个路径的前缀
    baseURL: "/api",//对应vue.config文件里面的proxy代理
    //请求不能超过5S
    timeout: 5000,
});

//请求拦截器(可以在请求发出去之前,做一些事情)
requests.interceptors.request.use((config) => {
    //config.headers['Authorization'] = getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
    //响应成功,进度条开始
    nprogress.start();
    return config;
});
//响应拦截器(在数据返回之后,做一些事情)
requests.interceptors.response.use(
    (res) => {
        //响应成功,进度条结束
        nprogress.done();
        return res.data;
    },
    (err) => {
        //响应失败
        
        return Promise.reject(new Error("Fail"))

    }
);

// 对外暴露
export default requests;

API接口管理与解决跨域

API接口管理

API接口统一在api文件夹下的index.js进行管理

在这里插入图片描述
例如,获取三级分类的数据接口:

import requests from "./request"

// 获取商品三级分类数据
export const reqCategoryList = ()=>{
    return requests({
        url: "/product/getBaseCategoryList",
        method: "get"
    })
}

若仅仅发的是接口,还需要解决代理跨域问题,所谓的跨域问题就是前后端的访问地址的协议,域名,端口号有一个不一样就需要跨域,前端在vue全局配置文件vue.config.js进行配置:

module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false,
  // vue配置代理跨域
  devServer: {
    proxy: {
      '/api': {
        target: "http://gmall-h5-api.atguigu.cn",
      },
    }
  },
})

nprogress进度条配置

为了让用户更加直观的看到页面的加载情况,现引入nprogress插件。

效果如下:

在这里插入图片描述

安装:npm install --save nprogress

使用步骤很简单,引入进度条,引入样式,请求响应开始与结束时候调用方法即可。

在这里插入图片描述
可以调整进度条的颜色样式:

在这里插入图片描述

VUEX状态管理库

相当于一个仓库来集中管理组件中的数据,详细请参考vuex。

安装:npm install --save vuex

数据过多,可以使用vuex的模块化开发,将大仓库中放入各个模块下的数据。

在store文件夹下的index.js作为总的配置文件:

在这里插入图片描述
index.js:这里相当于一个大仓库,集成了其它小仓库中的数据,并对外暴露。

import Vue from "vue";

import Vuex from "vuex";
// 使用插件
Vue.use(Vuex)

import search from "./search";
import home from "./home";

// 对外暴漏
export default new Vuex.Store({
    modules: {
        home,
        search
    }
})

随后导入仓库并注册:

在这里插入图片描述

下面的步骤就是将之前的商品的三级分类存储到vuex仓库中,具体步骤如下:

导入接口

导入之前在api下定义的请求三级分类的接口:

在这里插入图片描述
actions中异步发送请求的方法。

在这里插入图片描述
mutations中去修改state

在这里插入图片描述
最后存储至仓库之中:

在这里插入图片描述
在对应的页面进行使用,从仓库中取出对应的数据:

import { mapState } from 'vuex';

在这里插入图片描述
数据进行展示:

    <div class="type-nav" @mouseenter="enterShow" @mouseleave="enterShowLeave()">
        <div class="container">
            <h2 class="all">全部商品分类</h2>

            <div @mouseleave="changeIndex(-1)">
                <transition name="sort">
                    <div class="sort" v-show="show">
                        <div class="all-sort-list2" @click="goSearch">
                            <div class="item bo" v-for="(c1, index) in categoryList" :key="c1.categoryId"
                                :class="{ cur: currentIndex == index }">
                                <h3 @mouseenter="changeIndex(index)">
                                    <a :data-categoryName="c1.categoryName" :data-category1Id="c1.categoryId">{{
                                        c1.categoryName
                                    }}</a>
                                    <!-- 声明式的跳转会卡顿 -->
                                    <!-- <router-link to="/search">{{ c1.categoryName }}</router-link> -->
                                </h3>
                                <div class="item-list clearfix">
                                    <div class="subitem" v-for="c2 in c1.categoryChild" :key="c2.categoryId">
                                        <dl class="fore">
                                            <dt>
                                                <a :data-categoryName="c2.categoryName" :data-category2Id="c2.categoryId">{{
                                                    c2.categoryName }}</a>
                                                <!-- <router-link to="/search">{{ c2.categoryName }}</router-link> -->
                                            </dt>
                                            <dd>
                                                <em v-for="c3 in c2.categoryChild" :key="c3.categoryId">
                                                    <a :data-categoryName="c3.categoryName"
                                                        :data-category3Id="c3.categoryId">{{
                                                            c3.categoryName }}</a>
                                                    <!-- <router-link to="/search">{{ c3.categoryName }}</router-link> -->
                                                </em>
                                            </dd>
                                        </dl>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </transition>
            </div>

            <nav class="nav">
                <a href="###">服装城</a>
                <a href="###">美妆馆</a>
                <a href="###">尚品汇超市</a>
                <a href="###">全球购</a>
                <a href="###">闪购</a>
                <a href="###">团购</a>
                <a href="###">有趣</a>
                <a href="###">秒杀</a>
            </nav>

        </div>
    </div>

三级分类动态背景颜色

我们希望鼠标在分类上移动时会有背景颜色的显示:
在这里插入图片描述
有两种方案,直接在导航栏中改样式即可:

在这里插入图片描述

或者使用导航的索引进行JS的方式进行控制,先声明变量:

data() {
    return {
        // 鼠标位置,用来实现鼠标移入三级联动的样式
        currentIndex: -1,
        show: true
    }
},

鼠标监听索引的方法,这里需要使用节流的方式,不然鼠标滑动的时候会有卡顿的现象。

所谓节流就是,连续触发事件但是在 n 秒中只执行一次函数。

导入我们所需要的节流函数:

import throttle from 'lodash/throttle';

使用:

在这里插入图片描述

定义样式是否展示的方法:

enterShow() {
    this.show = true;
},

对导航栏的样式进行监听:

在这里插入图片描述

可以使用JS来控制二三级的分类与隐藏:

在这里插入图片描述

防抖

触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新再次触发事件并延长触发的时间。

有些事件比如mousemove ,mousehover 等,我们需要做限制保证它们不被频繁的被触发。

三级联动跳转路由分析

点击三级路由跳转到对应的搜索页面,需要将一二三级的分类名称与ID带入路径参数中:

在这里插入图片描述

使用编程式导航+事件委派机制的方式实现:

点击对应的分类将分类的名称与ID带入路径参数中:

在这里插入图片描述

添加方法:

goSearch(event) {
    // 编程式导航+事件委派
    // 事件委派就是将所有的子节点的事件全部委托给父亲节点,点击a标签才会跳转
    // 事件委派会将所有的子节点交给父节点.data-categoryName区别为a标签
    // 获取到当前鼠标点击的标签
    let element = event.target;
    let { categoryname, category1id, category2id, category3id } = element.dataset;
    // 如果有categoryname则一定是a标签
    if (categoryname) {
        // 跳转路由的参数
        let location = { name: 'search' };
        let query = { categoryName: categoryname };
        // 区分一级,二级。三级a标签
        if (category1id) {
            query.category1Id = category1id;
        } else if (category2id) {
            query.category2Id = category2id;
        } else {
            query.category3Id = category3id;
        }
        // 判断,如果路由跳转,带有params参数,传递过去
        if (this.$route.params) {
            location.params = this.$route.params;
            location.query = query;
            this.$router.push(location);
        }
    }
},

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

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

相关文章

12链表-双指针

目录 LeetCode之路——21. 合并两个有序链表 分析&#xff1a; LeetCode之路——19. 删除链表的倒数第 N 个结点 分析&#xff1a; LeetCode之路——21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的…

网络运营和电子商务有什么区别

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 一个同学他问我&#xff0c;他说学网络运营的话&#xff0c;它是不是电子商务里面的这个东西&#xff1f;像电子大…

二十六、设置时序电路初始状态的方法(初始值设置)(时序电路置数)2

方法2 在理解方法1的化简(1)这个方法后,又可以想到输入触发器R和S两个输入端的信号也无非就是0和1。那么直接用LOAD这个信号接在R和S两个输入端上即可。 先用开关判断触发器的R和S是低电平触发还是高电平触发(下图触发器可以直接看出为低电平触发,但是实际用管子搭建的触…

【那些年写过的愚蠢代码】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用&#xff1a; 一…

【【萌新的Risc-V学习之再看读不懂的流水线设计-10】】

萌新的Risc-V学习之再看读不懂的流水线设计-10 我们将流水线和之前案例中洗衣服的例子进行对照 我们把整个流水线分为5个阶段 也就是做成五级流水线 IF: 取指令ID: 指令译码和读寄存器堆EX: 执行或计算地址MEM: 数据存储器访问WB: 写回 我先在这里表述一下基本的几个指令的用…

javaSwing销售管理

​ 目录 一、选题背景 近几年来&#xff0c;传统商业与电商似乎是水火不容&#xff0c;大有不是你死便是我活的劲头。一直以来舆论都是一边倒的电商将迅速取代传统零售的论调&#xff0c;然而几年过去&#xff0c;电商的发展确实值得侧目&#xff0c;但传统商业虽然受到不小的…

深入学习git

1、git原理及整体架构图 一些常用的命令 git add . 或 git add src/com/ygl/hello/hello.java 指定文件 git commit . 或 git commit src/com/ygl/hello/hello.java 指定文件 git push origin 分支名称 2、git stash的应用场景 场景一&#xff1a;你正在当前分支A开发&…

计算机操作系统 (王道考研)笔记(四)I/O系统

目录 1 I/O1.1 I/O 概念和分类1.1.1 I/O 定义1.1.2 I/O 分类 1.2 I/O控制器1.3 I/O 软件层次结构1.4 I/O 应用程序接口和驱动程序应用接口 1 I/O 1.1 I/O 概念和分类 1.1.1 I/O 定义 BIOS&#xff08;英文&#xff1a;Basic Input/Output System&#xff09;&#xff0c;即基…

Redis主从复制、哨兵模式、群集部署

目录 一、Redis高可用 二、Redis主从复制 主从复制的作用 主从复制的流程 实例 三、Redis哨兵模式 哨兵的核心功能 哨兵模式的作用 哨兵结构的组成 故障转移机制 实例 四、Redis群集 集群的作用&#xff0c;可以归纳为两点&#xff1a; Redis集群的数据分片&#…

【Java开发】Redis位图轻松实现统计用户三日内留存数据

上一篇文章介绍了如何通过 Redis 位图实现统计日活周活月活&#xff0c;而 Redis 位图能做的远不止如此&#xff0c;本篇文章将介绍如何实现统计用户连续三日内登录的留存数据&#xff0c;从而更直观的反映软件的运营情况。 目录 1 实现思路 2 统计用户三日内留存数据 2.1 …

[AIGC] “惊天神器!Java大师推荐的终极工具 Netty ,让你的代码速度狂飙!“

前言&#xff1a; 在现代网络技术中&#xff0c;高性能的网络传输和通信已经成为了一项非常重要的技能。而Netty作为一款高性能、异步事件驱动的网络应用框架&#xff0c;成为了Java开发者们的首选工具之一。作为一位Java大师&#xff0c;今天我将从三个方面&#xff08;是什么…

C++笔记之环形队列

C笔记之环形队列 code review! 文章目录 C笔记之环形队列1.概念I——摘自 https://mp.weixin.qq.com/s/HUn9TF09RZ-UJKYPR5ZXhA2.概念II——摘自 http://t.csdnimg.cn/72bng3.概念III—— 摘自https://mp.weixin.qq.com/s/9Ga502p1DLcc6o75JBQlDg4.概念IV—— 摘自https://mp…

Scala第十三章节

Scala第十三章节 1. 高阶函数介绍 2. 作为值的函数 3. 匿名函数 4. 柯里化 5. 闭包 6. 控制抽象 7. 案例: 计算器 scala总目录 文档资料下载

面试打底稿⑦ 项目一的第三部分

简历原文 抽查部分 完成路线规划模块选择路线功能&#xff0c;用neo4j这种存储图关系的非关系数据库&#xff0c;实现最短线路规划、最低成本线路规划 设计优化物流信息模块&#xff0c;合理选择数据库、缓存技术&#xff0c;实现数据精简、流量削峰、提高系统可 用性 模拟问答…

2023(2024届)计算机保研经验分享,圆梦山东大学

前言&#xff1a; Hello大家好&#xff0c;我是Dream&#xff0c;好久不见啦&#xff01;在这不见的半年多时间里我一直在全身心的投入保研之中&#xff0c;在写下这份面经时&#xff0c;真的是感慨颇多&#xff0c;思绪万千。站在这个时间点上&#xff0c;回首过去的几个月&am…

汽车电子——产品标准规范汇总和梳理(控制器)

文章目录 前言 一、电机控制 二、转向控制 三、制动控制 四、电池管理系统 五、充电系统 六、车身系统 七、通讯系统 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、电机控制 《GB/T 18488.1-201X 电动汽车用电机及其控制器 第1部分&#xff1a;技术条件…

数字IC前端学习笔记:数字乘法器的优化设计(阵列乘法器)

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 数字信号处理作为微处理器的核心部件&#xff0c;是决定着总体处理器性能的因素之一&#xff0c;而数字乘法器是最常见的一种数字信号处理电路。通常情况下&#…

AMBA总线APB、AHB、AXI(详细)总结附实例便于快速掌握

目录 一、简介二、具体内容2.1 APB2.2 AHB2.3 AXI 三、总线对比3.1 总体对比3.2 部分功能差异 四、其他相关链接1、PCI总线及发展历程总结2、SPI协议详细总结附实例图文讲解通信过程3、I2C总线内容总结分享 一、简介 本文主要介绍APB、AHB和AXI总线的相关内容&#xff0c;同时…

初级篇—第一章初识数据库

文章目录 为什么要使用数据库数据库与数据库管理系统数据库的相关概念数据库与数据库管理系统的关系 常用的数据库为什么如此多的厂商要选用MySQL&#xff1f;MySQL的目录 RDBMS 与 非RDBMS关系型数据库(RDBMS)非关系型数据库(非RDBMS) 关系型数据库设计规则表、记录、字段表的…