1

我正在尝试实现一个 UI,在其中我通过 Office-ui-fabric 的 TextField 组件获取用户输入。我使用 onChange 来监控价值。但是,当我输入用户输入时说数字“100”,我可以看到每次呈现的函数,我认为这是 onChange 的一个功能,但是在完成输入输入后,我在控制台窗口中只看到“10”。

我尝试按照旧的 stackoverflow 帖子中的建议将 onChange 更改为 Blur,但是当我这样做时,我看不到任何控制台消息。

const [msg, setMsg] = React.useState("");
React.useEffect(()=>{
   vscode.postMessage(
     {
       command: 'setMsg',
       text: msg
     }
   );
},[msg])

return (
<div>
 <Stack>
   <Stack.Item grow>
   <Label style={{ color: 'white' }}>Enter number </Label>
   <TextField placeholder="Enter number of images" value={msg} onChange={event => { setMsg((event.target as HTMLInputElement).value); console.log(msg);test() }} /> 
   </Stack.Item>
   </Stack>
</div>
);

我希望如果我输入数字“100”,我应该在控制台日志中看到“100”。目前我看到'10'。这是实现此功能的正确方法吗?新的反应和办公室 -ui-fabric 和任何帮助表示赞赏。

4

1 回答 1

1

setStateReactasync并且需要一些时间来执行/更新状态。

当你这样做时,

onChange={event => { 
   setMsg((event.target as HTMLInputElement).value); 
   console.log(msg);
   test() 
}}

setState您尝试访问状态后,结果只会为您提供先前的状态。

要查看实际效果,请将其console.log从中删除onChange并使用useEffect钩子。正如您已经拥有useEffect将在msg更改时执行的那样,您只需要在console.log(msg)其中添加行。

React.useEffect(()=>{
        console.log(msg); // Now you will get updated value every time.
        vscode.postMessage(
            {
                command: 'setMsg',
                text: msg
            }
        );
},[msg])
于 2019-09-06T00:56:47.023 回答