尚品汇项目复盘(三)

简介: 尚品汇项目复盘(三)

接上文

以下是除了对目录内容进行分析以外 学到的新的知识点

(十)解决连续点击使用push/replace会报错

路由跳转有两种形式:声明式导航、编程式导航

–声明式导航没有这类问题的,因为vue-router底层已经处理好了

当使用编程式导航 例如

this.$router.push({name:"Search",query:{keyword:this.keyword}})

多次点击就会出现以下警告

原因:push是一个promise,promise需要传递成功和失败两个参数,我们的push中没有传递。

方法:this.$router.push({name:‘Search’,params:{keyword:“…”||undefined}},()=>{},()=>{})后面两项分别代表执行成功和失败的回调函数

但是这样写 也就只有这一个push/replace可以多次点击 治标不治本

解决方法 :重写push/replace方法

import Vue from'vue'
import VueRouter from'vue-router'
 
import routes from './routes'

// 每当点击两次搜索按钮的时候 就会报错
// 原因是因为push||replace方法
// 此时需要自己手写一个push||replace方法
let oringPush = VueRouter.prototype.push;
let oringReplace = VueRouter.prototype.replace;
// 此时重写push||replace
// 第一个参数是告诉push方法 你往哪里跳转
VueRouter.prototype.push = function(location,resolve,reject) {
  // 当resolve 和 reject 存在的时候 即第一次点击的时候
  if(resolve && reject){
    oringPush.call(this, location, resolve, reject)
  }else {
    oringPush.call(this, location, ()=>{},()=>{})
  }
}

VueRouter.prototype.replace = function(location,resolve,reject) {
  // 当resolve 和 reject 存在的时候 即第一次点击的时候
  if(resolve && reject){
    oringReplace.call(this, location, resolve, reject)
  }else {
    oringReplace.call(this, location, ()=>{},()=>{})
  }
}
//此时 push||replace方法遇到连续点击两次就不会报错了

在Router文件夹中的index.js 添加这段代码 即可彻底根治这个问题

(十一)二次封装axios

11.1 为什么要二次封装axios?

二次封装axios主要是为了用到请求拦截器和响应拦截器


拦截请求:可以在请求之前处理一些业务(比如为每个请求带上相应的参数,时间戳等)


拦截响应:可以在服务器返回数据之后处理一些事情(比如对返回的状态进行判断,token是否过期等)


通常我们的项目会越做越大,页面也会越来越多,随之而来的是接口数量的增加。api统一管理,不管接口有多少,所有的接口都可以非常清晰,容易维护。

11.2 如果二次封装axios?

// 对axios二次封装
import axios from 'axios'

const requests = axios.create({
  // 配置对象
  // 基础路径,发送请求的时候,路径当中会出现api
  baseURL:'/api',
  timeout:5000
})

11.3 如何配置请求拦截器和响应拦截器

根据上述的二次封装的axios添加请求拦截器和响应拦截器

// 添加请求拦截器
requests.interceptors.request.use((config)=>{
  // 在发送请求之前做些什么
 
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
requests.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么

  return response.data;
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error);
});

1、每个请求都带上的参数,比如token,时间戳等。

2、对返回的状态进行判断,比如token是否过期,统一判断返回码等。


(十二)nprogress进度条插件

  1. 打开一个页面时,往往会伴随一些请求,并且会在页面上方出现进度条。它的原理时,在我们发起请求的时候开启进度条,在请求成功后关闭进度条,所以只需要在request.js中进行配置。
  2. 安装nprogress
yarn add nprogress


  1. 如何使用
    在对axios进行二次封装的时候
import nprogress from 'nprogress'
// 引入进度条样式
import "nprogress/nprogress.css"

在请求和响应拦截器中添加

// 添加请求拦截器
requests.interceptors.request.use((config)=>{
  // 在发送请求之前做些什么
  //引入进度条
  nprogress.start()
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 添加响应拦截器
requests.interceptors.response.use(function (response) {
  // 2xx 范围内的状态码都会触发该函数。
  // 对响应数据做点什么
  // 进度条结束
  nprogress.done()
  return response.data;
}, function (error) {
  // 超出 2xx 范围的状态码都会触发该函数。
  // 对响应错误做点什么
  return Promise.reject(error);
});

(十三) loadsh插件防抖和节流

13.1 安装loadsh

yarn add loadsh

防抖:用户操作很频繁,但是只执行一次,减少业务负担。

节流:用户操作很频繁,但是把频繁的操作变为少量的操作,使浏览器有充分时间解析代码

13.2使用方法

import throttle from "lodash/throttle";
//防抖
getList:debounce(function() {
  this.getUserList()
},2000),

/节流
getList:throttle(function() {
  this.getUserList()
},2000),

其中getList 是你要加防抖/节流的函数名字 2000是每多少秒触发一次


目录
相关文章
|
JavaScript API
深入探索fs.WriteStream:Node.js文件写入流的全面解析
深入探索fs.WriteStream:Node.js文件写入流的全面解析
|
缓存 JavaScript 前端开发
拿下奇怪的前端报错(三):npm install卡住了一个钟- 从原理搞定安装的全链路问题
本文详细分析了 `npm install` 过程中可能出现的卡顿问题及解决方法,包括网络问题、Node.js 版本不兼容、缓存问题、权限问题、包冲突、过时的 npm 版本、系统资源不足和脚本问题等,并提供了相应的解决策略。同时,还介绍了开启全部日志、使用替代工具和使用 Docker 提供 Node 环境等其他处理方法。
9346 1
|
移动开发 前端开发 架构师
前端架构师需要具备什么能力以及代码能力?
【7月更文挑战第17天】 前端架构师是技术、领导与管理的融合,需精通HTML/CSS/JS及React/Vue等框架,擅长工程化、跨平台开发与安全。他们设计高效架构,优化性能,领导团队,做技术选型,并持续学习分享,确保代码质量和团队成长。
653 7
|
JavaScript 索引
vue尚品汇商城项目-day04【27.分页器静态组件(难点)】
vue尚品汇商城项目-day04【27.分页器静态组件(难点)】
101 1
|
网络协议 算法 Linux
TCP教程:详解TCP连接过程
TCP教程:详解TCP连接过程
1568 0
|
消息中间件 存储 JavaScript
Electron开发自定义通知 & 多并发下接收消息处理
Electron 专门提供了 Notification 可以用来实现`系统通知`,但是如果想实现自定义(如自定义UI样式等)通知,Notification 则不能实现。 下面摘录了我在`系统通知`和如何实现`自定义通知`的思路,另外也阐述了`多并发下接收消息`方案实现。
879 0
webpack基础篇(七):资源解析--解析图片
webpack基础篇(七):资源解析--解析图片
263 0
webpack基础篇(七):资源解析--解析图片
|
3天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
4天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
365 91