虚心请教,这样的 React 面试题目是否合理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
w4ngzhen
V2EX    React

虚心请教,这样的 React 面试题目是否合理?

  •  
  •   w4ngzhen 2022-07-08 10:55:05 +08:00 7088 次点击
    这是一个创于 1192 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位真大佬,鄙人最近在面试 React 初 /中级,请问一下这个问题是否合理?

    // 按钮挂载后,10 秒点击按钮 N 次,打印的效果? const [count, setCount] = useState(0) useEffect(() => { setTimeout(() => { console.log(count); }, 10 * 1000 ) }, []); <button OnClick={() => setCount(count + 1)} /> 

    个人感觉这个问题还是会考察候选人对 React 、React 的 useEffect 理解,不知道各位大佬怎么看?

    51 条回复    2022-09-06 16:31:02 +08:00
    uen
        1
    uen  
       2022-07-08 11:06:03 +08:00
    useEffect 依赖参数传空数组只会组件初始化的时候渲染一次
    Leviathann
        2
    Leviathann  
       2022-07-08 11:20:18 +08:00
    可以把 考察基本的闭包用法
    cyrbuzz
        3
    cyrbuzz  
       2022-07-08 11:20:33 +08:00   11
    得给 button 加点文字,不然不好点(逃~)。
    yuningWang8
        4
    yuningWang8  
       2022-07-08 15:12:22 +08:00
    useEffect 回调执行的是当前状态的缓存。这个代码不能打印出最新的 count 。
    dcsuibian
        5
    dcsuibian  
       2022-07-08 15:19:10 +08:00
    还行,关键词:React 闭包陷阱
    ethusdt
        7
    ethusdt  
       2022-07-08 16:08:50 +08:00
    不错的, 可以筛选掉一些只会用 react 的人
    vone
        8
    vone  
       2022-07-08 16:12:37 +08:00
    @uen 开发环境会重复触发。
    zepc007
        9
    zepc007  
       2022-07-08 16:19:20 +08:00
    @guisheng 监听某个 state 的时候再更新这个 state ?
    zhuangzhuang1988
        10
    zhuangzhuang1988  
       2022-07-08 16:23:58 +08:00
    太魔法了.
    Leviathann
        11
    Leviathann  
       2022-07-08 16:28:21 +08:00
    @zhuangzhuang1988 这个就是 hook 的基石,结合 memo 、callback 啥的,搞到后面越写越复杂,所以很多人都很喜欢 solidjs 的设计
    ragnaroks
        12
    ragnaroks  
       2022-07-08 16:39:36 +08:00
    合理
    guisheng
        13
    guisheng  
       2022-07-08 16:41:18 +08:00
    @zepc007 是的。
    ragnaroks
        14
    ragnaroks  
       2022-07-08 16:41:40 +08:00   1
    setTimeout 、依赖列表、useEffect 清理、闭包捕获的变量的值,都是常见可能失误的地方
    mameng
        15
    mameng  
       2022-07-08 16:51:20 +08:00
    结果是 0 , [] 里面为空只有第一次渲染,更新不渲染
    gdrk
        16
    gdrk  
       2022-07-08 17:00:05 +08:00
    gdrk
        17
    gdrk  
       2022-07-08 17:03:48 +08:00   3
    我这 markdown 真的是用的稀烂... [博文]( https://overreacted.io/zh-hans/a-complete-guide-to-useeffect)
    w4ngzhen
        18
    w4ngzhen  
    OP
       2022-07-08 17:09:02 +08:00
    @gdrk 是的,我主要是看了这篇文章
    yuthelloworld
        19
    yuthelloworld  
       2022-07-08 17:20:24 +08:00
    []里没有监测的变量。所以不会打印吧
    westoy
        20
    westoy  
       2022-07-08 17:22:13 +08:00
    @gdrk v 站回复不支持 markdown.......
    darkengine
        21
    darkengine  
       2022-07-08 17:30:21 +08:00
    短短几行代码,包含了很多坑,用来考核挺好的
    XTTX
        22
    XTTX  
       2022-07-08 17:34:12 +08:00
    除非想读十秒前的值, 不然需要用 ref.current 更新到最新的。 我觉得挺经典的一道题。
    yuuko
        23
    yuuko  
       2022-07-08 18:33:41 +08:00
    React hook 的最大缺点就是对用户来说不直观,心智负担不小,所以还是 solidjs 更胜一筹
    h1104350235
        24
    h1104350235  
       2022-07-08 18:35:04 +08:00
    有大佬解释下吗
    wenbinwu
        25
    wenbinwu  
       2022-07-08 19:02:11 +08:00
    如果有公司让你看代码说结果,就不用去这种公司了
    dtdths1
        26
    dtdths1  
       2022-07-08 19:23:09 +08:00
    但凡是写过 react hooks 的,应该都知道吧
    damngoto
        27
    damngoto  
       2022-07-08 19:44:10 +08:00
    @h1104350235 装个 EsLint 插件就不会犯错了。依赖加上去。

    useEffect(() => {
    setTimeout(() => {
    console.log(count);
    }, 10 * 1000);
    }, [count]);
    qfdk
        28
    qfdk  
    PRO
       2022-07-08 19:47:36 +08:00 via iPhone
    @gdrk 感谢送上 回家地铁阅读理解1
    rabbbit
        29
    rabbbit  
       2022-07-08 19:56:42 +08:00   1
    useEffect(() => {}, []) 只会在挂载时调用, 所以打出 来的都是 0
    解决办法是使用 useRef
    感觉 hook 限制顺序还是写着难受, 带着镣铐的舞蹈
    zhouyg
        30
    zhouyg  
       2022-07-08 22:40:09 +08:00
    这个面试题可以
    mufeng
        31
    mufeng  
       2022-07-09 00:38:21 +08:00
    @rabbbit useRef 不会 re-render ,这个题还可以考察一下 re-render 怎么处理,useCallback 使用
    ericls
        32
    ericls  
       2022-07-09 00:43:45 +08:00 via iPhone
    非常不合理 代码是给电脑跑的
    mara1
        33
    mara1  
       2022-07-09 01:22:04 +08:00
    我不想做这种题,但遇到的面试许多这样的,接受不能改变的,改变能改变的。

    我改变自己,我选择转行。
    Exuanbo
        34
    Exuanbo  
       2022-07-09 05:52:10 +08:00
    这不是很基础的东西吗...
    okampfer
        35
    okampfer  
       2022-07-09 10:01:52 +08:00
    挺不错的题,也是挺基础的题。正好下周有个面试,就用这道题考考候选人。

    还有一个点我觉得可以考一下,就是 setCount 有没有更安全的调用方式,就是 setCount(prevCount => prevCount + 1) 。

    不过各位我有个疑问,https://codesandbox.io/s/react-interview-increment-useeffect-g4r99j?file=/src/App.tsx ,我加了一个 useEffect 并依赖于 countRef.current ,我点 increment 了之后居然输出了 countRef.current 的最新值?!不是说更新 ref 不会触发重新渲染吗?

    说起来我觉得即使有经验的 React 开发都可能会偶尔懵逼犯这些低级错误,React 在心智负担这点上面确实不如 Vue 、soidjs 有优势。

    很高兴有人提到 solidjs ,就是生态还不行得等。
    looking0truth
        36
    looking0truth  
       2022-07-09 10:28:52 +08:00
    @okampfer 因为你的 setCount 触发的 rerender 啊
    gydi
        37
    gydi  
       2022-07-09 10:30:53 +08:00 via Android
    @okampfer ref 不会变,ref.current 会,你改成依赖 ref 试试
    okampfer
        38
    okampfer  
       2022-07-09 10:40:17 +08:00
    @looking0truth #36 不是这个原因,那个 useEffect 没有依赖 count 。
    @gydi #37 改成依赖 countRef 就只输出一次了。
    gydi
        39
    gydi  
       2022-07-09 10:45:33 +08:00 via Android
    @okampfer 你之前的代码里点击触发 rerender 是因为 setcount 了,不是因为 ref current 的值变了
    MrBrother
        40
    MrBrother  
       2022-07-09 11:55:38 +08:00 via Android
    @westoy #20

    移动端不支持,电脑上可以
    westoy
        41
    westoy  
       2022-07-09 11:57:28 +08:00
    @MrBrother

    不是, 我一直用的电脑端, 主楼才支持 MD , 回复一直不行的啊

    难道 V 站也搞 abtest.......
    AV1
        42
    AV1  
       2022-07-09 12:10:17 +08:00
    这题目对 react 来说是非常基础的东西,可以说是踏入 react 生态的第一步就要遇到的问题。
    okampfer
        43
    okampfer  
       2022-07-09 15:23:39 +08:00
    @gydi @looking0truth #39 是的,我又实验了一下,确实是……一旦注释掉 setCount 那一行,就无法输出最新的 ref.current 值了。
    AyaseEri
        44
    AyaseEri  
       2022-07-09 16:45:34 +08:00
    会被打死,不如考考 React Fiber
    vision1900
        45
    vision1900  
       2022-07-09 21:18:09 +08:00
    @AyaseEri 初中级就考 Fiber ,真卷啊
    vision1900
        46
    vision1900  
       2022-07-09 21:18:45 +08:00
    可以参考这篇文章: https://beta.reactjs.org/learn/state-as-a-snapshot
    React 的 state 不是普通的 JS 变量
    nazalewoyuanyi
        47
    nazalewoyuanyi  
       2022-07-10 08:38:34 +08:00 via Android
    @rabbbit 应该只会打印出来一个 0 吧,只执行了一次
    MrBrother
        48
    MrBrother  
       2022-07-10 09:08:06 +08:00 via Android
    @westoy
    原来如此,我没在电脑上回复过,还以为也可以
    vision1900
        49
    vision1900  
       2022-07-11 00:12:06 +08:00
    可以这么写,虽然有点 hack 的感觉:

    ```
    useEffect(() => {
    setTimeout(() => {
    setCount(val => {
    console.log(val)
    return val;
    })
    }, 10 * 1000);
    }, [])
    ```
    prayx
        50
    prayx  
       2022-07-26 14:15:04 +08:00
    合理,考察对 React Hooks 和闭包的理解。
    QKgf555H87Fp0cth
        51
    QKgf555H87Fp0cth  
       2022-09-06 16:31:02 +08:00
    主要考的还是 setTimeout
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2703 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 09:02 PVG 17:02 LAX 02:02 JFK 05:02
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86