Standard Requisiten mit Klassenkomponente
Verwendung static defaultProps
ist richtig. Sie sollten auch Schnittstellen und keine Klassen für die Requisiten und den Status verwenden.
Update 2018/12/1 : TypeScript hat die Typprüfung im defaultProps
Laufe der Zeit verbessert . Lesen Sie weiter für die neueste und beste Verwendung bis hin zu älteren Verwendungen und Problemen.
Für TypeScript 3.0 und höher
TypeScript hat speziell Unterstützung hinzugefügtdefaultProps
, damit die Typprüfung wie erwartet funktioniert. Beispiel:
interface PageProps {
foo: string;
bar: string;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, { this.props.foo.toUpperCase() }</span>
);
}
}
Was gerendert und kompiliert werden kann, ohne ein foo
Attribut zu übergeben:
<PageComponent bar={ "hello" } />
Beachten Sie, dass:
foo
ist nicht als optional markiert (dh foo?: string
), obwohl es nicht als JSX-Attribut erforderlich ist. Das Markieren als optional würde bedeuten, dass dies möglich ist undefined
, wird es jedoch niemals sein, undefined
da defaultProps
ein Standardwert bereitgestellt wird. Stellen Sie sich das ähnlich vor, wie Sie einen Funktionsparameter optional oder mit einem Standardwert markieren können, aber nicht beide, aber beide bedeuten, dass der Aufruf keinen Wert angeben muss . TypeScript 3.0+ behandelt defaultProps
auf ähnliche Weise, was für React-Benutzer wirklich cool ist!
- Das
defaultProps
hat keine explizite Typanmerkung. Sein Typ wird abgeleitet und vom Compiler verwendet, um zu bestimmen, welche JSX-Attribute erforderlich sind. Sie können verwenden, defaultProps: Pick<PageProps, "foo">
um sicherzustellen defaultProps
, dass eine Teilmenge von übereinstimmt PageProps
. Mehr zu dieser Einschränkung wird hier erklärt .
- Dies erfordert, dass die
@types/react
Version 16.4.11
ordnungsgemäß funktioniert.
Für TypeScript 2.1 bis 3.0
Bevor TypeScript 3.0 die Compiler-Unterstützung für defaultProps
Sie implementierte , konnten Sie diese noch verwenden, und sie funktionierte zur Laufzeit zu 100% mit React. Da TypeScript jedoch bei der Suche nach JSX-Attributen nur Requisiten berücksichtigte, mussten Sie Requisiten mit Standardeinstellungen als optional markieren ?
. Beispiel:
interface PageProps {
foo?: string;
bar: number;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps: Partial<PageProps> = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, world</span>
);
}
}
Beachten Sie, dass:
- Es ist eine gute Idee, mit Anmerkungen versehen
defaultProps
mit , Partial<>
so dass es typ Kontrollen gegen Ihre Requisiten, aber Sie haben nicht alle erforderliche Eigenschaft mit einem Standardwert zu liefern, die keinen Sinn macht , da geforderte Eigenschaften sollen nie eine Standard benötigen.
- Bei Verwendung
strictNullChecks
des Werts von this.props.foo
wird possibly undefined
und erfordert eine Nicht-Null-Zusicherung (dh this.props.foo!
) oder Typ-Guard (dh if (this.props.foo) ...
) zu entfernen undefined
. Dies ist ärgerlich, da der Standard-Prop-Wert bedeutet, dass er niemals undefiniert sein wird, aber TS hat diesen Ablauf nicht verstanden. Dies ist einer der Hauptgründe, warum TS 3.0 explizite Unterstützung für hinzugefügt hat defaultProps
.
Vor TypeScript 2.1
Dies funktioniert genauso, aber Sie haben keine Partial
Typen. Lassen Sie also einfach die Partial<>
Standardwerte für alle erforderlichen Requisiten weg und geben Sie sie entweder an (auch wenn diese Standardeinstellungen niemals verwendet werden) oder lassen Sie die explizite Typanmerkung vollständig weg.
Sie können sie auch defaultProps
für Funktionskomponenten verwenden, müssen jedoch Ihre Funktion in die FunctionComponent
( StatelessComponent
in der @types/react
vorherigen Version 16.7.2
) Schnittstelle eingeben, damit TypeScript über defaultProps
die Funktion Bescheid weiß :
interface PageProps {
foo?: string;
bar: number;
}
const PageComponent: FunctionComponent<PageProps> = (props) => {
return (
<span>Hello, {props.foo}, {props.bar}</span>
);
};
PageComponent.defaultProps = {
foo: "default"
};
Beachten Sie, dass Sie Partial<PageProps>
nirgendwo verwenden müssen, da dies FunctionComponent.defaultProps
in TS 2.1+ bereits als Teil angegeben ist.
Eine andere nette Alternative (das ist, was ich benutze) ist, deine props
Parameter zu zerstören und Standardwerte direkt zuzuweisen:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
Dann brauchen Sie das überhaupt nicht defaultProps
! Beachten Sie , dass defaultProps
eine Funktionskomponente Vorrang vor Standardparameterwerten hat, da React die defaultProps
Werte immer explizit übergibt (sodass die Parameter niemals undefiniert sind und der Standardparameter daher niemals verwendet wird) der eine oder andere, nicht beide.
static defaultProps
ist richtig. Können Sie diesen Code posten?