我有一个组件,通过props从react-router接收<Link/>
对象。每当用户单击此组件内的“下一步”按钮时,我希望手动调用<Link/>
对象。
现在,我使用 refs 访问支持示例,并手动单击<Link/>
生成的'a'标记。
**问题:**是否有办法手动调用链接(例如this.props.next.go
)?
这是我的当前代码:
//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>
...
);
}
});
...
这是我想要的代码:
//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>
...
);
}
});
...
9条答案
按热度按时间pw136qt21#
React工艺路线v6-React 17+(更新日期:2022年1月14日)
注意:对于这个答案,v6和v5之间的一个主要变化是
useNavigate
现在是首选的React钩子。useHistory
已经过时,不推荐使用。React工艺路线v5-带钩的React 16.8 +
如果您正在利用React Hooks,则可以利用来自React Router v5的
useHistory
API。如果不想使用
useCallback
,编写单击处理程序的另一种方法是React路由器v4-重定向组件
v4推荐的方法是允许你的render方法捕获重定向。使用状态或属性来决定是否需要显示重定向组件(然后触发重定向)。
参考:https://reacttraining.com/react-router/web/api/Redirect
React路由器v4-参考路由器上下文
您还可以利用向React组件公开的
Router
的上下文。这就是
<Redirect />
的工作原理。参考:https://github.com/ReactTraining/React路由器/blob/主服务器/包/React路由器/模块/重定向. js#L46,L60
React路由器v4-外部变更历史对象
如果你仍然需要做一些类似于v2的实现,你可以创建一个
BrowserRouter
的副本,然后把history
公开为一个可导出的常量。下面是一个基本的例子,但是如果需要的话,你可以组合它来注入可定制的 prop 。生命周期有一些注意事项,但是它应该总是重新呈现路由器。就像在v2中一样。这对于从操作函数发出API请求后的重定向非常有用。要扩展的最新
BrowserRouter
:https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/modules/BrowserRouter.jsReact路由器v2
将新状态推送到
browserHistory
示例:参考:https://github.com/reactjs/react-router/blob/master/docs/guides/NavigatingOutsideOfComponents.md
yhived7q2#
React Router 4包含一个withRouterHOC,它允许您通过
this.props
访问history
对象:5cnsuln73#
在版本5.x中,可以使用
react-router-dom
的useHistory
钩子:sg3maiej4#
https://github.com/rackt/react-router/blob/bf89168acb30b6dc9b0244360bcbac5081cf6b38/examples/transitions/app.js#L50
或者你甚至可以尝试执行onClick this(更暴力的解决方案):
bzzcjhmw5#
这里的答案已经过时了。
React工艺路线6
useHistory
已过时v6使用useNavigate
挂接代替。bvjveswy6#
好吧,我想我能找到一个合适的解决办法。
现在,我发送的不是
<Link/>
作为prop到Document,而是<NextLink/>
,它是一个自定义的react-router Link Package 器,这样,我就可以将右箭头作为Link结构的一部分,同时避免将路由代码放在Document对象中。更新后的代码如下所示:
P.S:如果您使用的是最新版本的react-router,您可能需要使用
this.context.router.transitionTo
而不是this.context.transitionTo
。此代码适用于react-router版本0.12.X。wxclj1h57#
React工艺路线4
您可以通过v4中的上下文轻松调用push方法:
第一个月
其中上下文为:
lc8prwob8#
如果您希望
extend
Link
组件以利用其onClick()
处理程序中的一些逻辑,请按照以下步骤操作:用途
uz75evzq9#
再一次,这是JS:)这仍然有效。