【问题标题】:Initializing and setting Material UI TextField state as a number将 Material UI TextField 状态初始化和设置为数字
【发布时间】:2021-04-12 12:23:52
【问题描述】:

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

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

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

{
    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
    };
};

【问题讨论】:

    标签: reactjs graphql-js


    【解决方案1】:

    您需要更改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 });
    };
    

    【讨论】:

    • 我刚刚尝试过,但它们仍然在控制台中以字符串形式返回。
    • 实际上,当用户在字段中输入值时,这会起作用。但是,我仍然需要将状态初始化为一个数字,但我不希望它被设置为任何值。
    • 您必须在服务器端允许可空值,然后在前端的初始状态中将它们设置为空。
    • 感谢您的建议,我现在已经开始工作了。
    • 但是,允许可为空的值然后在提交验证时检查输入的值是否不为空,这不是坏习惯吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-02
    • 2019-05-20
    • 2019-05-08
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多