vue 接口访问——鼠标快速点击,多次访问问题

场景如下:
表单填写完成后,快速点击两下提交按钮,vue中调用了2次该接口访问,这个问题,有没有高手有解决办法的,最好能够一劳永逸,因为一个项目有很多个这样的场景。在线等待。

我想要达到的目的:
1.快速点击提交按钮是用户误操作,因此,只调用一次接口。
2.由于类似的提供功能较多,是否有办法能够有个公共的处理方法,统一处理(这里我暂时没有思路)。

阅读 5.1k
5 个回答

请求方法加锁。

以下代码来自于一个旧回答,题主要求是不同组件同时调相同接口均能返回,但只发一个请求。

你的需求改改就行。

const pendingMap = {}
// const evnetBus = new Vue();

function request(url, data) {
    return new Promise((resolve, reject) => {
        // url和data做种子生成key
        const key = btoa(url + JSON.stringify(data)); 
        
        // 已存在相同请求,加监听,并阻止继续执行
        if(pendingMap[key]){
            /* const onCallback = res => {
                eventBus.$off(key, onCallback);
                const handler = res.success ? resolve : reject;
                handler(res.result);
            }
            
            eventBus.$on(key, onCallback);*/
            return reject()
        }
        
        // 正常第一次请求
        pendingMap[key] = true;
        axios(url, data)
            .then(res => {
                pendingMap[key] = false;
                const result = res.data;
                // eventBus.$emit(key, {success: true, result});
                resolve(result);
            })
            .catch(err => {
                pendingMap[key] = false;
                // eventBus.$emit(key, {success: false, result: err});
                reject(err);
            })
    })

}

没有封装请求方法的,可以劫持xhr来避免多处修改

点击后将button的disabled设置为true,接口成功后再设置为false

使用element-ui的话, 可以设置'loading',给button加个加载圈圈,接口调用成功后loading设置为false

以前碰到这样类似的问题。
第一次点击以后,给按钮添加disabled,处理结束以后再删除disabled

可以在封装那里截的,保存上一次的请求信息,然后同一时间段请求的信息一样就返回 return false;axios可以做全局拦截的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