【问题标题】:setState not work by onChange inside useStatesetState 不能通过 useState 中的 onChange 工作
【发布时间】:2020-02-10 11:52:49
【问题描述】:

我正在使用 useState Hook 来存储表单以在用户单击时管理视图。界面显示良好,但我无法在输入字段中输入值。谁能告诉我为什么?谢谢。

const [url, seturl] = useState({url: ''});
const changeUrl = (field) => (event) => {
    seturl({
    ...url,
    [field]: event.target.value,
   });
 };
const [step, setStep] = useState(
   <form>
     <input type="text" value={url.url} onChange={changeUrl('url')}/>
    </form>
);
return (
  <div>{step}</div>
);

【问题讨论】:

  • 你为什么将形式作为一种状态?您在更新输入时没有设置状态(setStep)。您可以通过一种非常简单的方式实现这一点。请检查我的解决方案

标签: reactjs react-hooks use-state


【解决方案1】:

如果你要向onChange 上的函数传递一些东西,你需要这样称呼它:

onChange={e => seturl({ url: e.target.value })}

或者您可以简单地通过以下方式实现:

const [url, setUrl] = useState('');

return (
  <div>
    <form>
     <input type="text" value={url} onChange={e => setUrl(e.target.value)}/>
    </form>
  </div>
);

从上面的例子中得到的好处是使用钩子来方便自己并摆脱对对象的管理。如果你有更多像urlpage这样的字段,你可以创建多个状态,比如:

const [url, setUrl] = useState('');
const [page, setPage] = useState('');

希望这会对你有所帮助。

【讨论】:

  • @Tong 答案已更新。这也适用于你现在的对象。
  • 它不起作用@Zeeshan,我无法输入任何内容。我错过了什么吗? const [url, setUrl] = useState({url: ''"}); const [step, setStep] = useState( &lt;form&gt; &lt;input type="text" value={url.url} onChange={e =&gt; setUrl({ url: e.target.value })}/&gt; &lt;/form&gt; ); return ( &lt;div&gt;{step}&lt;/div&gt; ) }
  • 我在这里创建了一个沙箱:codesandbox.io/s/gracious-grothendieck-p93no 问题是您正在通过state 渲染输入框。状态没有得到更新,这就是它没有重新渲染的原因。
  • 感谢@Zeeshan 的全力支持,我接受了您的解决方案。所以我不能使用 useState 来存储像我的实现这样的表单?
  • 是的。你可以回JSX
【解决方案2】:

您需要调用changeURL 函数onChange,而不是每次。

使用您的代码,每次渲染都会触发 changeUrl('url')。 为避免这种情况,您需要在输入字段的事件中将其作为函数调用:onChange={e =&gt; changeUrl(e)}

【讨论】:

  • 感谢您的解决方案,@TBouder。因此,在我的实现中,changeUrl('url') 函数将在每次渲染时触发,并且在我输入的任何时候,它都不会运行该函数。但是为什么我可以在useState之外使用呢?
【解决方案3】:
 const [url, seturl] = useState("url");

  const changeUrl = event => {
    seturl( event.target.value);
  };

  return (
    <div>
      <form>
        <input type="text" value={url} onChange={(e)=>changeUrl(e)} />
        <p>URL: {url}</p>
      </form>
    </div>
  );

【讨论】:

  • 感谢您的解决方案。但我想将元素存储在 useState 以用于在表单输入之间更改视图。但是在我的实现中,我无法在输入字段中输入任何内容。
  • 你试过我的解决方案了吗?你还需要更新什么?
  • 是的,我做到了。它奏效了,我知道。但是我想使用 useState 来存储 JSX,因为我想更改表单的视图(例如:使用按钮从表单 SignIn 和 SignUp 更改视图)但是当我像我的实现一样存储时,我无法在输入字段中输入任何内容.
  • 你不需要将整个 JSX 存储在 State 中。您可以添加逻辑和控制 jsx 视图。例如:对于登录和注册按钮,您可以使用类似: [isAccount, setIsAccount] = useState(false);在 jsx 中:{isAccount ? loginBtn : signUpBtn} 根据需要为 isAccount 状态添加逻辑
  • 我明白了,谢谢@waqas
猜你喜欢
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多