1
0
Fork 0
mirror of https://github.com/terribleplan/next.js.git synced 2024-01-19 02:48:18 +00:00

Routing on the client with Redux (#691)

* Routing on the client with Redux

* Removing unused import
This commit is contained in:
Bernat Orell 2017-01-08 15:04:35 +00:00 committed by Arunoda Susiripala
parent 929041133c
commit 3b1f7115a3
6 changed files with 56 additions and 10 deletions

View file

@ -1,7 +1,4 @@
import React from 'react' export default ({ lastUpdate, light }) => {
import { connect } from 'react-redux'
export default connect(state => state)(({ lastUpdate, light }) => {
return ( return (
<div className={light ? 'light' : ''}> <div className={light ? 'light' : ''}>
{format(new Date(lastUpdate))} {format(new Date(lastUpdate))}
@ -20,7 +17,7 @@ export default connect(state => state)(({ lastUpdate, light }) => {
`}</style> `}</style>
</div> </div>
) )
}) }
const format = t => `${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}` const format = t => `${pad(t.getHours())}:${pad(t.getMinutes())}:${pad(t.getSeconds())}`

View file

@ -0,0 +1,15 @@
import Link from 'next/link'
import { connect } from 'react-redux'
import Clock from './Clock'
export default connect(state => state)(({ title, linkTo, lastUpdate, light }) => {
return (
<div>
<h1>{title}</h1>
<Clock lastUpdate={lastUpdate} light={light} />
<nav>
<Link href={linkTo}>Navigate</Link>
</nav>
</div>
)
})

View file

@ -7,7 +7,7 @@
"start": "next start" "start": "next start"
}, },
"dependencies": { "dependencies": {
"next": "*", "next": "^2.0.0-beta",
"react-redux": "^5.0.1", "react-redux": "^5.0.1",
"redux": "^3.6.0", "redux": "^3.6.0",
"redux-thunk": "^2.1.0" "redux-thunk": "^2.1.0"

View file

@ -1,13 +1,13 @@
import React from 'react' import React from 'react'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import { reducer, initStore, startClock } from '../store' import { reducer, initStore, startClock } from '../store'
import Clock from '../components/Clock' import Page from '../components/Page'
export default class Counter extends React.Component { export default class Counter extends React.Component {
static getInitialProps ({ req }) { static getInitialProps ({ req }) {
const isServer = !!req const isServer = !!req
const store = initStore(reducer, null, isServer) const store = initStore(reducer, null, isServer)
store.dispatch({ type: 'TICK', ts: Date.now() }) store.dispatch({ type: 'TICK', light: !isServer, ts: Date.now() })
return { initialState: store.getState(), isServer } return { initialState: store.getState(), isServer }
} }
@ -27,7 +27,7 @@ export default class Counter extends React.Component {
render () { render () {
return ( return (
<Provider store={this.store}> <Provider store={this.store}>
<Clock /> <Page title='Index Page' linkTo='/other' />
</Provider> </Provider>
) )
} }

View file

@ -0,0 +1,34 @@
import React from 'react'
import { Provider } from 'react-redux'
import { reducer, initStore, startClock } from '../store'
import Page from '../components/Page'
export default class Counter extends React.Component {
static getInitialProps ({ req }) {
const isServer = !!req
const store = initStore(reducer, null, isServer)
store.dispatch({ type: 'TICK', light: !isServer, ts: Date.now() })
return { initialState: store.getState(), isServer }
}
constructor (props) {
super(props)
this.store = initStore(reducer, props.initialState, props.isServer)
}
componentDidMount () {
this.timer = this.store.dispatch(startClock())
}
componentWillUnmount () {
clearInterval(this.timer)
}
render () {
return (
<Provider store={this.store}>
<Page title='Other Page' linkTo='/' />
</Provider>
)
}
}

View file

@ -9,7 +9,7 @@ export const reducer = (state = { lastUpdate: 0, light: false }, action) => {
} }
export const startClock = () => dispatch => { export const startClock = () => dispatch => {
setInterval(() => dispatch({ type: 'TICK', light: true, ts: Date.now() }), 800) return setInterval(() => dispatch({ type: 'TICK', light: true, ts: Date.now() }), 800)
} }
export const initStore = (reducer, initialState, isServer) => { export const initStore = (reducer, initialState, isServer) => {