Отображение элементов в форме (для Formik) - PullRequest
0 голосов
/ 25 февраля 2020

В своей форме я использую Formik / Yup для проверки. В настоящее время это прекрасно работает в моей форме:

export default function AddUserPage() {
  const [firstName, setFirstName] = useState("");
  const [email, setEmail] = useState("");

  return (
    <div>
      <Formik
        initialValues={{ firstName: "", email: "" }}
        onSubmit={(values, actions) => {
          setTimeout(() => {
            alert(JSON.stringify(values, null, 2));
            actions.setSubmitting(false);
          }, 1000);
        }}
        validationSchema={schema}
      >
        {props => {
          const {
            values: { firstName, lastName, email, password, phone },
            errors,
            touched,
            handleChange,
            isValid,
            setFieldTouched
          } = props;
          const change = (name: string, e: any) => {
            e.persist();
            handleChange(e);
            setFieldTouched(name, true, false);
          };
          return (
            <div className="main-content">
              <form style={{ width: "100%" }}>
                <div>
                  <TextField
                    variant="outlined"
                    margin="normal"
                    id="firstName"
                    name="firstName"
                    helperText={touched.firstName ? errors.firstName : ""}
                    error={touched.firstName && Boolean(errors.firstName)}
                    label="First Name"
                    //onChange={e => setFirstName(e.target.value)}
                    value={firstName}
                    onChange={change.bind(null, "firstName")}
                  />
                  <br></br>
                  <TextField
                    variant="outlined"
                    margin="normal"
                    id="email"
                    name="email"
                    helperText={touched.email ? errors.email : ""}
                    error={touched.email && Boolean(errors.email)}
                    label="Email"
                    value={email}
                    onChange={change.bind(null, "email")}
                  />
                  <br></br>
                </div>
              </form>
            </div>
          );
        }}
      </Formik>
    </div>
  );
}

Однако вместо того, чтобы вводить все, я хочу отобразить свои текстовые поля. Как я могу сопоставить свои текстовые поля?

Я пробовал что-то подобное, но я получаю ошибки для helperText и свойства ошибок:

{[{ label: "First Name", state: firstName , type: "text", function: setFirstName},
{ label: "Email", state: email , type: "text", function: setEmail},
  ]}.map((item, index) => (
  <div>
    <TextField
      id="outlined-basic"
      key={index}
      label={item.label}
      variant="outlined"
      type= {item.type}
      helperText= {touched[item.state] ? errors[item.state] : ""}
      onChange={change.bind(null, state)}        
    />
    <br></br><br></br>
  </div>
)

Здесь я получаю ошибку в тексте помощника:

Элемент неявно имеет тип 'any', потому что выражение типа 'any' нельзя использовать для индексации типа 'FormikTouched <{firstName: string; lastName: строка; электронная почта: строка; пароль: строка; телефон: строка; }> '

Я тоже пытался добавить это, но это также дает мне ошибку:

helperText = {touched.item.state}

1 Ответ

0 голосов
/ 26 февраля 2020

Похоже, у вас есть синтетическая c фигурная скобка с ошибкой перед .map

этот код отображает некоторые jsx с картой:

[
  { label: "First Name",  type: "text"},
{ label: "Email",  type: "text"},
  ].map((item, i) => (
  <div>
    <TextField
      key={i}
      label={item.label}
      type= {item.type}    
    />
  </div>
)
...