Wenn ich mir dieses Beispiel für React Router Dom v4 ansehe, https://reacttraining.com/react-router/web/example/auth-workflow , sehe ich, dass die PrivateRoute- Komponente eine Rest-Requisite wie diese zerstört
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
fakeAuth.isAuthenticated ? (
<Component {...props}/>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}}/>
)
)}/>
)
Ich möchte sicher sein, dass das { component: Component, ...rest }
bedeutet:
Holen Sie
props
sich von die Komponenten-Requisite und dann alle anderen Requisiten, die Sie erhalten haben, und benennen Sie sie umprops
,rest
damit Sie Probleme mit der Benennung der an die Routenfunktion übergebenen Requisiten vermeidenrender
können
Habe ich recht?
reactjs
react-router
razor7
quelle
quelle
Antworten:
Entschuldigung, ich habe festgestellt, dass meine erste Antwort (obwohl sie hoffentlich immer noch nützlichen / zusätzlichen Kontext bietet) Ihre Frage nicht beantwortet. Lass mich es nochmal versuchen.
Du fragst:
Ihre Interpretation ist nicht ganz richtig. Aufgrund Ihrer Gedanken klingt es jedoch so, als ob Sie sich zumindest der Tatsache bewusst sind, dass das, was hier geschieht, eine Art Objektzerstörung darstellt (siehe zweite Antwort und Kommentare dort für weitere Erläuterungen).
Um eine genaue Erklärung zu geben, teilen wir den
{ component: Component, ...rest }
Ausdruck in zwei separate Operationen auf:component
Eigenschaft definiert aufprops
( Anmerkung : Klein c ls Bestandteil) und weisen Sie an einen neuen Standort im Zustand nennen wirComponent
( Anmerkung : Kapital C ls Bestandteil).props
Objekt definiert sind, und sammeln Sie sie in einem aufgerufenen Argumentrest
.Der wichtige Punkt ist , dass Sie die Umbenennung nicht
props
zurest
. (Und es hat auch nichts mit dem Versuch zu tun, "Namensprobleme mit derprops
an die Route übergebenenrender
Funktion zu vermeiden ".)rest === props; // => false
Sie ziehen einfach den Rest (daher wird das Argument so genannt) der für Ihr
props
Objekt definierten Eigenschaften in ein neues Argument namensrest
.Beispiel Verwendung
Hier ist ein Beispiel. Nehmen wir an, wir haben ein Objekt
myObj
wie folgt definiert:const myObj = { name: 'John Doe', age: 35, sex: 'M', dob: new Date(1990, 1, 1) };
In diesem Beispiel kann es hilfreich sein, sich nur
props
die gleiche Struktur ( dh Eigenschaften und Werte) wie in gezeigt vorzustellenmyObj
. Schreiben wir nun die folgende Aufgabe.const { name: Username, ...rest } = myObj
Die obige Aussage läuft sowohl auf die Deklaration als auch auf die Zuweisung von zwei Variablen (oder, ich denke, Konstanten) hinaus. Die Aussage kann wie folgt gedacht werden:
Protokollierung
Username
undrest
zumconsole
würde dies bestätigen. Wir haben folgendes:console.log(Username); // => John Doe
console.log(rest); // => { age: 35, sex: 'M', dob: Mon Jan 01 1990 00:00:00 GMT-0800 (PST) }
Randnotiz
Du fragst dich vielleicht:
Ja, es scheint ziemlich trivial. Und obwohl dies eine Standardpraxis von React ist, gibt es einen Grund, warum die gesamte Dokumentation von Facebook in seinem Framework als solche geschrieben ist. Das Aktivieren von mit JSX gerenderten benutzerdefinierten Komponenten ist an sich weniger eine Praxis als eine Notwendigkeit. Reagieren Sie besser oder besser, JSX unterscheidet zwischen Groß- und Kleinschreibung . Benutzerdefinierte Komponenten, die ohne Großbuchstaben eingefügt werden, werden nicht in das DOM gerendert. Genau so hat sich React definiert, um benutzerdefinierte Komponenten zu identifizieren. So das Beispiel hatte nicht zusätzlich die umbenannte
component
Eigenschaft , die aus der gezogen wurde ,props
umComponent
das<component {...props} />
würde Ausdruck machen , nicht richtig.quelle
Es ermöglicht Ihnen, alle Ihre
props
in einem einzigen prägnanten Ausdruck zu "verbreiten" . Nehmen wir zum Beispiel an, dass dasprops
von IhrerPrivateRoute
Komponente empfangene Aussehen so aussieht// `props` Object: { thing1: 'Something', thing2: 'Something else' }
Wenn Sie weiter die Hand von diesem Artikel wollten ( dh ,
thing1
undthing2
) an den verschachtelten unten<Component />
Tag und Sie waren mit dem nicht vertraut Objekt Verbreitung Syntax, könnten Sie schreiben:Doch die
{ ...props }
vermeidet Syntax solche Ausführlichkeit , indem Sie verbreiten Ihrprops
Objekt in der gleichen Art und Weise könnte man verteilen eine Reihe von Werten ( zB ,[...vals]
). Mit anderen Worten, der JSX-Ausdruck unten und der oben sind genau gleichwertig.quelle
...rest
in{ component: Component, ...rest }
sammelt alle anderen Eigenschaften im Objektrest
. Die Frage ist über...rest
, nicht{...props}
{ ...myObj }
in einer Umgebung ohne Reaktion ( z. B. der Browserkonsole) zu schreiben, a auslösenSyntaxError
. Dennoch ES6 der Rest _ / _ Ausbreitung stellt einen nützlichen konzeptionellen Rahmen , in dem denken Objekt JSX Verbreitung .Lassen Sie es uns einfach halten: Wenn in JavaScript ein "Schlüssel: Wert" -Paar dasselbe ist,
obj={account:account}
ist es dasselbe wieobj={account}
. Wenn Sie also Requisiten von der übergeordneten zur untergeordneten Komponente übergeben:const Input = ({name,label,error, ...rest}) => { return ( <div className="form-group"> <label htmlFor={name}>{label}</label> <input {...rest} autoFocus name={name} id={name} className="form-control" aria-describedby="emailHelp" /> </div> ); }; export default Input;
Sie werden den Rest der Requisiten weitergeben als:
quelle