面试官:如何解决按钮重复点击?这个问题挂了80%的人!

前言

还记得上周我们团队在招聘前端工程师,一个看起来经验丰富的候选人坐在我对面。

"你们项目中是如何处理按钮重复点击的问题的?"我抛出了这个看似简单的问题。

"这个简单,使用防抖就可以了。"他很快回答。

然而,当我继续追问细节时,他却陷入了沉思...

实际上,这个问题看似简单,但是要真正的解决好,需要考虑很多细节。在我面试了很多候选人中,能完整答出来的不到20%。

问题背景

在日常开发中,我们经常会遇到这样的场景:

  • 用户疯狂点击提交按钮
  • 表单重复提交导致数据异常
  • 批量操作按钮被连续触发

这些问题如果处理不当,轻则影响用户体验,重则可能造成数据错误。今天,就让我们通过一个真实的面试场景,逐步深入这个问题

面试场景

面试官:项目中如何处理按钮重复点击的问题?

候选人:可以使用防抖(debounce)。

const debouncedSubmit = debounce(submit, 300);

面试官:那假设我防抖设置了1秒,我现在请求了,但是接口响应比较慢,要3秒,用户在这3秒内点击了多次,那怎么办? 防抖是不是就没用了?

一般说到这里,很多人就不知道怎么搞了

候选人:可以给按钮加上 loading 状态,点击后设置 loading 为 true,等操作完成后再设置为 false。

const [loading, setLoading] = useState(false);

const handleSubmit = async () => {
    setLoading(true);
    try {
        await submitData();
    } finally {
        setLoading(false);
    }
}

面试官:这个思路不错,但是如果项目中有很多按钮都需要这样处理,你会怎么做?

候选人:额...每个按钮都写一遍 loading 状态管理?

面试官:那样就会有很多重复代码,有没有想过怎么封装呢?

到这里也卡掉了很多人

顺便吆喝一句,技术大厂机遇,前后端测试多地捞人,待遇还可以~

解决方案

我们可以封装一个自定义 Hook

import {useState,useCallback,useRef} from 'react'

function useLock(asyncFn) {
    const [loading, setLoading] = useState(false)
    const asyncFnRef = useRef(null)
    asyncFnRef.current = asyncFn
    const run = useCallback(async (...args) => {
        if(loading) return
        setLoading(true)
        try {
            await asyncFnRef.current(...args)
        } finally {
            setLoading(false)
        }
    }, [loading])

    return [loading,run]
}

然后封装一个通用的 Button 组件

import {Button as AntButton} from 'antd'

const Button = ({onClick,...props})=>{
    const {loading, run} = useLock(onClick || (()=> {}))
    return <AntButton loading={loading} {...props} onClick={run}></button>
}

使用示例

const Demo = () => {
    const handleSubmit = async () => {
        // 模拟异步请求
        await new Promise(resolve => setTimeout(resolve, 2000))
        console.log('提交成功')
    }

    return (
        <Button onClick={handleSubmit}>
            提交
        </Button>
    )
}

可以看到 在 handleSubmit 执行的时候 Button 会自动添加 loading, 在请求完成后 loading 会自动变为 false。

方案优势

  • 零侵入性 :使用方式与普通按钮完全一致
  • 自动处理 :自动管理 loading 状态,无需手动控制

讨论

你在项目中是如何处理按钮重复点击的问题的?欢迎在评论区分享你的解决方案!

——转载自:叶小秋

#面试时最害怕被问到的问题##牛客创作赏金赛#
全部评论
我好像在掘金看过😋
点赞 回复 分享
发布于 06-04 22:18 湖南

相关推荐

06-04 18:25
中南大学 Java
内向的柠檬精在研究求职打法:有没有可能你前端进不了大厂基本就废了?后端就算进不了大厂好歹还能吃饱吧 你不会以为人人都能进大厂吧
点赞 评论 收藏
分享
06-04 18:37
门头沟学院 Java
我有个97年毕业的双非本科朋友,做Java开发的,今年4月被裁员后经历了挺长一段迷茫期。他休息了半个月调整状态开始找工作,但一直不太顺利,整个人都快自闭了。这段时间他也在不断反思,为什么有的程序员能轻松拿到月薪3-4万的工作,自己却连1.5万以上的面试机会都很少。他总结了几点原因:&nbsp;&nbsp;1.&nbsp;之前公司太安逸:几乎不怎么加班,工作节奏很慢。&nbsp;&nbsp;2.&nbsp;安逸让人懒惰:时间一长,他思想上也变得懒惰,不想学习新技术,更不愿意跳出舒适圈,结果技术能力逐渐跟不上行业发展的步伐。&nbsp;&nbsp;3.&nbsp;大环境不好:这是他觉得最无奈的一点,现在就业市场确实挺严峻的。他有5年工作经验,大厂进不去就不考虑了,但工资挂1.5万以上几乎没什么面试机会。后来他把期望薪资降到了1.3万,虽然有10家公司让他进了二面,但最后都没了下文。当然,期间他也收到过几个offer,但面试时感觉公司氛围不太好,就都没去。现在他特别迷茫,一直在学习新东西提升自己,但也在想,就算找到下一份工作,在这么差的环境下,未来该怎么办?35岁之后,甚至30岁之后,如果再被裁员,难道只能继续找Java程序员的工作吗?他真的很想知道,那些被裁员的前辈们是怎么规划后续职业道路的,或者那些已经迈过35岁大关的勇者们,你们是怎么应对这个问题的?他知道自己现在最紧要的是先找一份本职工作过渡一下,但之后的路该怎么走,他真的很迷茫。有没有前辈能给他提点建议啊?真的特别感谢!&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
06-04 17:59
已编辑
长江大学 Java
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务