单击 2 次后按钮文本从 Goodbye 变为 Hello?

Button text changes from Goobye to Hello after 2 clicks?

出于某种原因,每当我在我的 React TS 项目中使用它时,我需要按两次按钮才能将文本从“再见”更改为“你好”,而不是相反?

import { useState } from 'react' 

const ChangeTextButton = () => {

    const [buttonText, setButtonText] = useState("Click me!")
    var changedBefore = false;

    function changeText() {
        
        if (changedBefore) {
            setButtonText("Hello")
        } else {
            setButtonText("Goodbye")
        }
        
        changedBefore = !changedBefore
        return buttonText;
    }

    return(
        <button onClick={() => changeText()}>{buttonText}</button>
    );
}

export default ChangeTextButton;

是的,我知道这是糟糕的代码,我对整个 TypeScript 和 JS 比较陌生。

发生这种情况是因为您的 changedBefore 变量将在每次重新渲染后设置为 false

所以它从 false 开始,在第一次单击时它会将文本按钮更改为“再见”并重新呈现。重新渲染会将值再次设置回 false。下一次点击会将文本再次更改为“再见”,但由于它与实际状态相同,因此不会触发重新渲染,因此您的 changedBefore 将在下一次点击时变为 true,即最终会将文本更改为“Hello”

如果您想避免这种行为,您将不得不为您的 changedBefore 变量使用 useStateuseRef,如下所示:

import { useState } from 'react' 

const ChangeTextButton = () => {

    const [buttonText, setButtonText] = useState("Click me!")
    const [changedBefore, setChangedBefore] = useState(false);

    function changeText() {
        
        if (changedBefore) {
            setButtonText("Hello")
        } else {
            setButtonText("Goodbye")
        }
        
        setChangedBefore(cb => !cb)
    }

    return(
        <button onClick={() => changeText()}>{buttonText}</button>
    );
}

export default ChangeTextButton;

演示:https://stackblitz.com/edit/react-wuulup?file=src%2FApp.js