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.
之外
我想在 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.