Skip to content

Instantly share code, notes, and snippets.

@HaNdTriX
Created July 10, 2018 13:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save HaNdTriX/62e7f02d1b8b425d09469ad42afdb450 to your computer and use it in GitHub Desktop.
Save HaNdTriX/62e7f02d1b8b425d09469ad42afdb450 to your computer and use it in GitHub Desktop.
import React from 'react'
import Router from 'next/router'
const HistoryContext = React.createContext([]);
export class HistoryProvider extends React.Component {
state = {
history: []
}
componentDidMount() {
this.handleRouteChangeComplete(Router.route)
Router.events.on('routeChangeComplete', this.handleRouteChangeComplete)
}
componentWillUnmount() {
Router.events.off('routeChangeComplete', this.handleRouteChangeComplete)
}
handleRouteChangeComplete = (url) => {
this.setState(state => ({
history: [
...state.history,
url
]
}))
}
render() {
return (
<HistoryContext.Provider value={this.state.history}>
{this.props.children}
</HistoryContext.Provider>
)
}
}
export const HistoryConsumer = HistoryContext.Consumer
@HaNdTriX
Copy link
Author

HaNdTriX commented Jul 10, 2018

Usage

pages/_app.js

import App, { Container } from 'next/app'
import React from 'react'
import { HistoryProvider } from '../components/NextHistoryContext'

export default class MyApp extends App {
  static async getInitialProps ({ Component, router, ctx }) {
    let pageProps = {}

    if (Component.getInitialProps) {
      pageProps = await Component.getInitialProps(ctx)
    }

    return {pageProps}
  }

  render () {
    const { Component, pageProps } = this.props
    return (
      <Container>
        <HistoryProvider>
          <Component {...pageProps} />
        </HistoryProvider>
      </Container>
    )
  }
}

components/History.js

import React from 'react'
import { HistoryConsumer } from '../components/HistoryContext'

export default () => (
  <HistoryConsumer>
    {(history) => (
      <React.Fragment>
        <h2>History entries {history.length}</h2>
        <pre>
          {history.join('\n')}
        </pre>
      </React.Fragment>
    )}
  </HistoryConsumer>
)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment