Eu tenho a seguinte estrutura para o meu aplicativo React.js usando o 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);
});
Eu quero passar algumas propriedades para o Comments
componente.
(normalmente eu faria isso como <Comments myprop="value" />
)
Qual é a maneira mais fácil e correta de fazer isso com o React Router?
javascript
properties
reactjs
react-router
Kosmetika
fonte
fonte
<ComponentA x={<ComponentB y={<ComponentC z={} />} />} />
OR<ComponentA x={ComponentB(ComponentC()) } />
Caso contrário, esses problemas de combinações de abstrações ocorrerão e precisarão de soluções menos que ótimas e indiretas chamadas soluções alternativas, como empacotamento etc., etc. As abstrações devem ser cidadãos de primeira classe como primitivos, qualquer que seja a percepção de primeira classe.Respostas:
ATUALIZAR
Desde a nova versão, é possível transmitir adereços diretamente através do
Route
componente, sem usar um Wrapper. Por exemplo, usandorender
prop .Componente:
Uso:
Exemplo de Codesandbox
VERSÃO ANTIGA
Minha maneira preferida é envolver o
Comments
componente e passar o wrapper como um manipulador de rota.Este é o seu exemplo com as alterações aplicadas:
fonte
<Route path="comments" component={() => (<Comments myProp="value" />)}/>
Se você preferir não escrever wrappers, acho que você poderia fazer isso:
fonte
route
um objeto comum em seu componente. Aqui está a resposta de emissão github: github.com/rackt/react-router/issues/615#issuecomment-100432086Copiando dos comentários do ciantic na resposta aceita:
Esta é a solução mais elegante na minha opinião. Funciona. Me ajudou.
fonte
_ref
component={(props) => (<Comments myProp="value" location={ props.location } />)}
, mas tudo fica confuso novamentecomponent={(props) => (<Comments {...props} myProp="value" />)}
para manter os adereços injetadosEsta é a solução de Rajesh , sem o inconveniente comentado por yuji , e atualizada para o React Router 4.
O código seria assim:
Note que eu uso em
render
vez decomponent
. O motivo é evitar remontagens indesejadas . Também passo oprops
método a ele e uso os mesmos adereços no componente Comentários com o operador de propagação de objetos (proposta ES7).fonte
Apenas um acompanhamento da resposta de ColCh. É muito fácil abstrair o agrupamento de um componente:
Ainda não testei esta solução, portanto, qualquer feedback é importante.
É importante observar que, com esse método, quaisquer objetos enviados pelo roteador (como parâmetros) são substituídos / removidos.
fonte
return React.createElement(Component, _.assign({}, this.props, props));
(Este usa _.assign para compor o objeto combinado ... outros métodos estão disponíveis, é claro).render
,component
echildren
métodos paraRoute
. Observe que, como a resposta do @dgrcode aponta, você deve usar emrender
vez decomponent
Você pode passar props passando-os para
<RouteHandler>
(na v0.13.x) ou o próprio componente Route na v1.0;(a partir do guia de atualização em https://github.com/rackt/react-router/releases/tag/v1.0.0 )
Todos os manipuladores de crianças receberão o mesmo conjunto de acessórios - isso pode ser útil ou não, dependendo da circunstância.
fonte
React.cloneElement
passar vários elementos, mas a assinatura da função parece levar apenas um elemento de reação. Acho que esse trecho pode ser mais fácil de entender.React.cloneElement(this.props.children, {myprop: "value"})
ouReact.cloneElement(this.props.children, {myprop: this.props.myprop})
etc.Usando o ES6, você pode simplesmente colocar os wrappers de componentes em linha:
<Route path="/" component={() => <App myProp={someValue}/>} >
Se você precisa passar crianças:
<Route path="/" component={(props) => <App myProp={someValue}>{props.children}</App>} >
fonte
render
vez decomponent
React-router v4 alpha
agora há uma nova maneira de fazer isso, embora muito parecida com o método anterior.
PS Isso funciona apenas na versão alfa e foi removido após o lançamento da v4 alpha. Na v4 mais recente, é mais uma vez, com o caminho e adereços exatos.
react-lego, um aplicativo de exemplo contém código que faz exatamente isso em routes.js em sua ramificação react-router-4
fonte
Aqui está a solução mais limpa que eu encontrei (React Router v4):
MyComponent
ainda temprops.match
eprops.location
, e temprops.foo === "lol"
.fonte
Envolva-o com um componente de função sem estado:
fonte
Você também pode usar o RouteHandler mixin para evitar o componente wrapper e passar mais facilmente o estado do pai como props:
fonte
Você pode passar adereços através do
<RouterHandler/>
seguinte:A desvantagem disso é que você está passando adereços indiscriminadamente. Portanto,
Comments
pode acabar recebendo adereços que realmente são destinados a um componente diferente, dependendo da configuração de suas rotas. Não é um grande negócio, poisprops
é imutável, mas isso pode ser problemático se dois componentes diferentes estiverem esperando um adereço nomeado,foo
mas com valores diferentes.fonte
{...props}
Nas versões 1.0 e 2.0, você pode usar
createElement
prop ofRouter
para especificar exatamente como criar seu elemento de destino. Fonte da documentaçãofonte
Você também pode combinar as funções es6 e stateless para obter um resultado muito mais limpo:
fonte
this.props
uma função, que tenho certeza que não funcionará. Se você estiver usando funções puras em vez de estender oReact.Component
props
Solução React Router v 4
Eu me deparei com essa pergunta hoje cedo, e aqui está o padrão que eu uso. Espero que isso seja útil para quem procura uma solução mais atual.
Não tenho certeza se essa é a melhor solução, mas esse é o meu padrão atual para isso. Normalmente, tenho um diretório Core em que mantenho meus componentes comumente usados com suas configurações relevantes (carregadores, modais etc.) e incluo um arquivo como este:
Em seguida, no arquivo em questão, farei o seguinte:
Você notará que eu importo a exportação padrão do meu componente como humilde caso de camelo, o que me permite nomear o novo componente com reconhecimento de local no CamelCase para que eu possa usá-lo normalmente. Além da linha de importação adicional e da linha de atribuição, o componente se comporta conforme o esperado e recebe todos os seus adereços normalmente, com a adição de todos os adereços de rota. Assim, posso redirecionar com prazer dos métodos do ciclo de vida do componente com this.props.history.push (), verificar o local etc.
Espero que isto ajude!
fonte
Para o roteador de reação 2.x.
e nas suas rotas ...
certifique-se a 3ª param é um objeto como:
{ checked: false }
.fonte
O problema com o React Router é que ele processa seus componentes e impede que você passe em adereços. O roteador de navegação , por outro lado, permite renderizar seus próprios componentes. Isso significa que você não precisa pular nenhum arco para passar em adereços como o código a seguir e o programa JsFiddle que o acompanha .
fonte
Use o componente com ou sem roteador com base na resposta Rajesh Naroth.
Ou você pode fazer assim:
fonte
para o react-router 2.5.2, a solução é tão fácil:
fonte
Usando um componente de rota personalizado , isso é possível no React Router v3.
Quanto ao
<MyRoute>
código do componente, deve ser algo como:Para obter mais detalhes sobre a abordagem do componente de rota personalizada, consulte minha postagem no blog sobre o assunto: http://marmelab.com/blog/2016/09/20/custom-react-router-component.html
fonte
esta é provavelmente a melhor maneira de usar o react-router-dom com um manipulador de cookies
no index.js
e use um cookieCheck
fonte
fonte
Use a solução como acima e isso funciona na v3.2.5.
ou
fonte