Skip to content

Commit 74be2da

Browse files
Add Redux to the server and client and connect to <Layout>
- Remove ReactRouter's createElement prop and wrap ReactRouter in ReactRedux's Provider component for both server and client. - Redux store - Create a minimal reducer that returns the state only. - Pass the initial state for server and client. - Use ReactRedux's connect method to map state to props for <Layout>.
1 parent f7b1edf commit 74be2da

File tree

4 files changed

+31
-16
lines changed

4 files changed

+31
-16
lines changed

client.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
var ReactDOM = require('react-dom');
2+
var React = require('react');
23
var routes = require('./routes/routes.jsx');
4+
var Redux = require('redux');
5+
var Provider = require('react-redux').Provider;
6+
7+
function reducer(state) { return state; }
8+
9+
var store = Redux.createStore(reducer, window.PROPS);
310

411
ReactDOM.render(
5-
routes, document
12+
<Provider store={store}>
13+
{routes}
14+
</Provider>, document
615
);

routes/index.jsx

+10-6
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,24 @@ var router = require('express').Router();
22
var React = require('react');
33
var ReactDOMServer = require('react-dom/server');
44
var ReactRouter = require('react-router');
5+
var Redux = require('redux');
6+
var Provider = require('react-redux').Provider;
7+
8+
function reducer(state) { return state; }
59

610
router.get('*', function(request, response) {
7-
var props = { title: 'Universal React' };
11+
var initialState = { title: 'Universal React' };
12+
var store = Redux.createStore(reducer, initialState);
13+
814
ReactRouter.match({
915
routes: require('./routes.jsx'),
1016
location: request.url
1117
}, function(error, redirectLocation, renderProps) {
1218
if (renderProps) {
1319
var html = ReactDOMServer.renderToString(
14-
<ReactRouter.RouterContext {...renderProps}
15-
createElement={function(Component, renderProps) {
16-
return <Component {...renderProps} custom={props} />;
17-
}}
18-
/>
20+
<Provider store={store}>
21+
<ReactRouter.RouterContext {...renderProps} />
22+
</Provider>
1923
);
2024
response.send(html);
2125
} else {

routes/routes.jsx

+1-7
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,8 @@ var Route = ReactRouter.Route;
55
var IndexRoute = ReactRouter.IndexRoute;
66
var browserHistory = ReactRouter.browserHistory;
77

8-
if (typeof window === 'object') {
9-
function createElement(Component, props) {
10-
return <Component {...props} custom={window.PROPS} />;
11-
}
12-
}
13-
148
module.exports = (
15-
<Router history={browserHistory} createElement={createElement}>
9+
<Router history={browserHistory}>
1610
<Route path='/' component={require('../views/Layout.jsx')}>
1711
<IndexRoute component={require('../views/Index.jsx')} />
1812
<Route path='about' component={require('../views/About.jsx')} />

views/Layout.jsx

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
var React = require('react');
22
var Link = require('react-router').Link;
3+
var connect = require('react-redux').connect;
34

4-
module.exports = React.createClass({
5-
displayName: 'Layout',
5+
var Layout = React.createClass({
66
_handleClick: function() {
77
alert();
88
},
@@ -36,3 +36,11 @@ module.exports = React.createClass({
3636
);
3737
}
3838
});
39+
40+
var wrapper = connect(
41+
function(state) {
42+
return { custom: state };
43+
}
44+
);
45+
46+
module.exports = wrapper(Layout);

0 commit comments

Comments
 (0)