【问题标题】:onChange monitoring user input into TextField component from Office-UI-Fabric on every render and displaying incorrect outputonChange 在每次渲染时监视用户从 Office-UI-Fabric 到 TextField 组件的输入并显示不正确的输出
【发布时间】:2020-01-08 21:09:26
【问题描述】:

我正在尝试实现一个 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 和任何帮助表示赞赏。

【问题讨论】:

  • 嗨 novice_coder,检查我的解决方案,如果有帮助,请告诉我。

标签: react-hooks office-ui-fabric react-tsx


【解决方案1】:

React 中的setStateasync,需要一些时间来执行/更新状态。

当你这样做时,

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

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

要查看实际效果,请从onChange 中删除此console.log 并使用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])

【讨论】:

  • 谢谢!我试过你的建议,它有效。唯一的问题是我在 TextField 中输入值说 1000 但我没有立即看到控制台日志。当我可以在控制台中看到 msg = 1000 的值时,我将用户输入提供给另一个 TextField。这是我实施的副作用吗?有没有更好的方法来解决这个问题?
  • 这里出现了依赖数组,因为您向useEffect 提供了依赖数组,它只会在该依赖发生变化时运行。对于任何其他输入更改,它将不会执行此useEffect。如果你想在每个渲染上显示状态值,你可以简单地使用useEffect,而不需要像useEffect(() =&gt;{console.log(msg)})这样的依赖。现在这将在任何输入更改时执行。
  • 您可以添加任意数量的useEffect
  • @novice_coder,您能否也为此提供步骤唯一的问题是我在 TextField 中输入值说 1000,但我没有立即看到控制台日志。当我可以在控制台中看到 msg = 1000 的值时,我向另一个 TextField 提供用户输入。
  • 感谢您的帮助,但我找到了问题所在。我错误地监控了函数 setMsg 而不是 useEffect 中的 msg。
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 2017-12-02
  • 2020-03-31
  • 2020-08-19
  • 2011-11-22
  • 2020-09-28
  • 2020-03-12
  • 1970-01-01
相关资源
最近更新 更多