React MaterialUI - 单击按钮后在 TextField 组件上设置错误

Sco*_*ott 4 javascript validation reactjs material-ui

我有一个输入表单,我想在单击“搜索”按钮后验证输入字段。

我看到的大多数答案都是在用户将其输入表单时实时验证输入。
我不想这样做,因为我需要做的一些验证是一项成本高昂的操作(例如验证 API 密钥),因此在输入时不断检查它不是一种选择。
这也是一个无服务器的单页面应用程序,据我所知 -onSubmit会重新加载页面,所以我没有使用它。

我有一个与此类似的简单表格:

    const [formData, setFormData] = useState({});
    .......
    function handleFormChange(event) {
        let data = formData;
        data[event.target.name] = event.target.value;
        setFormData(data);
    }
    ........
    <form id="search-form" >
       <TextField name="apiKey" label="API Key" onChange={handleFormChange} defaultValue={formData.apiKey} />
       <TextField name='itemName' label="Enter Item" onChange={handleFormChange} />
       <Button name='search-button' onClick={validate} >Search</Button>
    </form>
Run Code Online (Sandbox Code Playgroud)

我不知道要输入什么内容validate()来设置文本字段上的错误或执行搜索。我尝试将一个函数传递到errorprop 中,以检查errors状态变量是否已填充,我尝试使用 refs 来设置错误状态,但我看不到任何可以设置错误状态的函数。

formData 变量将保存当前数据,因此很容易检查“此数据是否有效”,但对于我来说,我无法弄清楚如何手动触发错误状态。

我正在使用 React hooks 仅供参考

gdh*_*gdh 10

实现一个validation函数并在提交表单时调用它。维护状态error并在表单无效时更新它。使用 Material UI error属性在字段旁边显示错误。

工作演示在这里

代码片段

export default () => {
  const [formData, setFormData] = useState({
    apiKey: "test"
  });
  const [isFormInvalid, setIsFormInvalid] = useState(false);

  const validate = values => {
    if (values.apiKey !== "") {
      setIsFormInvalid(false);
    } else {
      setIsFormInvalid(true);
    }
  };
  function handleFormChange(event) {
    let data = formData;
    data[event.target.name] = event.target.value;
    setFormData(data);
  }
  const handleSubmit = e => {
    e.preventDefault();
    if (validate(formData)) {
      // proceed to submit
    }
  };
  return (
    <div className="col-sm-12">
      <h1>My Form</h1>
      <form onSubmit={handleSubmit} id="search-form">
        <TextField
          error={isFormInvalid}
          helperText={isFormInvalid && "api key required"}
          name="apiKey"
          label="API Key"
          onChange={handleFormChange}
          defaultValue={formData.apiKey}
        />

        <Button type="submit" name="search-button" onClick={validate}>
          Search
        </Button>
      </form>
    </div>
  );
};
Run Code Online (Sandbox Code Playgroud)

  • @gdh 你的“validate”函数没有返回值。它应该返回一个“boolean”,因为您在“if”语句中调用该函数。另外,“formData”常量中的“TEST”默认值是不需要的,而且会造成混乱。当传递空字符串时,原始代码由于变量未定义而导致初始验证失败。它仅在第一次成功验证后才起作用。我仍然赞成你的回答,因为尽管如此,它还是非常有帮助的。非常感谢您的回答。 (2认同)