rsnext/test/integration/with-router/components/header-nav.js
Christian Sánchez Mendoza 0e13d8c952 Remove route event in componentWillUnmount (#6196)
`Router.events.off` should be called instead of `Router.events.on` in `componentWillInmount`.
2019-02-03 14:13:30 +01:00

68 lines
1.8 KiB
JavaScript

import * as React from 'react'
import Router, { withRouter } from 'next/router'
import Link from 'next/link'
const pages = {
'/a': 'Foo',
'/b': 'Bar'
}
class HeaderNav extends React.Component {
constructor ({ router }) {
super()
this.state = {
activeURL: router.asPath,
activeURLTopLevelRouterDeprecatedBehavior: router.asPath,
activeURLTopLevelRouter: router.asPath
}
}
componentDidMount () {
Router.onRouteChangeComplete = this.handleRouteChangeTopLevelRouterDeprecatedBehavior
Router.events.on('routeChangeComplete', this.handleRouteChangeTopLevelRouter)
this.props.router.events.on('routeChangeComplete', this.handleRouteChange)
}
componentWillUnmount () {
Router.onRouteChangeComplete = null
Router.events.off('routeChangeComplete', this.handleRouteChangeTopLevelRouter)
this.props.router.events.off('routeChangeComplete', this.handleRouteChange)
}
handleRouteChange = url => {
this.setState({
activeURL: url
})
};
handleRouteChangeTopLevelRouter = url => {
this.setState({
activeURLTopLevelRouter: url
})
};
handleRouteChangeTopLevelRouterDeprecatedBehavior = url => {
this.setState({
activeURLTopLevelRouterDeprecatedBehavior: url
})
};
render () {
return (
<nav>
{
Object.keys(pages).map(url => (
<Link href={url} key={url} prefetch>
<a className={`${this.state.activeURL === url ? 'active' : ''} ${this.state.activeURLTopLevelRouter === url ? 'active-top-level-router' : ''} ${this.state.activeURLTopLevelRouterDeprecatedBehavior === url ? 'active-top-level-router-deprecated-behavior' : ''}`}>
{ pages[url] }
</a>
</Link>
))
}
</nav>
)
}
}
export default withRouter(HeaderNav)