Sorry, I realized my first answer (while hopefully still providing useful/additional context) doesn’t answer your question. Let me try again.
You ask:
I want to be certain that
{ component: Component, ...rest }means:From
props, get theComponentprop and then all otherpropsgiven to
you, and renamepropstorestso you can avoid naming issues with the
propspassed to the Routerenderfunction
Your interpretation is not quite correct. Based on your thoughts though, it sounds like you’re at least aware of the fact that what is happening here amounts to some sort of object destructuring (see second answer and comments there for more clarification).
To give an accurate explanation, let’s break down the { component: Component, ...rest } expression into two separate operations:
- Operation 1: Find the
componentproperty defined onprops(Note: lowercase component) and assign it to a new location in state we callComponent(Note: capital Component). - Operation 2: Then, take all remaining properties defined on the
propsobject and collect them inside an argument calledrest.
The important point is that you’re NOT renaming props to rest. (And nor does it have to do with trying to “avoid naming issues with the props passed to the Route render function”.)
rest === props;
// => false
You’re simply pulling off the rest (hence why the argument is named that) of the properties defined on your props object into a new argument called rest.
Example Usage
Here’s an example. Let’s assume we have an object `myObj` defined as follows:
const myObj = {
name: 'John Doe',
age: 35,
sex: 'M',
dob: new Date(1990, 1, 1)
};
For this example, it may help to just think of props as having the same structure (i.e., properties and values) as shown in myObj. Now, let’s write the following assignment.
const { name: Username, ...rest } = myObj
The statement above amounts to both the declaration and assignment of two variables (or, I guess, constants). The statement can be thought out as:
Take property
namedefined onmyObjand assign its value to a new
variable we callUsername. Then, take whatever other properties were
defined onmyObj(i.e.,age,sexanddob) and collect them
into a new object assigned to the variable we namerest.
Logging Username and rest to the console would confirm this. We have the following:
console.log(Username);
// => John Doe
console.log(rest);
// => { age: 35, sex: 'M', dob: Mon Jan 01 1990 00:00:00 GMT-0800 (PST) }
Side Note
You may wonder:
Why go through the trouble of pulling off the
componentproperty
only to rename itComponentwith a capital letter “C”?
Yeah, it seems pretty trivial. And, while it is a standard React practice, there’s a reason all of Facebook’s documentation on its framework is written as such. Namely, capitalizing custom components rendered with JSX is less a practice per se than it is a necessity. React, or more properly, JSX is case-sensitive. Custom components inserted without a capitalized first letter are not rendered to the DOM. This is just how React has defined itself to identify custom components. Thus, had the example not additionally renamed the component property that was pulled off of props to Component, the <component {...props} /> expression would fail to render properly.