返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue如何防止按钮重复点击方案详解
  • 599
分享到

Vue如何防止按钮重复点击方案详解

Vue按钮重复点击Vue防止按钮重复点击Vue避免重复点击 2022-12-09 18:12:58 599人浏览 薄情痞子
摘要

目录前言目的文件结构实现请求拦截响应拦截取消重复发送请求调用前言 AxiOS 是一个基于 promise 的 Http 库,可以用在浏览器和 node.js 中。 axios 是目前

前言

AxiOS 是一个基于 promise 的 Http 库,可以用在浏览器和 node.js 中。

axios 是目前最优秀的 HTTP 请求库之一, 我们封装 axios 请求也是为了让代码看的更加清晰, 后期好维护.

目的

  • 实现请求拦截
  • 实现响应拦截
  • 常见错误处理
  • 不能请求头设置
  • api 集中式管理

(取消重复请求,重复发送请求, 请求缓存等情况均还未实现)

文件结构

实现

index.js内代码如下:

引入

// 引入 axios
import axios from 'axios';
// 请求配置单独写一个文件 baseurl.js
import serverConfig from './baseurl.js'

创建一个实例

const serviceAxios = axios.creat({
	baseURL: serverConfig.baseURL, //基础请求地址
    timeout: 1000 , //请求超时设置
    withCredentials: false, // 跨域请求是否需要携带 cookie 
})

请求拦截

serviceAxios.interceptors.request.use(
    (config) => {
        console.log("请求配置", config);
        // 是否使用 Token, 
        if(serverConfig.useTokenAuthorization) {
            config.headers["Authorization"] = localStorage.getItem("token");
        }
        // 设置请求头
        if(config.method === "post") {
            config.headers["content-type"] = "application/x-ww-fORM-urlencoded";
            // config.data = qs.stringify(config.data); //序列化  效果等同于下行代码
            config.requestType = "form"
        } else {
            config.headers["content-type"] = "application/JSON"
        }
        // 返回
        return config
    },
    (error) => {
        Promise.reject(error)
    }
)

响应拦截

serviceAxios.interceptors.response.use(
    (res) => {
        console.log("响应拦截", res);
        let data = res.data;
        // 处理自己的业务逻辑,如 token 是否过期...
        return data;
    },
    (error) => {
        let message = ""
        if(error && error.response) {
            switch (error.response.status) {
                case 302: 
                    message = "接口重定向了! ";
                    break;
                case 400:
                    message = "参数不正确! ";
                    break;
                case 401:
                    message = "您未登录, 或者登录已经超时, 请先登录! "
                    break;
                case 403:
                    message = "您还没有权限操作! ";
                    break;
                case 404:
                    message = `请求地址出错: ${error.response.config.url}`;
                    break;
                case 408:
                    message = "请求超时! ";
                    break;
                case 409:
                    message = "系统已存在相同数据! "
                    break;
                case 500:
                    message = "服务器内部错误! "
                    break;
                case 501:
                    message = "服务未实现! "
                    break;
                case 502:
                    message = "回答错误! "
                    break;
                case 503:
                    message = "服务不可用"
                    break;
                case 504:
                    message = "服务暂时无法访问, 请稍后再试"
                    break;
                case 505:
                    message = "HTTP 版本不受支持! "
                    break;
                default:
                    message = "异常问题, 请联系管理员! "
                    break;
            }
        }
        return Promise.reject(message);
    }
);

取消重复发送请求

实现思想

唯一标识值 : 每次发起请求的时候根据请求的方式,请求URL,请求携带参数设置一个唯一标识值.

请求队列: 创建一个map对象储存请求的唯一标识值.

每次发送请求的时候, 在请求拦截中判断请求队列中是否存在这个请求, 存在就说明这个请求正在进行中,那么就取消正在发送的请求,重新发送请求; 不存在就将本次请求加入请求队列中.

在响应拦截中将本次请求从请求队列中移除.

?生成唯一标识值函数

import qs from 'qs'
function regsoleKey(config){
    const {method, url, params, data } = config;
    return [method, url, qs.stringify(params), qs.stringify(data)].join('&')
}

?将请求加入请求队列函数

