Skip to content

Commit 4928a01

Browse files
author
James Martin
committed
Basic MainComponent dynamically loading children from remote
1 parent 4d03c05 commit 4928a01

File tree

4 files changed

+125
-0
lines changed

4 files changed

+125
-0
lines changed

src/app.js

+72
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
var MainComponent = React.createClass({
2+
children: function() {
3+
return(
4+
_.map(this.props.children, function(child, index) {
5+
return React.createElement(child.name, _.merge(child.props, {key: index}));
6+
})
7+
);
8+
},
9+
10+
render: function() {
11+
return(
12+
<div>
13+
<h1>Main</h1>
14+
{this.children()}
15+
</div>
16+
);
17+
}
18+
});
19+
20+
var remoteComponents = [
21+
{
22+
name: 'SimpleComponent',
23+
src: '/build/simpleComponent.js'
24+
},
25+
{
26+
name: 'GreeterComponent',
27+
src: '/build/greeterComponent.js',
28+
props: {name: 'Bob'}
29+
}
30+
];
31+
32+
var loadRemoteComponent = function(component) {
33+
return new Promise(function(resolve, reject) {
34+
var request = new XMLHttpRequest();
35+
36+
request.onload = function() {
37+
if(request.status >= 200 && request.status < 400) {
38+
var remoteComponentSrc = request.responseText;
39+
window.eval(remoteComponentSrc);
40+
return resolve({name: eval(component.name), props: component.props || {}});
41+
} else {
42+
return reject();
43+
}
44+
};
45+
46+
request.open('GET', component.src);
47+
request.send();
48+
});
49+
};
50+
51+
var loadRemoteComponents = function(components) {
52+
return Promise.all(
53+
_.map(components, function(component) {
54+
console.log(component.name, component.src);
55+
return loadRemoteComponent(component);
56+
})
57+
);
58+
};
59+
60+
var loadApp = function(children) {
61+
React.render(
62+
React.createElement(MainComponent, {children: children}),
63+
document.getElementById('main')
64+
);
65+
};
66+
67+
loadRemoteComponents(remoteComponents)
68+
.then(loadApp)
69+
.catch(function(err) {
70+
console.log("Something went wrong: " + err);
71+
});
72+

src/greeterComponent.js

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
var GreeterComponent = React.createClass({
2+
3+
getInitialState: function() {
4+
return(
5+
{name: this.props.name || 'World'}
6+
);
7+
},
8+
9+
render: function() {
10+
return(
11+
<div>
12+
<p>I am the greeter component.</p>
13+
<p>Hello, {this.state.name}!</p>
14+
</div>
15+
);
16+
}
17+
});

src/simpleComponent.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
var SimpleComponent = React.createClass({
2+
3+
getInitialState: function() {
4+
return(
5+
{value: ''}
6+
);
7+
},
8+
9+
handleChange: function(event) {
10+
this.setState({value: event.target.value});
11+
},
12+
13+
render: function() {
14+
return(
15+
<div>
16+
<p>I am a simple component.</p>
17+
<p>My input value is: <strong>{this.state.value}</strong></p>
18+
<input type='text' value={this.state.value} onChange={this.handleChange} />
19+
</div>
20+
);
21+
}
22+
});

test.html

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8" />
5+
<title>Remote React Components</title>
6+
<script src="vendor/lodash.min.js"></script>
7+
<script src="vendor/lie.min.js"></script>
8+
<script src="build/react.js"></script>
9+
</head>
10+
<body>
11+
<div id="main"></div>
12+
<script src="build/app.js"></script>
13+
</body>
14+
</html>

0 commit comments

Comments
 (0)