Standard Requisiten mit Klassenkomponente
Verwendung static defaultPropsist 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 defaultPropsLaufe 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 fooAttribut zu übergeben:
<PageComponent bar={ "hello" } />
Beachten Sie, dass:
fooist 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, undefinedda defaultPropsein 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 defaultPropsauf ähnliche Weise, was für React-Benutzer wirklich cool ist!
- Das
defaultPropshat 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/reactVersion 16.4.11ordnungsgemäß funktioniert.
Für TypeScript 2.1 bis 3.0
Bevor TypeScript 3.0 die Compiler-Unterstützung für defaultPropsSie 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
defaultPropsmit , 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
strictNullChecksdes Werts von this.props.foowird possibly undefinedund 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 PartialTypen. 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 defaultPropsfür Funktionskomponenten verwenden, müssen jedoch Ihre Funktion in die FunctionComponent( StatelessComponentin der @types/reactvorherigen Version 16.7.2) Schnittstelle eingeben, damit TypeScript über defaultPropsdie 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.defaultPropsin TS 2.1+ bereits als Teil angegeben ist.
Eine andere nette Alternative (das ist, was ich benutze) ist, deine propsParameter 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 defaultPropseine Funktionskomponente Vorrang vor Standardparameterwerten hat, da React die defaultPropsWerte immer explizit übergibt (sodass die Parameter niemals undefiniert sind und der Standardparameter daher niemals verwendet wird) der eine oder andere, nicht beide.
static defaultPropsist richtig. Können Sie diesen Code posten?