React TypeScript 中的向导形式 react-final-form

Wizard form in React TypeScript react-final-form

我想在 React.js 中使用带有 TypeScript 的 react-final-form 创建一个 3 步表单。我从 codesandbox 中获取了模式,但我对 const static Page 有疑问。我不知道如何将它重写为 TypeScript,老实说我不知道​​它是如何工作的...

到目前为止我得到了这个:

Wizard.tsx

  import React, { useState } from "react";
import { Form } from "react-final-form";

type Wizard = {
  onSubmit: (values: Values) => void;
};

type Values = {
  name: String;
  surname: String;
  email: String;
  password: String;
  city: String;
  birthDay: Number;
  birthMonth: Number;
  birthYear: Number;
};

// 3-steps form
const Wizard: React.FC<Wizard> = ({ onSubmit, children }) => {
  const [page, setPage] = useState(0);
  const [values, setValues] = useState<Values | undefined>(undefined);
  const activePage = React.Children.toArray(children)[page];
  const isLastPage = page === React.Children.count(children) - 1;

  const static Page = (children) => children;

  // next page
  const next = (values: Values) => {
    setPage(Math.min(page + 1, React.Children.count(children)));
    setValues(values);
  };

  // previous page
  const previous = () => {
    setPage(Math.max(page - 1, 0));
  };

  const handleSubmit = (values: Values) => {
    const isLastPage = page === React.Children.count(children) - 1;
    if (isLastPage) {
      return onSubmit(values);
    } else {
      next(values);
    }
  };

  return (
    <Form onSubmit={handleSubmit}>
      {({ handleSubmit, submitting, values }) => {
        <form onSubmit={handleSubmit}>
          {activePage}
          <div className="buttons">
            {page > 0 && (
              <button type="button" onClick={previous}>
                « Powrót
              </button>
            )}
            {!isLastPage && <button type="submit">Dalej »</button>}
            {isLastPage && (
              <button type="submit" disabled={submitting}>
                Zakończ
              </button>
            )}
          </div>
        </form>;
      }}
    </Form>
  );
};

export default Wizard;

Register.tsx

    import React from "react";
import Wizard from "./wizard";

import styles from "./register.module.scss";

const Register: React.FC = () => {
  const onSubmit = () => {
    console.log("onSubmit");
  };

  return (
    <Wizard onSubmit={onSubmit}>
      <Wizard.Page>Page 1</Wizard.Page>
      <Wizard.Page>Page 2</Wizard.Page>
      <Wizard.Page>Page 3</Wizard.Page>
    </Wizard>
  );
};

export default Register;

错误 静态: const static: any Variable 'static' implicitly has an 'any' type.ts(7005)

在页面上: const Page: (children: any) => any ',' expected.ts(1005)

只需将 Page 作为单独的 FC 拉出即可。没有充分的理由将其设为 <Wizard.Page> 而不是 <WizardPage>

可以 通过让 Wizard 成为 interface WizardWithPage extends React.FC 等等来保持它的状态。但这是浪费精力,只需拉 Page 在 `Wizard.

之外