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'
import { connect } from 'react-redux'
export default connect(state => state)(({ lastUpdate, light }) => {
export default ({ lastUpdate, light }) => {
return (
<div className={light ? 'light' : ''}>
{format(new Date(lastUpdate))}
@ -20,7 +17,7 @@ export default connect(state => state)(({ lastUpdate, light }) => {
`}</style>
</div>
)
})
}
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"
},
"dependencies": {
"next": "*",
"next": "^2.0.0-beta",
"react-redux": "^5.0.1",
"redux": "^3.6.0",
"redux-thunk": "^2.1.0"

View file

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