【问题标题】:setInterval does not work properly in ReactJSsetInterval 在 ReactJS 中无法正常工作
【发布时间】:2020-04-27 11:17:38
【问题描述】:

我遇到了 ReactJS 中的 setInterval 问题(尤其是功能组件)。我想启用自动播放滑块(这意味着滑块栏中的值将在一段时间后增加)。当我单击一个按钮时,将触发此功能。但我不知道 setInterval 如何与 setValue 一起工作。控制台日志只返回初始值(不改变)(在setInterval的回调函数中调用了console.log函数)。

我的代码如下:

const [value, setValue] = useState(10);
const [playable, setPlayable] = useState(false);

useEffect(() => {
    if (playable === true) {
        console.log("Trigger");
        const intervalId = setInterval(increaseValue, 1000);
        return () => clearInterval(intervalId);
    }
}, [playable]);

const increaseValue = () => {
    console.log(value);
    setValue(value + 1);
};

const autoPlay = () => {
    setPlayable(true); 
};


return (
    <div>
        <div style={{"width": "800px"}}>
            <Slider
                value={value}
                step={1}
                valueLabelDisplay="on"
                getAriaValueText={valueText}
                marks={marks}
                onChange={handleChange}
                min={0}
                max={100}
            />
        </div> 
        <button onClick={autoPlay}>Play</button>
    </div>
)

【问题讨论】:

    标签: reactjs setinterval


    【解决方案1】:

    所以,我认为你需要将increaseValue 函数传递给 useEffect

    useEffect(() => {
        if (playable === true) {
            console.log("Trigger");
            const intervalId = setInterval(increaseValue, 1000);
            return () => clearInterval(intervalId);
        }
    }, [playable, increaseValue]);
    

    【讨论】:

    • 我已经测试过了。它没有用。控制台日志只有10(初始值)
    • 它有效。只需将 increaseValue 函数置于 useEffect 之上并执行您的指令即可。你能解释一下发生了什么吗?为什么我要在 useEffect 的第二个参数中添加 increaseMethod?非常感谢。
    • 所以,我认为你还需要 useCallback。我试着在这里写这段代码。你可以看到codesandbox.io/s/sharp-silence-vy2d7?file=/src/App.js
    • 不客气,但如果您将我的答案标记为答案。这将是对我最好的感谢)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    相关资源
    最近更新 更多