我使用React-Hook-FormZodMaterial-UI来创建Textfield. 我现在的问题是,当我提交表单时,amount文本字段没有输出任何值?我的代码中遗漏了什么吗?

CODESANDBOX->CLICK HERE

function App() {
  const schema = zod.object({
    amount: zod.string().optional()
  });

  type FormData = zod.infer<typeof schema>;

  const resolver = zodResolver(schema);

  const {
    handleSubmit,
    formState: { errors },
    register
  } = useForm<FormData>({
    mode: "onSubmit",
    resolver
  });

  const onSubmit = (data: any) => console.log(data);
  console.log(errors);

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <Stack spacing={2} direction="row" alignItems="center">
        <CurrencyInput
          label="Amount"
          type="text"
          {...register("amount")}
          fullWidth
        />
        <Button type="submit" variant="contained" fullWidth>
          Submit
        </Button>
      </Stack>
    </form>
  );
}

推荐答案

您应该使用MuiTextField组件的inputProps propregisterprops 传递给渲染的input元素.这意味着将一个inputPropsprops 传递给你的CurrencyInput组件.

示例:

<CurrencyInput
  label="Amount"
  type="text"
  inputProps={{ ...register("amount") }}
  fullWidth
/>

Edit material-ui-and-react-hook-form-not-logging-values

代码

CurrencyInput.tsx

import {
  InputAdornment,
  TextField as MuiTextField,
  TextFieldProps
} from "@mui/material";

export default function CurrencyInput({ onChange, ...props }: TextFieldProps) {
  const handleChange = (event: any) => {
    let value = event.target.value.replace(/[^\d.]/g, "");

    // Split the input by the decimal point to check for decimal places
    const parts = value.split(".");

    // Ensure there are at most 2 decimal places
    if (parts.length > 1) {
      value = `${parts[0]}.${parts[1].slice(0, 2)}`;
    }

    // Use a regular expression to add commas for thousands
    event.target.value = value.replace(/\B(?=(\d{3})+(?!\d))/g, ",");

    if (onChange) onChange(event);
  };

  return (
    <MuiTextField
      type="text"
      placeholder="0.00"
      onChange={handleChange}
      sx={{
        "& .MuiFormHelperText-root": {
          color: "gray.gray-9"
        }
      }}
      InputProps={{
        startAdornment: (
          <InputAdornment position="start">{"USD"}</InputAdornment>
        )
      }}
      {...props}
    />
  );
}

App.tsx

function App() {
  const schema = zod.object({
    amount: zod.string().optional()
  });

  type FormData = zod.infer<typeof schema>;

  const resolver = zodResolver(schema);

  const {
    handleSubmit,
    formState: { errors },
    register
  } = useForm<FormData>({
    mode: "onSubmit",
    resolver
  });

  const onSubmit = (data: any) => console.log({ data });
  console.log({ errors });

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <Stack spacing={2} direction="row" alignItems="center">
        <CurrencyInput
          label="Amount"
          type="text"
          inputProps={{ ...register("amount") }}
          fullWidth
        />
        <Button type="submit" variant="contained" fullWidth>
          Submit
        </Button>
      </Stack>
    </form>
  );
}

Reactjs相关问答推荐

Inbox Enum类型以React组件状态时出现TypScript错误

Reaction Axios多部分/表单-数据数组不工作

FireBase未与Reaction应用程序连接

子路径上未定义useMatches句柄

在继承值更改时重置react 挂钩窗体字段值

React路由dom布局隐藏内容

如何动态地改变<; Select >;React和Tailwind元素?

使用以Jest 的方式返回 Promise 的方法来模拟可构造的 API 类时出现问题

尽管所有页面在 Reactjs 中都是公开的,但始终导航到特定页面

如何解决使用react-hook-form和yup动态创建的输入不集中的问题

Mui DataGrid 在第二页和前一页上显示项目时出现问题

提前输入错误:选项类型上不存在属性名称

Spring Boot + React + MySQL应用的架构层面有哪些?

卸载 React 组件时未清除本地存储项目

如何在屏幕上使用相同的可重用

React 测试库 - 如何断言异步函数之间的中间状态?

如何使用 React 更改 Material UI 中 ButtonGroup 的 colored颜色 ?

react 本机日历

将 dict 值转换并插入到react 钩子的列表中

为什么这两个 div 的渲染方式不同?