代码之家  ›  专栏  ›  技术社区  ›  Alireza Noori

每次单击react后延长超时时间

  •  0
  • Alireza Noori  · 技术社区  · 3 年前

    假设有以下简单的组件。当我点击按钮时,信息将变为 Clicked 一秒钟,然后回到 - .但是,当我发送垃圾邮件时,我希望标题是 点击 但它应该回到过去 - 之后 最后的 点击按钮。基本上,我希望每次点击都能延长超时时间。

    如果这是一个简单的JS函数,我只需在每次单击后清除间隔并设置另一个超时。但是,我不确定如何使用react钩子实现相同的结果。

    import ReactDOM from 'react-dom';
    import {useEffect, useState} from 'react';
    import './index.css';
    
    const Test = () => {
        const [message, setMessage] = useState("-");
    
        const buttonClick = () => {
            setMessage("Clicked");
        }
        useEffect(() => {
            if(message !== "-") {
                const id = setTimeout(() => {
                    console.log("Running Interval");
                    setMessage("-");
                }, 1000);
    
                return () => {
                    console.log("Clearing Interval");
                    clearTimeout(id);
                }
            }
        }, [message]);
    
        return (
            <article>
                <header>
                    {message}
                </header>
                <button onClick={buttonClick}>button</button>
            </article>
        );
    }
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   CertainPerformance    3 年前

    将超时ID放入ref,然后可以调用 clearTimeout 在点击处理程序最开始的时候。

    const Test = () => {
        const [message, setMessage] = React.useState("-");
        const timeoutIdRef = React.useRef();
        const handleClick = () => {
            setMessage("Clicked");
            clearTimeout(timeoutIdRef.current);
            timeoutIdRef.current = setTimeout(() => {
                setMessage("-");
            }, 1000);
        };
        // cleanup, if desired
        // React.useEffect(() => clearTimeout(timeoutIdRef.current), []);
        return (
            <article>
                <header>
                    {message}
                </header>
                <button onClick={handleClick}>button</button>
            </article>
        );
    }
    
    ReactDOM.render(<Test />, document.querySelector('.react'));
    <script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
    <script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
    <div class='react'></div>