Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download
Views: 50992
1
2
var ProductCategoryRow = React.createClass({
3
render: function() {
4
return (<tr><th colSpan="2">{this.props.category}</th></tr>);
5
}
6
});
7
8
var ProductRow = React.createClass({
9
render: function() {
10
var name = this.props.product.stocked ?
11
this.props.product.name :
12
<span style={{color: 'red'}}>
13
{this.props.product.name}
14
</span>;
15
return (
16
<tr>
17
<td>{name}</td>
18
<td>{this.props.product.price}</td>
19
</tr>
20
);
21
}
22
});
23
24
var ProductTable = React.createClass({
25
render: function() {
26
var rows = [];
27
var lastCategory = null;
28
this.props.products.forEach(function(product) {
29
if (product.category !== lastCategory) {
30
rows.push(<ProductCategoryRow category={product.category} key={product.category} />);
31
}
32
rows.push(<ProductRow product={product} key={product.name} />);
33
lastCategory = product.category;
34
});
35
return (
36
<table>
37
<thead>
38
<tr>
39
<th>Name</th>
40
<th>Price</th>
41
</tr>
42
</thead>
43
<tbody>{rows}</tbody>
44
</table>
45
);
46
}
47
});
48
49
var SearchBar = React.createClass({
50
render: function() {
51
return (
52
<form>
53
<input type="text" placeholder="Search..." />
54
<p>
55
<input type="checkbox" />
56
{' '}
57
Only show products in stock
58
</p>
59
</form>
60
);
61
}
62
});
63
64
var FilterableProductTable = React.createClass({
65
render: function() {
66
return (
67
<div>
68
<SearchBar />
69
<ProductTable products={this.props.products} />
70
</div>
71
);
72
}
73
});
74
75
76
var PRODUCTS = [
77
{category: 'Sporting Goods', price: '$49.99', stocked: true, name: 'Football'},
78
{category: 'Sporting Goods', price: '$9.99', stocked: true, name: 'Baseball'},
79
{category: 'Sporting Goods', price: '$29.99', stocked: false, name: 'Basketball'},
80
{category: 'Electronics', price: '$99.99', stocked: true, name: 'iPod Touch'},
81
{category: 'Electronics', price: '$399.99', stocked: false, name: 'iPhone 5'},
82
{category: 'Electronics', price: '$199.99', stocked: true, name: 'Nexus 7'}
83
];
84
85
React.render(<FilterableProductTable products={PRODUCTS} />, document.body);
86