На жаль, я зрозумів, що моя перша відповідь (хоча, сподіваюся, все ще надає корисний / додатковий контекст) не відповідає на ваше запитання. Дозвольте мені спробувати ще раз.
Ви запитаєте:
Я хочу бути впевненим, що це { component: Component, ...rest }
означає:
З props
, отримайте Component
проп, а потім усі інші props
дані вам, і перейменуйте props
на, rest
щоб уникнути проблем з іменуванням
props
переданих render
функції Route
Ваше тлумачення не зовсім коректне. Однак, виходячи з ваших думок, схоже, ви принаймні усвідомлюєте той факт, що те, що тут відбувається, є якоюсь деструктуризацією об’єкта (див. Другу відповідь та коментарі там для отримання додаткових роз’яснень).
Щоб дати точне пояснення, розберемо { component: Component, ...rest }
вираз на дві окремі операції:
- Операція 1: Знайдіть
component
властивість, визначену на props
( Примітка : нижній регістр c omponent), і призначте його новому розташуванню у стані, який ми називаємо Component
( Примітка : велике C omponent).
- Операція 2: Потім візьміть усі залишені властивості, визначені в
props
об’єкті, та зберіть їх у аргументованому аргументі rest
.
Важливим моментом є те, що ви НЕ перейменовуєтесь props
на rest
. (І це також не пов’язано зі спробою "уникнути проблем з іменуванням props
переданих render
функції Route ".)
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
з великої літери "С"?
Так, це здається досить дріб’язковим. І хоча це стандартна практика React, є причина, що вся документація Facebook щодо її фреймворку написана як така. А саме, використання великих літер користувальницьких компонентів, які відображаються за допомогою JSX, є меншою практикою як такою, ніж необхідністю. Реагуйте, або, більш правильно, JSX чутливий до регістру . Спеціальні компоненти, вставлені без великої першої літери, не відображаються в DOM. Саме так React визначився для ідентифікації користувацьких компонентів. Таким чином, був приклад додатково не перейменував component
властивість, витягнуту з props
до Component
, то <component {...props} />
вираз буде не правильно відображався.