将 Material UI TextField 状态初始化并设置为数字

Initializing and setting Material UI TextField state as a number

我正在开发锻炼记录器,用户可以在其中记录他们的锻炼集。我正在为这个项目使用 MERNG 堆栈。目前,我正在研究在前端记录一组的验证。这将要求用户提供以下内容:表格中的练习名称(字符串)、重量(浮点数)、次数(整数)和注释(字符串 - 可选)。我遇到的问题是初始化和设置重量和重复次数。这是我为这些字段设置的初始状态:

{
    exerciseName: "",
    weight: "", 
    reps: "",
    notes: "",
}

我意识到这将 return 权重和代表作为字符串,所以我也尝试了这个(尽管我不希望字段已经为它们输入了权重和代表,以防万一他们忘记自己输入这些并将其添加到他们的日志中)。

{
    exerciseName: "",
    weight: 0,
    reps: 0,
    notes: "",
  }

这种方法在一定程度上有效,因为控制台将它们记录为数字,但是当用户在 TextField(Material UI) 中更改它时,它们最终还是以字符串形式提交.因此,我从后端收到 400 状态代码,因为它们应该是 Float 和 Int。我怎样才能实现将这些值初始化和设置为数字的结果,所以不会引发错误?

表格

const [errors, setErrors] = useState({}); 

const { onChange, onSubmit, values } = useForm(registerSet, { // Uses a hook for forms
    exerciseName: "",
    weight: "",
    reps: "",
    notes: "",
});

return (
  <form
    onSubmit={onSubmit}
    id="addSetForm"
    noValidate
    autoComplete="off"
  >
    <TextField
      name="exerciseName"
      label="Exercise Name"
      variant="outlined"
      fullWidth
      select
      className={classes.formInput}
      value={values.exerciseName}
      error={errors.exerciseName ? true : false}
      onChange={onChange}
    >
      <MenuItem key="Bench Press" value="Bench Press">
        Bench Press
      </MenuItem>

      <MenuItem key="Deadlift" value="Deadlift">
        Deadlift
      </MenuItem>

      <MenuItem key="Squat" value="Squat">
        Squat
      </MenuItem>
    </TextField>

    <Grid container spacing={1} className={classes.formInput}>
      <Grid item xs={6}>
        <TextField
          name="weight"
          label="Weight"
          type="number"
          variant="outlined"
          fullWidth
          value={values.weight}
          error={errors.weight ? true : false}
          onChange={onChange}
        />
      </Grid>

      <Grid item xs={6}>
        <TextField
          name="reps"
          label="Reps"
          type="number"
          variant="outlined"
          fullWidth
          value={values.reps}
          error={errors.reps ? true : false}
          onChange={onChange}
        />
      </Grid>
    </Grid>
  </form>
)

formHooks.js (useForm)

export const useForm = (callback, initialState = {}) => {
    const [values, setValues] = useState(initialState);

    const onChange = (event) => {
        setValues({ ...values, [event.target.name]: event.target.value });
    };

    const onSubmit = (event) => {
        event.preventDefault();
        callback();
    };

    return {
        onChange,
        onSubmit,
        values
    };
};

您需要更改 onChange 功能。如果你 console.log(typeof event.target.value) 它将是 string

const onChange = (event) => {
    setValues({ ...values, [event.target.name]: e.target.type === 'number' ? parseInt(e.target.value) : e.target.value });
};