问题
In my project I have a TabComponent
which displays 3 tabs: home, popular, all.
Now, I am using context
of react to maintain:
activetab
which stores current tab.toggleTab
method which changesactivetab
usingsetState
.
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>
)
}
}
What I want to achieve is, onClick
should also change the URL.
- For tab 1, the url should be
\home\
- For tab 2, the url should be
\popular\
- For tab 3, the url should be
\all\
Using this.props.history
in the onClick
method is not working with export default withRouter(TabComponent)
.
<NavLink
className={classnames({ active: context.activeTab === '1' })}
onClick={() =>{
context.toggleTab('1');
this.props.history('/home/');
}}
>
Error:
You should not use
<Route>
orwithRouter()
outside a<Router>
window.location
in onClick
:
<NavLink
className={classnames({ active: context.activeTab === '1' })}
onClick={() =>{
context.toggleTab('1');
window.location = '/home/';
}}
>
This actually works but the behaviour is not good.
Clicking the tab does the following:
- It Changes the content of body using
context.toggleTab
. - Then it changes the URL using
window.location
. - Since, the URL changed, the page is getting reloaded.
The problem here is the content is already loaded in the 1st step. Using window.location
changes the URL but also re-loads the page which is not required. It there a way to do skip the 3rd step or is that any other method which just changes the URL?
回答1:
Your TabComponent
does not have access to the React Router history
route prop because it's probably not used as a component
given to a Route
.
You could use withRouter on your TabComponent
to get access to the route props.
class TabComponent extends Component {
render() {
// ...
}
}
export default withRouter(TabComponent);
You also must make sure that you have a Router component at the top of your app.
Example
class App extends Component {
render() {
return (
<BrowserRouter>
{/* ... */}
</BrowserRouter>
);
}
}
来源:https://stackoverflow.com/questions/51205809/reactjs-changing-url-onclick