Bei Verwendung von TypeScript mit React müssen wir nicht mehr erweitern React.Props
, damit der Compiler weiß, dass alle Requisiten von React- Komponenten untergeordnete Elemente haben können:
interface MyProps { }
class MyComponent extends React.Component<MyProps, {}> {
public render(): JSX.Element {
return <div>{this.props.children}</div>;
}
}
Bei zustandslosen Funktionskomponenten scheint dies jedoch nicht der Fall zu sein:
const MyStatelessComponent = (props: MyProps) => {
return (
<div>{props.children}</div>
);
};
Gibt den Kompilierungsfehler aus:
Fehler: (102, 17) TS2339: Die Eigenschaft 'children' ist für den Typ 'MyProps' nicht vorhanden.
Ich denke, das liegt daran, dass der Compiler wirklich nicht wissen kann, dass children
im Requisitenargument eine Vanillefunktion angegeben wird.
Die Frage ist also, wie wir Kinder in einer zustandslosen Funktionskomponente in TypeScript verwenden sollen.
Ich könnte zum alten Weg zurückkehren MyProps extends React.Props
, aber die Props
Benutzeroberfläche ist als veraltet markiert , und zustandslose Komponenten haben oder unterstützen kein, Props.ref
wie ich es verstehe.
So konnte ich die children
Requisite manuell definieren :
interface MyProps {
children?: React.ReactNode;
}
Erstens: Ist ReactNode
der richtige Typ?
Zweitens: Ich muss Kinder als optional ( ?
) schreiben, sonst denken die Verbraucher, dass children
dies ein Attribut der Komponente ( <MyStatelessComponent children={} />
) sein soll, und lösen einen Fehler aus, wenn kein Wert angegeben wird.
Es scheint, als würde mir etwas fehlen. Kann jemand Klarheit darüber schaffen, ob mein letztes Beispiel die Verwendung zustandsloser Funktionskomponenten mit Kindern in React ist?
quelle
@types
React.StatelessComponent
/React.SFC
Sind veraltet. Es wird empfohlen,React.FunctionComponent
stattdessen darauf zu verweisen .Sie können
React.PropsWithChildren<P>
Typ für Ihre Requisiten verwenden:interface MyProps { } function MyComponent(props: React.PropsWithChildren<MyProps>) { return <div>{props.children}</div>; }
quelle
Sie können verwenden
interface YourProps { } const yourComponent: React.SFC<YourProps> = props => {}
quelle
Einfachere Antwort: Verwenden Sie
ReactNode
:Ob dies
children
optional ist oder nicht (dh mit?
oder nicht), hängt von Ihrer Komponente ab. Das?
ist die prägnanteste Art, das auszudrücken, also ist daran nichts auszusetzen.Zur Geschichte: Dies war nicht unbedingt die richtige Antwort, als sie ursprünglich gefragt wurde: Der Typ
ReactNode
wurde (fast) in seiner aktuellen Form im März 2017 nur durch diese Pull-Anfrage hinzugefügt , aber fast jeder, der dies heute liest, sollte auf einer ausreichend modernen Version von React sein .Zuletzt zum Übergeben
children
als "Attribut" (was in React lingo als "Requisite" und nicht als Attribut übergeben würde): Es ist möglich, liest sich aber in den meisten Fällen besser, wenn JSX-Kinder übergeben werden:<MyComponent> <p>This is part of the children.</p> </MyComponent>
liest sich leichter als
<MyComponent children={<p>This is part of the children.</p>} />
quelle