const reqQueue = new Map();
function addreqQueue(config){
    //调用生成唯一标识值函数, 生成 requesTKEy
    const requestKey = regsoleKey(config);
    //为每个请求创建一个专属的 CancelToken(用于取消请求)
    config.cancelToken = config.cancelToken || new axios.CancelToken((cancel)=>{
        // 判断 reqQueue 中是否含有 requestKey, 
        // 将 requestKey 与 CancelToken 以键值对的形式保存到map对象中
        if(!reqQueue.has(requestKey)){
            reqQueue.set(requestKey,cancel)
        }
    });
}

?将请求从请求队列移除

function removereqQueue(config){
    // 标识值
    const requestKey = generateReqKey(config);
    if(reqQueue.has(requestKey)){
        // 取消之前发出请求
       const cancelToken = reqQueue.get(requestKey);
       cancelToken(requestKey);
        // 从队列移除
       reqQueue.delete(requestKey);
    }
}

?请求拦截器

serviceAxios.interceptors.request.use(
	function(config) {
		removereqQueue(config); // 检查是否重复发送请求
		addreqQueue(config); //将本次请求加入请求队列
		return config
	},
	(error) => {
		return Promise.reject(error)
	}
)

?响应拦截器

serviceAxios.interceptors.response.use(
	(res) => {
		removereqQueue(res.config); //请求从请求队列移除
		return res
	},
	(error) => {
		removereqQueue(error.config || {}); //请求从请求队列移除
		//....
	}
)
// 最后
export default serviceAxios

baseurl.js代码如下

const serverConfig = {
    baseURL: 'https://fm-emo-music-api.vercel.app',
    useTokenAuthorization: true, //是否开启 token 验证
}
export default serverConfig

api.js代码如下

// 引入index.js
import serviceAxios from './index.js'
// get实例
export const VideoRecommendLike = (params) => {
    return serviceAxios({
        method: "get",
        url: "/dj/personalize/recommend",
        params,
    })
}
// post实例
export const ConfirmPhone = (data) =>{
    return serviceAxios({
        method: "post",
        url: "/captcha/sent",
        data,
    })
}

调用

如何在原生js文件内调用?

首先引入axios文件

    <!-- axios请求文件 -->
    <script src="/src/utils/axios.js"></script>

再引入带有axios请求的js文件, 请求文件内使用es6新语法按需引入api.js文件

例:

import {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->useRouter} from '../../router/app.js'

如何在Vue文件内使用?

示例:

  // 按需引入请求接口
    import {emailCounts} from "@/api/api.js"
    export default {
    	...
    	// 异步进行axios请求
    	methods: {
    		async comein(){
    			let res = await emailCount(params)
    			console.log(res)
    		}
		}
    }

到此这篇关于Vue如何防止按钮重复点击方案详解的文章就介绍到这了,更多相关Vue按钮重复点击内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue如何防止按钮重复点击方案详解

