Patrząc na ten przykład React Router Dom v4 https://reacttraining.com/react-router/web/example/auth-workflow , widzę, że komponent PrivateRoute niszczy taką propozycję resztową
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
fakeAuth.isAuthenticated ? (
<Component {...props}/>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}}/>
)
)}/>
)
Chcę mieć pewność, że { component: Component, ...rest }
oznacza to:
From
props
, pobierz właściwość Component, a następnie wszystkie inne właściwości, które otrzymałeś, i zmień nazwęprops
na,rest
aby uniknąć problemów z nazywaniem właściwości przekazywanych dorender
funkcji Route
Czy mam rację?
reactjs
react-router
brzytwa7
źródło
źródło
Odpowiedzi:
Przepraszam, zdałem sobie sprawę, że moja pierwsza odpowiedź (miejmy nadzieję, że nadal dostarcza użytecznego / dodatkowego kontekstu) nie odpowiada na twoje pytanie. Pozwól mi spróbować jeszcze raz.
Ty pytasz:
Twoja interpretacja nie jest całkiem poprawna. Opierając się jednak na twoich przemyśleniach, wydaje się, że przynajmniej jesteś świadomy faktu, że to, co się tutaj dzieje, sprowadza się do pewnego rodzaju destrukcji obiektu (więcej wyjaśnień znajdziesz w drugiej odpowiedzi i komentarzach).
Aby dać dokładne wyjaśnienie, podzielmy
{ component: Component, ...rest }
wyrażenie na dwie oddzielne operacje:component
właściwość określona naprops
( Uwaga : mała litera c omponent) i przypisać go do nowej lokalizacji w stanie nazwaćComponent
( Uwaga : kapitał C omponent).props
obiekcie i zbierz je wewnątrz argumentu o nazwierest
.Ważne jest to, że NIE zmieniasz nazwy
props
narest
. (Nie ma też nic wspólnego z próbą „uniknięcia problemów z nazewnictwem w przypadkuprops
przekazywania dorender
funkcji Route ”).rest === props; // => false
Po prostu pobierasz resztę (stąd dlaczego argument jest tak nazwany) właściwości zdefiniowanych w twoim
props
obiekcie do nowego argumentu o nazwierest
.Przykładowe użycie
Oto przykład. Załóżmy, że mamy obiekt `myObj` zdefiniowany następująco:const myObj = { name: 'John Doe', age: 35, sex: 'M', dob: new Date(1990, 1, 1) };
W tym przykładzie warto pomyśleć o
props
tym, że ma taką samą strukturę ( tj. Właściwości i wartości), jak pokazano wmyObj
. Teraz napiszmy następujące zadanie.const { name: Username, ...rest } = myObj
Powyższe stwierdzenie sprowadza się zarówno do deklaracji, jak i przypisania dwóch zmiennych (lub, jak sądzę, stałych). Stwierdzenie to można sobie wyobrazić jako:
Logowanie
Username
irest
doconsole
potwierdzą to. Mamy następujące:console.log(Username); // => John Doe
console.log(rest); // => { age: 35, sex: 'M', dob: Mon Jan 01 1990 00:00:00 GMT-0800 (PST) }
Dygresja
Możesz się zastanawiać:Tak, wydaje się to dość trywialne. I chociaż jest to standardowa praktyka Reacta, jest powód, dla którego cała dokumentacja Facebooka dotycząca jego frameworku jest napisana jako taka. Mianowicie, kapitalizowanie niestandardowych komponentów renderowanych za pomocą JSX jest mniej praktyką samą w sobie, niż koniecznością. Reaguj, a właściwie, JSX rozróżnia wielkość liter . Komponenty niestandardowe wstawione bez wielkiej pierwszej litery nie są renderowane w modelu DOM. Tak właśnie zdefiniował się React, aby identyfikować niestandardowe komponenty. Tak więc, gdyby nie przykład dodatkowo przemianowany na
component
własność, że oderwano odprops
doComponent
The<component {...props} />
wyrażenie nie powiedzie się poprawnie renderowania.źródło
Pozwala ci to „rozłożyć” wszystko
props
jednym zwięzłym wyrażeniem. Na przykład załóżmy, żeprops
otrzymany przez TwójPrivateRoute
komponent wygląda jak// `props` Object: { thing1: 'Something', thing2: 'Something else' }
Jeśli chciał dalszego strony od tych pozycji ( tj ,
thing1
ithing2
) w dół do zagnieżdżonych<Component />
znaczników i nie byli zaznajomieni z przedmiotem spread składni, można napisać:Jednak
{ ...props }
składnia zapobiega takiej szczegółowości, pozwalając, aby szerzyć swójprops
przedmiot w tej samej Jednym ze sposobów może rozprzestrzeniać tablicę wartości ( np ,[...vals]
). Innymi słowy, wyrażenie JSX poniżej i powyżej są dokładnie równoważne.źródło
...rest
in{ component: Component, ...rest }
zbiera wszystkie inne właściwości obiekturest
. Pytanie dotyczy...rest
, a nie{...props}
{ ...myObj }
w środowisku innym niż React ( np. W konsoli przeglądarki) spowoduje wyświetlenie plikuSyntaxError
. Niemniej jednak, rozpiętość reszt _ / _ w ES6 zapewnia użyteczne ramy koncepcyjne, w których można myśleć o rozprzestrzenianiu się obiektów JSX .Upraszczajmy: w JavaScript, jeśli pary „klucz: wartość” są takie same,
obj={account:account}
to to samo coobj={account}
. Więc podczas przekazywania rekwizytów z komponentu rodzica do komponentu potomnego: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;
resztę rekwizytów będziesz przekazywać jako:
źródło