JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.5/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/0.14.5/react-dom.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/3.0.5/redux.js"></script>
<div id="app"></div>
Babel + JSX
const { createStore } = Redux;
// Initial state for reducer
const initialState = {
isOn: false,
time: 0
};
// Reducer function
const timer = (state = initialState, action) => {
switch (action.type) {
case 'START_TIMER':
return {
...state,
isOn: true,
offset: action.offset
};
case 'STOP_TIMER':
return {
...state,
isOn: false
};
case 'TICK':
return {
...state,
time: state.time + (action.time - state.offset),
offset: action.time
};
default:
return state;
}
}
// Create store using the reducer
const store = createStore(timer);
// React Component to display the timer
class Timer extends React.Component {
constructor() {
super();
this.start = this.start.bind(this);
}
start() {
store.dispatch({
type: 'START_TIMER',
offset: Date.now()
});
setInterval(() => {
store.dispatch({
type: 'TICK',
time: Date.now()
});
});
}
stop() {
// Clear the interval here
}
click() {
this.props.isOn ? start() : stop();
}
format(time) {
const pad = (time, length) => {
while (time.length < length) {
time = '0' + time;
}
return time;
}
time = new Date(time);
let m = pad(time.getMinutes().toString(), 2);
let s = pad(time.getSeconds().toString(), 2);
let ms = pad(time.getMilliseconds().toString(), 3);
return `${m} : ${s} . ${ms}`;
}
render() {
return (
<div>
<h1>Time: {this.format(this.props.time)}</h1>
<button onClick={this.start}>Start</button>
</div>
);
}
}
// render function that runs everytime an action is dispatched
const render = () => {
ReactDOM.render(
<Timer
time={store.getState().time}
isOn={store.getState().isOn}
/>,
document.getElementById('app')
);
}
store.subscribe(render);
render();