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 nombrepropsarestpara que pueda evitar problemas de nombres con los accesorios pasados a larenderfunció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:componentpropiedad 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).propsobjeto y recójalas dentro de un argumento llamadorest.El punto importante es que NO estás cambiando el nombre
propsarest. (Y tampoco tiene que ver con intentar "evitar problemas de nombres con la funciónpropspasada a la rutarender").rest === props; // => falseSimplemente está sacando el resto (de ahí por qué el argumento se llama así) de las propiedades definidas en su
propsobjeto 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
propsque tiene la misma estructura ( es decir , propiedades y valores) que se muestra enmyObj. Ahora, escriba la siguiente tarea.const { name: Username, ...rest } = myObjLa 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
Usernameyrestelconsoleconfirmarían esto. Tenemos lo siguiente:console.log(Username); // => John Doeconsole.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
componentpropiedad que fue retirado depropsaComponent, la<component {...props} />expresión sería no se visualizará correctamente.fuente
Te permite "difundir" todo tu
propsen una sola expresión concisa. Por ejemplo, supongamos que lopropsrecibido por suPrivateRoutecomponente se parece a// `props` Object: { thing1: 'Something', thing2: 'Something else' }Si desea transferir estos elementos ( es decir ,
thing1ything2) 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 supropsobjeto 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
...restin{ 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