Eu sou novo no ReactJS e no React-Router. Eu tenho um componente que recebe por meio de adereços um <Link/>
objeto do react-router . Sempre que o usuário clica em um botão 'próximo' dentro deste componente, desejo chamar o <Link/>
objeto manualmente.
No momento, estou usando refs para acessar a instância de backup e clicando manualmente na tag 'a' que <Link/>
gera.
Pergunta: Existe uma maneira de chamar manualmente o Link (por exemplo this.props.next.go
)?
Este é o código atual que tenho:
//in MasterPage.js
var sampleLink = <Link to="/sample">Go To Sample</Link>
<Document next={sampleLink} />
//in Document.js
...
var Document = React.createClass({
_onClickNext: function() {
var next = this.refs.next.getDOMNode();
next.querySelectorAll('a').item(0).click(); //this sounds like hack to me
},
render: function() {
return (
...
<div ref="next">{this.props.next} <img src="rightArrow.png" onClick={this._onClickNext}/></div>
...
);
}
});
...
Este é o código que eu gostaria de ter:
//in MasterPage.js
var sampleLink = <Link to="/sample">Go To Sample</Link>
<Document next={sampleLink} />
//in Document.js
...
var Document = React.createClass({
render: function() {
return (
...
<div onClick={this.props.next.go}>{this.props.next.label} <img src="rightArrow.png" /> </div>
...
);
}
});
...
fonte
O React Router 4 inclui um withRouter HOC que fornece acesso ao
history
objeto viathis.props
:fonte
Na versão 5.x , você pode usar o
useHistory
gancho dereact-router-dom
:fonte
if ((routerHistory.location.pathname + routerHistory.location.search) !== navigateToPath) { routerHistory.push(navigateToPath); }
history
variável, a chamada de diretóriouseHistory().push
não é permitida pelas regras de hookshttps://github.com/rackt/react-router/blob/bf89168acb30b6dc9b0244360bcbac5081cf6b38/examples/transitions/app.js#L50
ou você pode tentar executar onClick this (solução mais violenta):
fonte
assign
não é uma propriedade, é uma função.Ok, acho que consegui encontrar uma solução adequada para isso.
Agora, em vez de enviar
<Link/>
como suporte ao documento, envio<NextLink/>
um invólucro personalizado para o link react-router. Ao fazer isso, sou capaz de ter a seta direita como parte da estrutura do Link, evitando ainda ter o código de roteamento dentro do objeto Document.O código atualizado tem a seguinte aparência:
PS : Se você estiver usando a versão mais recente do react-router, talvez seja necessário usá-lo em
this.context.router.transitionTo
vez dethis.context.transitionTo
. Este código funcionará bem para o react-router versão 0.12.X.fonte
React Router 4
Você pode invocar facilmente o método push via contexto na v4:
this.context.router.push(this.props.exitPath);
onde o contexto é:
fonte
BrowserRouter
, o objeto de contexto dos meus componentes não contém umrouter
objeto. Estou fazendo algo errado?router: React.PropTypes.object.isRequired
. Não sei por que não funcionou sem aisRequired
chave. Além disso,<Link>
parece ser capaz de obter ohistory
contexto, mas não consegui replicá-lo.this.props.history.push()
React Router v4. Só descobri isso inspecionando os adereços pelos quais o React Router passa. Parece funcionar, mas não tenho certeza se é uma boa ideia.Novamente, isso é JS :) isso ainda funciona ....
fonte