在我的项目中,我有一个TabComponent
,其中显示3个标签:“首页”,“热门”,“全部”。
现在,我正在使用context
的React来维护:
activetab
,其中存储当前标签。toggleTab
方法,该方法使用activetab
来更改setState
。TabComponent
import React, {Component} from 'react'
import Context from '../../provider'
import {Nav, NavItem, NavLink} from 'reactstrap'
import {Redirect} from 'react-router-dom'
import classnames from 'classnames'
export default class TabComponent extends Component {
render() {
return (
<Context.Consumer>
{context => (
<Nav tabs color='primary'>
<NavItem>
<NavLink
className={classnames({ active: context.activeTab === '1' })}
onClick={() =>{context.toggleTab('1')}}
>
Home
</NavLink>
</NavItem>
<NavItem>
<NavLink
className={classnames({ active: context.activeTab === '2' })}
onClick={() => {context.toggleTab('2')}}
>
Popular
</NavLink>
</NavItem>
<NavItem>
<NavLink
className={classnames({ active: context.activeTab === '3' })}
onClick={() => {context.toggleTab('3')}}
>
All
</NavLink>
</NavItem>
</Nav>
)}
</Context.Consumer>
)
}
}
我想要实现的是,onClick
也应该更改URL。
\home\
\popular\
\all\
在this.props.history
方法中使用onClick
不能与export default withRouter(TabComponent)
一起使用。
<NavLink
className={classnames({ active: context.activeTab === '1' })}
onClick={() =>{
context.toggleTab('1');
this.props.history('/home/');
}}
>
错误:
您不应该在
<Route>
之外使用withRouter()
或<Router>
window.location
in onClick
:
<NavLink
className={classnames({ active: context.activeTab === '1' })}
onClick={() =>{
context.toggleTab('1');
window.location = '/home/';
}}
>
这实际上有效,但是行为不好。
单击选项卡将执行以下操作:
context.toggleTab
更改正文的内容。window.location
更改URL。这里的问题是内容已在第一步中加载。使用window.location
可以更改URL,还可以重新加载不需要的页面。可以跳过第三步吗,还是只是更改URL的其他方法?
答案 0 :(得分:1)
您的TabComponent
无法访问React Router history
路由道具,因为它可能不被用作给component
的{{1}}。
您可以在Route
上使用withRouter
来访问route props。
TabComponent
还必须确保在应用程序顶部具有Router
组件。
示例
class TabComponent extends Component {
render() {
// ...
}
}
export default withRouter(TabComponent);