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

使用React Hook Form时,如何重置Choc-UI Chakra-Autocomplete组件?

解决Choc-UI Autocomplete结合React Hook Form重置后UI未清空的问题

问题分析

你遇到的核心问题是:Choc-UI的AutoComplete组件内部维护了独立的输入框状态,当React Hook Form调用reset后,虽然表单字段值已清空,但组件未同步更新输入框的显示内容,导致UI仍保留之前的选中值。

解决方案

通过以下两步修改即可解决:

1. 自定义Autocomplete组件添加状态同步逻辑

修改你的自定义Autocomplete组件,通过useRef获取AutoComplete实例,并监听传入的value变化,当值为空时调用组件内置的reset方法清空UI:

import { useRef, useEffect } from 'react';
import { Icon, InputGroup, InputRightElement } from "@chakra-ui/react";
import {
  AutoComplete,
  AutoCompleteInput,
  AutoCompleteItem,
  AutoCompleteList,
} from "@choc-ui/chakra-autocomplete";
import { FiChevronDown, FiChevronRight } from "react-icons/fi";

interface Props {
  onChange: (arg0: string) => void;
  list: { [key: string | number]: any }[];
  labelKey: string;
  valueKey: string;
  value?: string;
  placeholder: string;
}

const Autocomplete = ({
  onChange,
  list,
  labelKey: label,
  valueKey,
  value,
  placeholder,
}: Props) => {
  // 获取AutoComplete组件实例
  const autoCompleteRef = useRef<{ reset: () => void }>(null);

  // 监听value变化,为空时重置组件
  useEffect(() => {
    if (!value) {
      autoCompleteRef.current?.reset();
    }
  }, [value]);

  return (
    <AutoComplete 
      ref={autoCompleteRef}
      openOnFocus 
      onChange={onChange} 
      value={value}
    >
      {({ isOpen }: { isOpen: boolean }) => (
        <>
          <InputGroup>
            <AutoCompleteInput
              placeholder={placeholder}
              type="text"
              errorBorderColor="red.300"
            />
            <InputRightElement
              children={<Icon as={isOpen ? FiChevronRight : FiChevronDown} />}
            />
          </InputGroup>
          <AutoCompleteList>
            {list.map((_list, cid) => (
              <AutoCompleteItem
                key={`option-${cid}`}
                label={_list[label]}
                value={_list[valueKey]}
                textTransform="capitalize"
              >
                {_list[label]}
              </AutoCompleteItem>
            ))}
          </AutoCompleteList>
        </>
      )}
    </AutoComplete>
  );
};

export default Autocomplete;

2. 使用useWatch替代getValues同步表单值

在使用Autocomplete的地方,用React Hook Form的useWatch监听字段值变化,确保组件能及时响应值的更新(getValues不会触发组件重渲染,无法同步UI):

import { useWatch } from 'react-hook-form';

// ...其他代码

<GridItem rowSpan={1} colSpan={1}>
  <FormControl isInvalid={!!errors.plan}>
    <FormLabel>Plan</FormLabel>
    <Autocomplete
      placeholder="Plan"
      labelKey="plan"
      valueKey="_id"
      list={plan}
      // 使用useWatch监听plan字段的实时值
      value={useWatch({ name: 'plan' })}
      onChange={(val) => setValue("plan", val)}
    />
    {errors.plan && (
      <FormErrorMessage>{errors.plan.message}</FormErrorMessage>
    )}
  </FormControl>
</GridItem>

原理说明

  • 利用useRef获取Choc-UI AutoComplete的实例,调用其内置的reset方法可以直接清空输入框的显示内容并重置内部状态。
  • useWatch会在表单字段值变化时自动触发组件重渲染,确保Autocomplete组件能接收到最新的空值,进而触发重置逻辑。

内容的提问来源于stack exchange,提问作者Muhammad Mubashirullah Durrani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:15:03