使用 useState React 钩子和调用其他函数

时间:2021-07-06 21:32:37

标签: reactjs

每当用户在文本框中输入某个值时,我想调用某个函数。这是我使用 React Hooks 的代码:

function MyApp() {
    const [name, setName] = React.useState("");
    const [city, setType] = React.useState("");
    const [completion, setCompletion] = useState(0);
    
    calculateProgress = () => {
        let v1 = name;
        let v2 = city;
        let total = 0;
        if(v1.length >0 ) total += 50;
        if(v2.length >0 ) total += 50;
        setCompletion(total);
    }
    
    return {
        <div>
            <input type="name" onChange={(e) => setName(e.target.value); calculateProgress();}
            <input type="city" onChange={(e) => setCity(e.target.value); calculateProgress();}
        </div>
    }
}

当我在 name 或 city 中输入一些值时,应该调用 calculateProgress。但就我而言,每当我输入内容时,calculateProgress 方法中 name 或 city 的值都是空的。这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

就像我在评论中所说的那样,当 calculateProgress 被调用时,cityname 变量的状态还没有改变。 React 无法将函数一分为二并在中途刷新状态。它将在使用新值刷新组件状态之前完全运行您的 onChange 函数。

您必须将值传递到您的函数中:

function MyApp() {
    const [name, setName] = React.useState("");
    const [city, setType] = React.useState("");
    const [completion, setCompletion] = useState(0);
    
    calculateProgress = (name, city) => {
        let v1 = name;
        let v2 = city;
        let total = 0;
        if(v1.length >0 ) total += 50;
        if(v2.length >0 ) total += 50;
        setCompletion(total);
    }

    return {
        <div>
            <input type="name" onChange={(e) => setName(e.target.value); calculateProgress(e.target.value, city);}
            <input type="city" onChange={(e) => setCity(e.target.value); calculateProgress(name, e.target.value);}
        </div>
    }
}

注意:为简单起见,我尽可能减少了更改,但我建议也为那些 onChange 处理程序创建一个包装函数,并可能重命名 namecity 变量以用于 { {1}} 函数来明确它们是什么(或者更确切地说它们不是什么)