Глядя на этот пример React Router Dom v4 https://reacttraining.com/react-router/web/example/auth-workflow, я вижу, что компонент PrivateRoute разрушает такую опору отдыха, как это
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={props => (
fakeAuth.isAuthenticated ? (
<Component {...props}/>
) : (
<Redirect to={{
pathname: '/login',
state: { from: props.location }
}}/>
)
)}/>
)
Я хочу быть уверен, что это { component: Component, ...rest }
означает:
От
props
, получите свойство Component, а затем все остальные предоставленные вам реквизиты и переименуйте егоprops
в,rest
чтобы избежать проблем с именованием свойств, переданных вrender
функцию Route.
Я прав?
reactjs
react-router
бритва7
источник
источник
Ответы:
Извините, я понял, что мой первый ответ (хотя, надеюсь, все еще предоставляет полезный / дополнительный контекст) не отвечает на ваш вопрос. Дай мне попробовать снова.
Ты спрашиваешь:
Ваша интерпретация не совсем верна. Однако, исходя из ваших мыслей, похоже, что вы, по крайней мере, знаете о том, что то, что здесь происходит, представляет собой своего рода деструктуризацию объекта (см. Второй ответ и комментарии там для дополнительных разъяснений).
Чтобы дать точное объяснение, давайте разделим
{ component: Component, ...rest }
выражение на две отдельные операции:component
свойство , определенное наprops
( Примечание : в нижнем регистре с omponent) и назначить его на новое место в государстве мы называемComponent
( Примечание : капитальное C omponent).props
объекта, и соберите их внутри вызываемого аргументаrest
.Важным моментом является то, что вы НЕ переименовываете
props
вrest
. (И это не связано с попыткой «избежать проблем с именованиемprops
переданнойrender
функции Route ».)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
Приведенное выше утверждение сводится как к объявлению, так и к присвоению двух переменных (или, я думаю, констант). Заявление можно представить как:
Лесозаготовки
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) }
Примечание
Вы можете спросить:Да, это кажется довольно тривиальным. И хотя это стандартная практика React, есть причина, по которой вся документация Facebook по его фреймворку написана именно так. А именно, использование заглавных букв в пользовательских компонентах, отображаемых с помощью JSX, - это не столько практика как таковая, сколько необходимость. React, точнее, JSX чувствителен к регистру . Пользовательские компоненты, вставленные без заглавной буквы, не отображаются в модели DOM. Именно так React определил себя для идентификации пользовательских компонентов. Таким образом, был пример дополнительно не переименовал
component
свойство, вытянутую изprops
кComponent
, то<component {...props} />
выражение будет не правильно отображался.источник
Это позволяет «разложить» все
props
в одном лаконичном выражении. Например, предположим, чтоprops
полученное вашимPrivateRoute
компонентом выглядит как// `props` Object: { thing1: 'Something', thing2: 'Something else' }
Если вы хотите дальнейшую сторону от этих элементов ( то есть ,
thing1
иthing2
) вплоть до вложенного<Component />
тега , и вы не были знакомы с объектом распространением синтаксиса, вы можете написать:Однако
{ ...props }
синтаксис устраняет такую многословность, позволяя вам распространять вашprops
объект таким же образом, как если бы вы могли распространять массив значений ( например ,[...vals]
). Другими словами, приведенные ниже и приведенные выше выражения JSX в точности эквивалентны.источник
...rest
in{ component: Component, ...rest }
собирает все остальные свойства объектаrest
. Вопрос в том...rest
, а не в{...props}
{ ...myObj }
в среде, отличной от React ( например , в консоли браузера), вызовет ошибкуSyntaxError
. Тем не менее, остальные _ / _ распространения ES6 предоставляют полезную концептуальную основу для размышлений о распространении объектов JSX .Давайте будем простыми: в JavaScript, если пары «ключ: значение» совпадают,
obj={account:account}
то же самое, что иobj={account}
. Итак, при передаче props от родительского к дочернему компоненту: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;
вы будете передавать остальные реквизиты как:
источник