【发布时间】:2018-12-14 19:00:34
【问题描述】:
在我的项目中,我有一个 TabComponent,它显示 3 个选项卡:主页、流行、所有。
现在,我正在使用 context 的 react 来维护:
-
activetab存储当前标签页。 -
toggleTab使用setState更改activetab的方法。
选项卡组件
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。
- 对于标签 1,url 应该是
\home\ - 对于选项卡 2,URL 应为
\popular\ - 对于标签 3,url 应该是
\all\
在onClick 方法中使用this.props.history 不适用于export default withRouter(TabComponent)。
<NavLink
className={classnames({ active: context.activeTab === '1' })}
onClick={() =>{
context.toggleTab('1');
this.props.history('/home/');
}}
>
错误:
您不应在
<Router>之外使用<Route>或withRouter()
window.location in onClick:
<NavLink
className={classnames({ active: context.activeTab === '1' })}
onClick={() =>{
context.toggleTab('1');
window.location = '/home/';
}}
>
这确实有效,但行为不好。
单击选项卡会执行以下操作:
- 它使用
context.toggleTab更改正文的内容。 - 然后它使用
window.location更改 URL。 - 由于 URL 更改,页面正在重新加载。
这里的问题是在第一步中已经加载了内容。使用 window.location 会更改 URL,但也会重新加载不需要的页面。有没有办法跳过第 3 步,或者是否有任何其他方法只是更改了 URL?
【问题讨论】:
-
如果你使用 react-router ,你可以使用 this.props.history(url)。否则你可以使用 window.location = url。
-
我不确定在哪里写
this.props.history(url)!! -
您可以在 onClick 函数或切换函数中编写它。我猜两者都会起作用
-
如果我这样做会出错,我已经更新了我的问题。
-
那是因为 TabComponent 不是由
渲染的。所以你可以使用 window.location = url 而不是 this.props.history
标签: javascript reactjs window.location