我正在和ReactJsReact-Hook-Form一起工作.我有一个组件,里面有一个汽车品牌的精选列表.当组件最初呈现时,我希望 Select 列表选项默认为值Other,并有一个文本输入显示,以便用户可以输入 Select 列表中不存在的品牌.如果用户从 Select 列表中 Select 了一个现有的品牌,那么文本输入应该被隐藏.下面是我的代码:

export default function Test() {
    
    type Car = {
        brandId: number,
        brand: string
    }

    const defaultBrandId = 5; // 'Other'
    const [showBrandInput, setShowBrandInput] = useState<boolean>(true);
    const { register, handleSubmit, setValue, getValues, watch} = useForm<Car>();

    useEffect(() => {
        fetchCarBrands();
    }, [])

    useEffect(() => {
        setShowBrandInput(getValues().brandId === defaultBrandId);
    }, [watch('brandId')]);

    function fetchCarBrands() {
        // API call to get select list data
        // Set default select list value to 'Other'
        setValue("brandId", defaultBrandId);
    }

    function onSubmit() {
        alert("form submitted");
    }

    return (
        <>
            <Form onSubmit={handleSubmit(onSubmit)} noValidate>
                <Div className="mb-4">
                    <FormLabel>Brand</FormLabel>
                    <Row>
                        <Col>
                            <Form.Select {...register("brandId")}>
                                <option value="1">Chevy</option>
                                <option value="2">Ford</option>
                                <option value="3">Honda</option>
                                <option value="4">Toyota</option>
                                <option value="5">Other</option>
                            </Form.Select>
                        </Col>
                        <Col>
                            {showBrandInput &&
                                <Form.Control type="text" {...register("brand")} />
                            }
                        </Col>
                    </Row>
                </Div>
                <Button type="submit" className="btn-dk-blue">
                    Submit
                </Button>
            </Form>
        </>
    )
}

上述代码最初正确地呈现了默认的 Select 列表值Other,并且文本输入是可见的.如果我随后从 Select 列表中 Select 了不同的值,则文本输入将被隐藏.我的问题是,如果我随后从 Select 列表中重新 Select Other,文本输入不会显示.

推荐答案

问题

这是一个比较错误类型的简单 case .上面的代码是attempting to compare a string to a number,这就是为什么它只在加载时显示.如果在使用效果中将两者都转换为数字(或字符串),则问题将得到解决.

下面是您的代码的一个工作示例(带有一些修改的HTML,因为我没有与您相同的组件)with both variables cast as integers以进行正确的比较.

有关更改的详细信息以及做出这些更改的原因,请参阅本文底部.

import { useEffect, useState } from "react";
import { useForm } from "react-hook-form";

export default function CarList() {
  type Car = {
    brandId: number;
    brand: string;
  };

  const defaultBrandId = 5; // 'Other'
  const [showBrandInput, setShowBrandInput] = useState<boolean>(true);
  const { register, handleSubmit, setValue, getValues, watch } = useForm<Car>({
    defaultValues: { brandId: 5 },
  });
  const CurrentBrandID = watch("brandId");

  const onSubmit = (data: Car) => {
    console.log("form submitted with data:", data);
  };

  useEffect(() => {
    setShowBrandInput(+getValues().brandId === +defaultBrandId);
  }, [CurrentBrandID]);

  return (
    <>
      <form onSubmit={handleSubmit(onSubmit)} noValidate id="carForm">
        <div className="mb-4">
          <label>Brand</label>
          <div>
            <select {...register("brandId")}>
              <option value="1">Chevy</option>
              <option value="2">Ford</option>
              <option value="3">Honda</option>
              <option value="4">Toyota</option>
              <option value="5">Other</option>
            </select>
          </div>
          <div>
            {showBrandInput && <input type="text" {...register("brand")} />}
          </div>
        </div>
        <button type="submit" className="btn-dk-blue" form="carForm">
          Submit
        </button>
      </form>
    </>
  );
}

变更:

  1. Use Effect现在正在判断数字5是否等于ID作为一个数字.by adding + symbol, we are casting them as integers
  2. reordered placement of useEffects,因为它们应该总是排在它们使用或实现的功能的最后或之后
  3. 删除所需的useEffect和setValue-这应该完成via useForm 100 object

Reactjs相关问答推荐

如何实现黑暗模式 map ?

ReferenceError:未在Redux组件中定义窗口

react 派生状态未正确更新

在react.js的条形图中获取错误&unfined是不可迭代的

react 路由GUGUD Use Effect无法通过useNavigate正常工作

使用`Link`包装`tr`标记会在Next.js中产生水合错误14

Reaction Google Maps API无法获取标题

生产部署:控制台中 Firebase 无效 api 密钥错误

React Js和Firestore中如何将当前ID与集合中的ID查询以仅显示具有相似字段和值的文档-第二部分

ReactJS中使用setState方法时,Context内部的State未进行更新

redux 工具包使用中间件构建器函数时,必须返回一个中间件数组

字段是必需的,当它没有定义时

计数器递增 2 而不是 1

从 React 应用程序调用未经身份验证的 graphql 查询时出现错误:没有当前用户

在按钮单击中将动态参数传递给 React Query

使用 React.UseEffect 从 api 获取但我的清理返回不起作用

React Router 6.4CreateBrowserRouter子元素不显示

如何通过 Material ui select 使下拉菜单下拉

将鼠标悬停在仅适用于该类的第一个实例的 p5.js 类上

在渲染不显示子元素之后,再次渲染时,子元素状态数据完全消失了.为什么会这样以及如何防止它发生?