【问题标题】:Formik checkbox won't re-renderFormik 复选框不会重新渲染
【发布时间】:2019-10-24 13:39:23
【问题描述】:

我正在使用 Formik 库,并且有一个简单的表单,其中包含一个复选框,我想在更改时提交:

    <Formik
      initialValues={{ toggle: false }}
      validateOnChange={false}
      validateOnBlur={false}
      onSubmit={(values, { validateForm }) => {
        validateForm().then(_errors => {
          console.log(values);
        });
      }}
    >
      {({ values, handleChange, handleSubmit }) => (
        <div>          
          <form onChange={handleSubmit}>
            <label>
              Toggle
              <input
                name="toggle"
                type="checkbox"
                checked={values.toggle}
                onChange={handleChange}
              />
            </label>
          </form>
        </div>
      )}
    </Formik>

由于某种原因,看起来输入在每次点击后都没有重新渲染,只有在每第二次点击之后才会重新渲染。因此复选框未更新 - 您必须单击两次才能更改(onChange 事件仅每第二次触发一次)

我可以通过添加 key 来强制它重新渲染,但这是一个 hack。

这里是沙盒:https://codesandbox.io/s/formik-checkbox-issue-ew65e

【问题讨论】:

    标签: reactjs formik


    【解决方案1】:

    您的问题是您尝试在每次更改时提交表单。

    理想情况下,您应该消除这种行为(也许使用 lodash ?):

    import _ from 'lodash'
    
    <form onChange={_.debounce(handleSubmit, 300)}>
    

    或者,如果您不使用 lodash,您可以通过将其包装在 setTimeout 中来异步调用 handleSubmit,如下所示:

    <form onChange={() => setTimeout(handleSubmit, 0)}>
    

    【讨论】:

    • 感谢您的回答,但我认为这无济于事 - form 在 Formiks 渲染道具功能内,因此这种反跳实际上只会延迟提交的执行。您可以在此处看到,它会在您单击复选框时多次提交表单:codesandbox.io/s/formik-checkbox-issue-78nkb 我可以将 debounce 移动到 onSubmit 处理程序,但是单击复选框时会出现难看的延迟 - 这不是您会做的事情
    • 我不确定我是否得到了您的问题...您之前尝试以相同的方式提交,但去抖动解决了您的更新问题。如果您不想在每次复选框更改时提交,则不应在 form 中将 handleSubmit 提供给 onChange
    • 我希望每个 onChange 都触发 onSubmit - 我的想法是在 handleSubmit 函数中去抖动,所以我不会真正提交每个更改。如果我理解您的建议,我应该在表单 onChange 上使用 debounce 来解决更新问题,但是我需要在 handleSubmit 函数中使用另一个来防止每次更改都提交?这令人困惑
    • 另外请注意,这只是一个复选框问题 - 如果我添加文本输入,则可以正常工作
    • 如果你不去抖动,你也可以在每次击键时调用handleSubmit。我发现了去抖动的问题。每次组件重新渲染时,函数引用都会丢失,这就是为什么它不能很好地工作的原因。我现在使用 React.useRef() 保留引用。你可以在这里看到它:codesandbox.io/s/formik-checkbox-issue-e3gpj
    猜你喜欢
    • 2023-01-13
    • 2019-03-27
    • 2019-07-28
    • 1970-01-01
    • 2022-09-30
    • 2021-05-01
    • 1970-01-01
    • 2020-12-30
    • 2016-05-09
    相关资源
    最近更新 更多