【问题标题】:MUI & Formik: Validation doesn't trigger for useFieldMUI & Formik:验证不会触发 useField
【发布时间】:2021-12-23 20:41:22
【问题描述】:

具有最小工作示例的 Codesandbox:https://codesandbox.io/s/mystifying-lake-m0oxc?file=/src/DemoForm.tsx

基本上,我有一个 AutoComplete 下拉列表,它使用 useField 钩子绑定到 Formik 表单中。这会在任何更改时正确设置值,但验证似乎不会在我期望的时候触发。

验证成功运行并在以下情况下消除错误:

  1. 另一个字段已更改
  2. 在下拉列表中选择一个值后点击“背景”

我的预期和想要的是验证应该在选择值时立即运行。

复制:

  1. 点击类别下拉菜单
  2. 选择一个值,关闭下拉菜单
  3. 确认错误仍然显示(在字段和打印输出中)
  4. 单击屏幕上的其他位置。这应该会触发验证并清除错误。

有什么建议吗?

编辑: 我已经测试了一个使用 react-select 作为下拉菜单的等效实现,并且遇到了同样的问题,所以我认为它与 MUI 没有直接关系。

【问题讨论】:

  • 需要专门使用useField吗?
  • 我使用 useField 是因为我想将(稍微复杂的)表单输入拆分为一个单独的组件并将其导入主表单。有没有更好的方法?

标签: reactjs material-ui formik formik-material-ui


【解决方案1】:

我刚刚根据您提供的工作示例进行了复制,并意识到您手动设置了helpers.setTouched

只是不要过度使用setTouched,如果您从自动完成中删除所选项目,您也需要处理。

      <Autocomplete
        disablePortal
        id="category-selector"
        options={options}
        onBlur={() => helpers.setTouched(true, true)}
        isOptionEqualToValue={(option, value) => option.id === value.id}
        onOpen={() => helpers.setTouched(true, true)}
        onChange={(_, option) => {
          if (option) {
            helpers.setValue(option.id);
          } else {
            helpers.setValue(0);
          }
        }}
        renderInput={(params) => (
          <TextField
            {...params}
            label="Category"
            error={meta.touched && Boolean(meta.error)}
          />
        )}
      />

【讨论】:

  • 谢谢,成功了!我还必须删除 onOpen={() =&gt; helpers.setTouched(true, true)},但现在它的行为似乎符合我的要求。
  • @Lars-OlavVågene 很高兴有帮助。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2019-11-12
  • 2021-10-23
  • 2020-02-21
  • 2016-10-03
  • 1970-01-01
  • 2015-06-23
相关资源
最近更新 更多