У меня есть следующая структура для моего приложения React.js, использующего React Router :
var Dashboard = require('./Dashboard');
var Comments = require('./Comments');
var Index = React.createClass({
render: function () {
return (
<div>
<header>Some header</header>
<RouteHandler />
</div>
);
}
});
var routes = (
<Route path="/" handler={Index}>
<Route path="comments" handler={Comments}/>
<DefaultRoute handler={Dashboard}/>
</Route>
);
ReactRouter.run(routes, function (Handler) {
React.render(<Handler/>, document.body);
});
Я хочу передать некоторые свойства в Comments
компонент.
(обычно я бы сделал это так <Comments myprop="value" />
)
Какой самый простой и правильный способ сделать это с React Router?
javascript
properties
reactjs
react-router
Kosmetika
источник
источник
<ComponentA x={<ComponentB y={<ComponentC z={} />} />} />
ИЛИ.<ComponentA x={ComponentB(ComponentC()) } />
В противном случае эти проблемы комбинаций абстракций будут повторяться, и для них потребуются некоторые менее оптимальные и косвенные решения, называемые обходными путями, такими как обтекание и т. Д. И т. Д. Абстракции должны быть первоклассными гражданами в качестве примитивов, что бы ни означало восприятие первого класса.Ответы:
ОБНОВИТЬ
Начиная с нового выпуска, можно передавать реквизиты напрямую через
Route
компонент, без использования Wrapper. Например, используяrender
опору .Составная часть:
Использование:
Пример Codesandbox
СТАРАЯ ВЕРСИЯ
Мой предпочтительный способ - обернуть
Comments
компонент и передать обертку как обработчик маршрута.Это ваш пример с внесенными изменениями:
источник
<Route path="comments" component={() => (<Comments myProp="value" />)}/>
Если вы не хотите писать обертки, я думаю, вы могли бы сделать это:
источник
route
простой объект в вашем компоненте. Вот ответ на вопрос github: github.com/rackt/react-router/issues/615#issuecomment-100432086Копирование из комментариев ciantic в принятом ответе:
Это самое изящное на мой взгляд решение. Оно работает. Помог мне.
источник
_ref
component={(props) => (<Comments myProp="value" location={ props.location } />)}
но все снова становится грязнымcomponent={(props) => (<Comments {...props} myProp="value" />)}
сохранить впрыснутый реквизитЭто решение от Раджеша , без неудобных комментариев Юджи , и обновленное для React Router 4.
Код будет выглядеть так:
Обратите внимание, что я использую
render
вместоcomponent
. Причина заключается в том, чтобы избежать нежелательного повторного монтажа . Я также передаюprops
этот метод и использую те же реквизиты для компонента Comments с оператором распространения объектов (предложение ES7).источник
Просто продолжение ответа ColCh. Довольно просто абстрагировать обертку компонента:
Я еще не тестировал это решение, поэтому любые отзывы важны.
Важно отметить, что при использовании этого метода любые реквизиты, отправляемые через маршрутизатор (например, параметры), перезаписываются / удаляются.
источник
return React.createElement(Component, _.assign({}, this.props, props));
(Этот использует _.assign для создания комбинированного объекта ... другие методы, конечно, доступны).render
,component
иchildren
методыRoute
. Обратите внимание, что, как указывает ответ @dgrcode , вы должны использоватьrender
вместоcomponent
Вы можете передавать реквизиты, передавая их
<RouteHandler>
(в v0.13.x) или самому компоненту Route в v1.0;(из руководства по обновлению на https://github.com/rackt/react-router/releases/tag/v1.0.0 )
Все дочерние обработчики получат одинаковый набор реквизитов - это может быть полезно или нет в зависимости от обстоятельств.
источник
React.cloneElement
когда передают несколько элементов, но сигнатура функции, кажется, занимает только один реагирующий элемент. Я думаю, что этот фрагмент легче понять.React.cloneElement(this.props.children, {myprop: "value"})
илиReact.cloneElement(this.props.children, {myprop: this.props.myprop})
т. Д.Используя ES6, вы можете просто встроить упаковщики компонентов:
<Route path="/" component={() => <App myProp={someValue}/>} >
Если вам нужно передать детей:
<Route path="/" component={(props) => <App myProp={someValue}>{props.children}</App>} >
источник
render
вместоcomponent
React-роутер v4 альфа
теперь есть новый способ сделать это, хотя и очень похожий на предыдущий метод.
PS Это работает только в альфа-версии, и были удалены после альфа-версии v4. В v4 последний, еще раз, с путем и точным реквизитом.
response-lego - пример приложения, содержащего код, который делает это точно в файле rout.js в своей ветке response-router-4.
источник
Вот самое чистое решение, которое я придумал (React Router v4):
MyComponent
до сих порprops.match
иprops.location
, и имеетprops.foo === "lol"
.источник
Оберните его компонентом функции без сохранения состояния:
источник
Вы также можете использовать миксин RouteHandler, чтобы избежать использования компонента-обертки и упростить передачу состояния родителя в качестве реквизита:
источник
Вы можете передать в реквизит через
<RouterHandler/>
это:Недостатком является то, что вы пропускаете реквизит без разбора. Так что в
Comments
конечном итоге вы можете получить реквизиты, которые действительно предназначены для другого компонента в зависимости от конфигурации вашего маршрута. Это не так ужprops
сложно, так как является неизменным, но это может быть проблематично, если два разных компонента ожидают названную опору,foo
но с разными значениями.источник
{...props}
В 1.0 и 2.0 вы можете использовать
createElement
prop of,Router
чтобы указать, как именно создать целевой элемент. Источник документацииисточник
Вы также можете комбинировать функции es6 и stateless для получения более чистого результата:
источник
this.props
функцию, которая, я уверен, не сработает. Если вы используете чистые функции вместо того, чтобы расширять их,React.Component
вы должны передать их вprops
качестве аргумента, см. Документацию React по компонентам и процедурамРешение React Router v 4
Я наткнулся на этот вопрос сегодня утром, и вот образец, который я использую. Надеемся, что это полезно для тех, кто ищет более актуальное решение.
Я не уверен, что это лучшее решение, но это мой текущий шаблон для этого. Обычно у меня есть каталог Core, в котором я храню свои обычно используемые компоненты с соответствующими настройками (загрузчики, модалы и т. Д.), И я включаю файл, подобный этому:
Затем в рассматриваемом файле я сделаю следующее:
Вы заметите, что я импортирую экспорт по умолчанию для моего компонента как скромный случай верблюда, который позволяет мне назвать новый, учитывающий местоположение компонент в CamelCase, чтобы я мог использовать его как обычно. За исключением дополнительной строки импорта и строки назначения, компонент ведет себя как ожидалось и обычно получает все свои реквизиты с добавлением всех реквизитов маршрута. Таким образом, я могу с радостью перенаправить из методов жизненного цикла компонента с помощью this.props.history.push (), проверить расположение и т. Д.
Надеюсь это поможет!
источник
Для реакции роутера 2.х.
и в твоих маршрутах ...
убедитесь , что третьи пары является объектом , как:
{ checked: false }
.источник
Проблема с React Router заключается в том, что он рендерит ваши компоненты и, таким образом, не дает вам проходить в подпорках. Навигации маршрутизатор , с другой стороны, позволяет сделать ваши собственные компоненты. Это означает, что вам не нужно перепрыгивать через обручи, чтобы передать реквизит, как показано в следующем коде и сопровождающем JsFiddle .
источник
Используйте компонент с или без маршрутизатора, основанный на ответе Раджеша Нарота.
Или вы могли бы сделать это так:
источник
для реакции-маршрутизатора 2.5.2 решение так просто:
источник
Используя пользовательский компонент маршрута , это возможно в React Router v3.
Что касается
<MyRoute>
кода компонента, он должен быть примерно таким:Для получения более подробной информации о подходе к пользовательскому компоненту маршрута ознакомьтесь с моим постом в блоге на эту тему: http://marmelab.com/blog/2016/09/20/custom-react-router-component.html.
источник
это, вероятно, лучший способ использовать response-router-dom с обработчиком cookie
в index.js
и использовать cookieCheck
источник
источник
Используйте решение как ниже, и это работает в v3.2.5.
или
источник