Я относительно новичок в SPFX WebPart + React + Fluent UI, и я ищу решение для использования раскрывающегося поля в форме. В настоящее время возникает ошибка, если я добавляю раскрывающийся список, как в описании пользовательского интерфейса Fluent.
Type '{placeholder: string; метка: строка; варианты: IDropdownOption []; требуется: true; } 'отсутствуют следующие свойства из типа' FieldProps ': field, form, meta
Код выглядит так:
<Stack tokens={stackTokens}>
<TextField name="teamName" label="Team Name" />
<TextField name="description" label="Description" multiline rows={3} />
<FormikDropdown
placeholder="Select an option"
label=" Template"
options={options}
required
{...mapFieldToChoiceGroup(fieldProps)}
/>
<TextField // prettier-ignore
label="Url"
prefix="https://"
style={selectedValue == "test" ? {display:"none"}:{display:"block"}}
/>
</Stack>
Я не знаю, где из formik я могу получить этот реквизит для выпадающего компонента ...
Вторая проблема связана с проверкой текстового поля. Если я хочу скрыть поле с меткой «URL», как я могу сделать это динамически на основе выбора?
Пример полного кода:
import { Card, CardContent, Step, StepLabel, Stepper } from '@material-ui/core';
import { Form, Formik, FormikConfig, FormikValues } from 'formik';
import { FormikDropdown, mapFieldToChoiceGroup } from 'formik-office-ui-fabric-react';
import { Dropdown, DropdownMenuItemType, IDropdownOption, IDropdownStyles } from 'office-ui-fabric-react';
import { DefaultButton } from 'office-ui-fabric-react/lib/Button';
import { PrimaryButton } from 'office-ui-fabric-react/lib/components/Button/PrimaryButton/PrimaryButton';
import Stack from 'office-ui-fabric-react/lib/components/Stack/Stack';
import { TextField } from 'office-ui-fabric-react/lib/components/TextField/TextField';
import * as React from 'react';
import { useState } from 'react';
import { mixed, number, object } from 'yup';
export default function Home() {
return (
<Card>
<CardContent></CardContent>
<FormikStep label="Team Information">
<Stack tokens={stackTokens}>
<TextField name="teamName" label="Team Name" />
<TextField name="description" label="Description" multiline rows={3} />
<FormikDropdown
placeholder="Select an option"
label=" Template"
options={options}
required
/>
<TextField // prettier-ignore
label="Url"
prefix="https://"
style={firstTextFieldValue == "test" ? { display: "none" } : { display: "block" }}
/>
</FormikStep>
</CardContent>
</Card >
);
}
export interface FormikStepProps
extends Pick<FormikConfig<FormikValues>, 'children' | 'validationSchema'> {
label: string;
}
export function FormikStep({ children }: FormikStepProps) {
return <>{children}</>;
}
export function FormikStepper({ children, ...props }: FormikConfig<FormikValues>) {
const childrenArray = React.Children.toArray(children) as React.ReactElement<FormikStepProps>[];
const [step, setStep] = useState(0);
const currentChild = childrenArray[step];
const [completed, setCompleted] = useState(false);
function isLastStep() {
return step === childrenArray.length - 1;
}
return (
<Formik
{...props}
validationSchema={currentChild.props.validationSchema}
onSubmit={async (values, helpers) => {
if (isLastStep()) {
await props.onSubmit(values, helpers);
setCompleted(true);
} else {
setStep((s) => s + 1);
}
}}
>
{({ isSubmitting }) => (
<Form autoComplete="off" translate="yes" onAuxClick={(e) => console.log("onAuxClick")} onAuxClickCapture={(e) => console.log("onAuxClickCapture")}>
<Stepper alternativeLabel activeStep={step}>
{childrenArray.map((child, index) => (
<Step key={child.props.label} completed={step > index || completed}>
<StepLabel>{child.props.label}</StepLabel>
</Step>
))}
</Stepper>
{currentChild}
<Stack horizontal style={{ marginTop: "20px" }} tokens={btnStackTokens}>
{step > 0 ? (
<DefaultButton
disabled={isSubmitting}
allowDisabledFocus
onClick={() => setStep((s) => s - 1)}
text="Back"
/>
) : null}
<PrimaryButton
disabled={isSubmitting}
type="submit"
>
{isSubmitting ? 'Submitting' : isLastStep() ? 'Submit' : 'Next'}
</PrimaryButton>
</Stack>
</Form>
)}
</Formik>
);
}
Ура