是的,react-hook-form:如何在表单中创建条件必填字段?

aad*_*dlc 6 reactjs material-ui yup react-hook-form

阿门德

我有一个使用 Material UI、react-hook-from 的表单,是的。

该表单具有三组无线电组(例如:radio-g1、radio-g2、radio-g3),并且用户必须从 radio-g1、radio-g2 中至少选择两个选项。此外,如果他们从 radio-g2 中选择“其他”选项,则会显示另一个必填字段 radio-g3。

最后,radio-g3 在隐藏时不是强制性的。

任何帮助将不胜感激。这是一些示例代码:

const schema = yup.object().shape({
  radioG1: yup.string().required("Please select an Avenger"),
  radioG2: yup.string().required("Please select an Avenger"),
  radioG3: yup.string().required("Please select an Avenger")
});

const App = () => {
  const [show, setShow] = useState(false);

  const methods = useForm({
    mode: "all",
    shouldUnregister: true,
    resolver: yupResolver(schema)
  });

  const {
    handleSubmit,
    control,
    formState: { errors }
  } = methods;

  const onSubmit = (data) => {
    alert(JSON.stringify(data));
  };

  return (
    <FormProvider {...methods}>
      <form onSubmit={handleSubmit(onSubmit)}>
        <FormControl
          variant="outlined"
          component="fieldset"
          margin="normal"
          error={!!errors.radioG1}
        >
          <FormLabel component="legend">Favorite Avengers:</FormLabel>
          <Controller
            render={({ field }) => (
              <RadioGroup {...field}>
                <FormControlLabel
                  value="Iron Man"
                  control={<Radio />}
                  label="Iron Man"
                />
                <FormControlLabel
                  value="Captain America"
                  control={<Radio />}
                  label="Captain America"
                />
              </RadioGroup>
            )}
            name="radioG1"
            control={control}
          />
          {errors.radioG1 ? (
            <FormHelperText>{errors?.radioG1?.message}</FormHelperText>
          ) : null}
        </FormControl>
        <div>
          <FormControl
            variant="outlined"
            component="fieldset"
            margin="normal"
            error={!!errors.radioG2}
          >
            <FormLabel component="legend">Favorite Avengers 2:</FormLabel>
            <Controller
              render={({ field }) => (
                <RadioGroup {...field}>
                  <FormControlLabel
                    value="Thor"
                    control={<Radio />}
                    label="Thor"
                  />
                  <FormControlLabel
                    value="Black Widow"
                    control={<Radio />}
                    label="Black Widow"
                  />
                </RadioGroup>
              )}
              name="radioG2"
              control={control}
            />
            {errors.radioG2 ? (
              <FormHelperText>{errors?.radioG2?.message}</FormHelperText>
            ) : null}
          </FormControl>
        </div>
        <Box mt={2} mb={2}>
          <Alert severity="info">
            <Link
              color="primary"
              underline="always"
              component="button"
              onClick={() => setShow(!show)}
            >
              Meh, I don't like these Avengers, SHOW MORE.
            </Link>
          </Alert>

          {show ? <OtherAvengers control={control} errors={errors} /> : null}
        </Box>
        <Box>
          <Button
            size="large"
            variant="contained"
            type="submit"
            color="primary"
          >
            Submit
          </Button>
        </Box>
      </form>
    </FormProvider>
  );
};

const OtherAvengers = ({ control, errors }) => {
  return (
    <div>
      <FormControl
        variant="outlined"
        component="fieldset"
        margin="normal"
        error={!!errors.radioG3}
      >
        <FormLabel component="legend">Favorite Avengers 3:</FormLabel>
        <Controller
          render={({ field }) => (
            <RadioGroup {...field}>
              <FormControlLabel value="Hulk" label="Hulk" control={<Radio />} />
              <FormControlLabel
                value="Ant-Man"
                label="Ant-Man"
                control={<Radio />}
              />
            </RadioGroup>
          )}
          name="radioG3"
          control={control}
        />
        {errors.radioG3 ? (
          <FormHelperText>{errors?.radioG3?.message}</FormHelperText>
        ) : null}
      </FormControl>
    </div>
  );
};
Run Code Online (Sandbox Code Playgroud)

此处的 Codesandbox https://codesandbox.io/s/conditional-mandatory-fields-7xojm?file=/src/index.jsx

Rya*_* Le 6

您可以使用when()radioG1并将您的,radioG2和传递radioG3给条件。

像这样的事情:

let schema = yup.object({
  isBig: yup.boolean(),
  count: yup.number().when('isBig', (isBig, schema) => {
    return isBig ? schema.min(5) : schema.min(0);
  }),
});
Run Code Online (Sandbox Code Playgroud)