抱歉,我意识到我的第一个答案(虽然希望仍能提供有用的/附加的上下文)不能回答您的问题。让我再尝试一次。
你问:
我想确定这{ component: Component, ...rest }
意味着:
从中props
获取Component
道具,然后获取其他所有道具props
重命名props
为,rest
这样您就可以避免props
传递给Routerender
函数的命名问题
您的解释不太正确。但是根据您的想法,听起来您至少知道以下事实:这里发生的事情构成某种对象破坏(请参阅第二个答案和评论以获取更多说明)。
为了给出准确的解释,让我们分解一下 { component: Component, ...rest }
表达式分解为两个单独的操作:
- 操作1:找到
component
属性定义上props
(注意:小写Ç omponent)并将其分配给在状态中,我们调用一个新的位置Component
(注:资本Ç omponent)。
- 操作2:然后,采取所有剩余的已定义的属性
props
对象并将它们收集在称为的参数中rest
。
重要的一点是您不会重命名props
为rest
。(而且,与“避免props
传递给Route的命名问题也没有关系render
函数的”有关。)
rest === props;
您只需将对象上定义的属性的其余部分(因此将其命名为该参数)转换为名为props
的新参数rest
。
用法示例
这是一个例子。假设我们有一个如下定义的对象“ myObj”:
const myObj = {
name: 'John Doe',
age: 35,
sex: 'M',
dob: new Date(1990, 1, 1)
};
对于此示例,可能会想像一下props
具有相同的结构(即属性和值),可能会有所帮助myObj
。现在,让我们编写以下任务。
const { name: Username, ...rest } = myObj
上面的声明相当于两个变量(或者,我想是常量)的声明和赋值。该语句可以认为是:
接受name
定义的属性,myObj
并将其值分配给我们称为的新变量Username
。然后,取中定义的任何其他属性myObj
(即,age
,sex
和dob
),并收集他们到分配给变量我们名称的新对象rest
。
登录Username
并rest
到console
会证实这一点。我们有以下内容:
console.log(Username);
console.log(rest);
边注
您可能想知道:
为何要撤出该component
财产而只Component
用大写字母“ C”重命名呢?
是的,这似乎很琐碎。而且,尽管这是标准的React惯例,但有理由将Facebook框架上的所有文档都照这样编写。即,大写使用JSX渲染的自定义组件本身不是一种实践,而是一种必要。React,或更恰当地说,JSX是区分大小写的。插入的没有大写首字母的自定义组件不会呈现给DOM。这就是React定义自己以识别自定义组件的方式。因此,如果该示例未另外重命名从中删除的component
属性,则该表达式将无法正确呈现。props
Component
<component {...props} />