抱歉,我意识到我的第一个答案(虽然希望仍然提供有用/额外的上下文)没有回答您的问题。让我再试一次。
你问:
我想确定{ component: Component, ...rest } 的意思是:
从props 获取Component 属性,然后将所有其他props 分配给
您,并将 props 重命名为 rest,这样您就可以避免使用
props 传递给路由 render 函数
您的解释并不完全正确。不过,根据您的想法,听起来您至少知道这里发生的事情相当于某种 object destructuring(请参阅第二个答案和那里的 cmets 以获得更多说明)。
为了给出准确的解释,让我们将{ component: Component, ...rest } 表达式分解为两个独立的操作:
-
操作 1: 找到在
props 上定义的 component 属性(注意:小写 component)并将其分配到我们称之为Component 的状态(注:大写C组件)。
-
操作 2: 然后,获取在
props 对象上定义的所有剩余属性,并将它们收集到一个名为 rest 的参数中。
重要的是,您没有将 props 重命名为 rest。 (这也与尝试“避免将props 传递给路由render 函数的命名问题”无关。)
rest === props;
// => false
您只是将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
上面的语句相当于两个变量(或者,我猜是常量)的声明和赋值。该语句可以被认为是:
获取myObj 上定义的属性name 并将其值分配给一个新的
我们称之为Username的变量。然后,取其他任何属性
在myObj(即、age、sex和dob)上定义并收集它们
到分配给我们命名为rest的变量的新对象中。
将Username 和rest 记录到console 将确认这一点。我们有以下内容:
console.log(Username);
// => John Doe
console.log(rest);
// => { age: 35, sex: 'M', dob: Mon Jan 01 1990 00:00:00 GMT-0800 (PST) }
旁注
你可能想知道:
为什么要费尽心思取消 component 属性
只是用大写字母“C”重命名Component?
是的,这似乎很微不足道。而且,虽然它是标准的 React 实践,但其框架上的所有 Facebook's documentation 都是这样编写的,这是有原因的。也就是说,使用 JSX 呈现的自定义组件的资本化本身与其说是一种实践,不如说是必要的。做出反应,或者更准确地说,JSX is case-sensitive。插入的没有大写首字母的自定义组件不会呈现给 DOM。这正是 React 定义自己以识别自定义组件的方式。因此,如果该示例没有另外将从props 提取的component 属性重命名为Component,<component {...props} /> 表达式将无法正确呈现。