本文链接: https://lsjlt.com/news/174726.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue如何防止按钮重复点击方案详解
    目录前言目的文件结构实现请求拦截响应拦截取消重复发送请求调用前言 Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。 axios 是目前...
    99+
    2022-12-09
    Vue按钮重复点击 Vue防止按钮重复点击 Vue避免重复点击
  • js如何防止按钮重复点击
    这篇文章主要为大家展示了“js如何防止按钮重复点击”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js如何防止按钮重复点击”这篇文章吧。1.粗暴简单办法直接定义一...
    99+
    2024-04-02
  • vue如何处理防止按钮重复点击问题
    目录处理防止按钮重复点击vue防止重复执行点击事件方法一:在规定时间内将按钮禁用的方法方法二:用指令的方式实现,全局注册 处理防止按钮重复点击 1.在button上绑定动态...
    99+
    2024-04-02
  • vue中如何防止用户频繁点击按钮详解
    目录1、在项目中遇到一个问题:2、解决办法3、具体实现:方法1步骤:方法2:方法三:总结1、在项目中遇到一个问题: 当事件中的代码执行耗费时间,且用户在短时间不断点击按钮,造成短时间...
    99+
    2024-04-02
  • Android应用中怎么防止按钮重复点击
    本篇文章给大家分享的是有关Android应用中怎么防止按钮重复点击,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。首先将这块提取为工具类(方便接下来的调用),现在就起名为:But...
    99+
    2023-05-31
    android roi
  • CSS如何防止重复点击
    这篇文章主要介绍“CSS如何防止重复点击”,在日常操作中,相信很多人在CSS如何防止重复点击问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”CSS如何防止重复点击”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-07-04
  • vue指令防止按钮连点解析
    目录vue指令防止按钮连点钩子函数钩子函数参数实现vue防连点,重复点击局部注册全局注册vue指令防止按钮连点 在开发中,经常会遇到客户反馈一个数据提交了两边的情况,这种情况不能够去...
    99+
    2024-04-02
  • Android之有效防止按钮多次重复点击的方法(必看篇)
    为了防止测试妹子或者用户频繁点击某个按钮,导致程序在短时间内进行多次数据提交or数据处理,那到时候就比较坑了~ 那么如何有效避免这种情况的发生呢? 我的想法是,判断用户点击...
    99+
    2022-06-06
    方法 按钮 Android
  • 实例详解Android解决按钮重复点击问题
     为了防止用户或者测试MM疯狂的点击某个button,写个方法防止按钮连续点击。具体实例代码如下所示: public class BaseActivity ext...
    99+
    2022-06-06
    按钮 Android
  • js中如何实现控制按钮防止频繁点击响应
    这篇文章主要为大家展示了“js中如何实现控制按钮防止频繁点击响应”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js中如何实现控制按钮防止频繁点击响应”这篇文章吧...
    99+
    2024-04-02
  • 详解vue如何防止用户多次点击请求
    在现代web应用程序中,用户操作经常需要与服务器进行交互。用户频繁点击按钮或提交表单可能会导致前端向服务端发送多个请求,这会导致性能下降和资源浪费。Vue.js是一个流行的JavaScript框架,提供了一种解决此问题的方法。在本文中,我们...
    99+
    2023-05-14
  • Android防止按钮过快点击造成多次事件的解决方法
    问题 onClick事件是Android开发中最常见的事件。比如,一个submitButton,功能是点击之后会提交一个订单, 则一般代码如下,其中submitOrder()...
    99+
    2022-06-06
    方法 事件 按钮 Android
  • springMVC如何防止表单重复提交详解
    目录 前言防止表单重复提交单机实现的思路步骤代码实现分布式实现的思路步骤代码实现总结 前言 在系统中,有些接口如果重复提交,可能会造成脏数据或者其他的严重的问题,所以我们一般会对与数...
    99+
    2024-04-02
  • Vue如何实现点击按钮进行上下页切换
    这篇文章给大家介绍Vue如何实现点击按钮进行上下页切换,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。案例效果:完整代码如下: <template>  <div ...
    99+
    2023-06-29
  • vue禁止重复点击发送多次请求如何实现
    本篇内容介绍了“vue禁止重复点击发送多次请求如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!某些情况下,为了阻止用户短时间内重复点击...
    99+
    2023-07-05
  • Vue路由重复点击报错如何解决
    这篇文章主要介绍“Vue路由重复点击报错如何解决”,在日常操作中,相信很多人在Vue路由重复点击报错如何解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue路由重复点击报错如何解决”的疑惑有所帮助!接下来...
    99+
    2023-07-05
  • win11点击更新按钮没反应如何解决
    这篇文章主要介绍“win11点击更新按钮没反应如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win11点击更新按钮没反应如何解决”文章能帮助大家解决问题。我们如果遇到Windows更新失败,...
    99+
    2023-07-01
  • vue如何根据条件判断按钮是否可以点击
    目录根据条件判断按钮是否可以点击方法一:使用v-if 、v-else 来判断方法二:增加一个变量,判断vue判断点击当前元素需要判断你是点击了遮罩层还是form表单接下来是分别对e....
    99+
    2024-04-02
  • SpringBoot如何防止XSS注入攻击详解
    什么是 XSS 攻击 在跨站脚本(XSS)攻击中,攻击者可以在受害者的浏览器中执行恶意脚本。这种攻击通常是通过在网页中插入恶意代码 (JavaScript) 来完成的。攻击者在使用...
    99+
    2024-04-02
  • vue如何实现点击按钮切换背景颜色的效果
    不懂vue如何实现点击按钮切换背景颜色的效果?其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。用vue简单的实现点击按钮切换背景颜色,具体代码如下所示:<div class="...
    99+
    2023-05-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作