You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何清空Formik表单字段?解决清空后输入框仍显示值的问题

问题原因

你的问题出在输入框没有和Formik的字段状态做双向绑定:

  • SearchInput组件里的Styled.Input没有绑定Formik管理的字段值,导致Formik调用resetForm()清空状态后,输入框无法同步更新显示内容。
  • 手动给Field组件传递value={values.dog}属于冗余操作,Field组件会自动将Formik的字段props传递给自定义组件。
解决方案

1. 修改SearchInput组件,绑定Formik字段值

从useField钩子中获取字段的当前值,绑定到输入框的value属性上,确保输入框显示与Formik状态同步:

const SearchInput = ({ name, ...props }) => {
  // 获取field对象,包含当前字段的value
  const [field, , helpers] = useField(name);
  const { setValue } = helpers;

  const handleChange = (value: string | null) => {
    setValue(value);
  };

  return (
    <Styled.Wrapper>
      <Styled.Input
        {...props}
        value={field.value} // 绑定Formik的字段值到输入框
        onChange={handleChange}
        placeholder="Search for job name"
        searchType={'primary'}
      />
    </Styled.Wrapper>
  );
};

export default SearchInput;

2. 调整Form组件,移除冗余的value传递

去掉Field组件上手动传递的value属性,让Formik自动管理字段props:

const Form = () => {
  const handleClearFilters = (resetForm) => {
    resetForm(); // 直接调用重置到initialValues
  };

  return (
    <Formik
      initialValues={{
        dog: '',
      }}
      onSubmit={() => {
        // onsubmit functionality
      }}
    >
      {({ resetForm }) => (
        <FormikForm>
          {/* 移除手动传递的value,由Field自动处理 */}
          <Field name="dog" type="text" as={SearchInput} />
          <Styled.ButtonsWrapper>
            <Styled.Button onClick={() => handleClearFilters(resetForm)} kind='secondary'>Clear filters</Styled.Button>
            <Styled.Button type='submit'>Search</Styled.Button>
          </Styled.ButtonsWrapper>
        </FormikForm>
      )}
    </Formik>
  );
};

export default Form;

修改后,点击“Clear filters”按钮调用resetForm()时,Formik会将字段值重置为初始空字符串,输入框会同步显示为空,实现预期效果。

内容的提问来源于stack exchange,提问作者huhWell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 13:09:29