Mirando este ejemplo de React Router Dom v4 https://reacttraining.com/react-router/web/example/auth-workflow , veo que el componente PrivateRoute destruye un apoyo de descanso como este
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
fakeAuth.isAuthenticated ? (
<Component {...props}/>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}}/>
)
)}/>
)
Quiero estar seguro de que eso { component: Component, ...rest }
significa:
De
props
, obtenga el accesorio del componente y luego todos los demás accesorios que se le dieron, y cambie el nombreprops
arest
para que pueda evitar problemas de nombres con los accesorios pasados a larender
función Ruta
Estoy en lo cierto?
reactjs
react-router
razor7
fuente
fuente
Respuestas:
Lo siento, me di cuenta de que mi primera respuesta (aunque espero que siga brindando un contexto útil / adicional) no responde a su pregunta. Déjame intentar de nuevo.
Usted pregunta:
Tu interpretación no es del todo correcta. Sin embargo, según sus pensamientos, parece que al menos es consciente del hecho de que lo que está sucediendo aquí equivale a una especie de desestructuración de objetos (consulte la segunda respuesta y los comentarios para obtener más aclaraciones).
Para dar una explicación precisa, descompongamos la
{ component: Component, ...rest }
expresión en dos operaciones separadas:component
propiedad definida enprops
( Nota : en minúscula c omponent) y asignarla a una nueva ubicación en el estado que llamamosComponent
( Nota : el capital C omponent).props
objeto y recójalas dentro de un argumento llamadorest
.El punto importante es que NO estás cambiando el nombre
props
arest
. (Y tampoco tiene que ver con intentar "evitar problemas de nombres con la funciónprops
pasada a la rutarender
").rest === props; // => false
Simplemente está sacando el resto (de ahí por qué el argumento se llama así) de las propiedades definidas en su
props
objeto en un nuevo argumento llamadorest
.Ejemplo de uso
He aquí un ejemplo. Supongamos que tenemos un objeto `myObj` definido de la siguiente manera:const myObj = { name: 'John Doe', age: 35, sex: 'M', dob: new Date(1990, 1, 1) };
Para este ejemplo, puede ser útil pensar
props
que tiene la misma estructura ( es decir , propiedades y valores) que se muestra enmyObj
. Ahora, escriba la siguiente tarea.const { name: Username, ...rest } = myObj
La declaración anterior equivale tanto a la declaración como a la asignación de dos variables (o, supongo, constantes). La declaración se puede pensar como:
El registro
Username
yrest
elconsole
confirmarían esto. Tenemos lo siguiente:console.log(Username); // => John Doe
console.log(rest); // => { age: 35, sex: 'M', dob: Mon Jan 01 1990 00:00:00 GMT-0800 (PST) }
Nota al margen
Puede preguntarse:Sí, parece bastante trivial. Y, si bien es una práctica estándar de React, hay una razón por la que toda la documentación de Facebook en su marco está escrita como tal. Es decir, capitalizar componentes personalizados renderizados con JSX es menos una práctica per se que una necesidad. Reaccionar, o más correctamente, JSX distingue entre mayúsculas y minúsculas . Los componentes personalizados insertados sin una primera letra en mayúscula no se representan en el DOM. Así es como React se ha definido a sí mismo para identificar componentes personalizados. Por lo tanto, tenía el ejemplo no, además, cambió el nombre del
component
propiedad que fue retirado deprops
aComponent
, la<component {...props} />
expresión sería no se visualizará correctamente.fuente
Te permite "difundir" todo tu
props
en una sola expresión concisa. Por ejemplo, supongamos que loprops
recibido por suPrivateRoute
componente se parece a// `props` Object: { thing1: 'Something', thing2: 'Something else' }
Si desea transferir estos elementos ( es decir ,
thing1
ything2
) a la<Component />
etiqueta anidada y no estaba familiarizado con la sintaxis de propagación del objeto , puede escribir:Sin embargo, la
{ ...props }
sintaxis evita tal verbosidad al permitirle difundir suprops
objeto de la misma manera que uno podría difundir una matriz de valores ( por ejemplo ,[...vals]
). En otras palabras, la expresión JSX a continuación y la anterior son exactamente equivalentes.fuente
...rest
in{ component: Component, ...rest }
recopila todas las demás propiedades del objetorest
. La pregunta es sobre...rest
, no{...props}
{ ...myObj }
en un entorno que no sea React ( por ejemplo , la consola del navegador) arrojará unSyntaxError
. Sin embargo, la extensión _ / _ del resto de ES6 proporciona un marco conceptual útil en el que pensar en la extensión del objeto de JSX .Hagámoslo simple: en JavaScript, si un par "clave: valor" es el mismo,
obj={account:account}
es el mismo queobj={account}
. Entonces, al pasar accesorios del componente principal al secundario: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;
pasarás el resto de accesorios como:
fuente