React App using ES6

Layout
Component
Recap These Terms
- Constructor in ES6 class
- Controlled Component
- Functional & Stateless functional Components
- Arrow function
- ES6 class Module import Export
Components
- Cart
- Product
- ProductList
Cart
/** @jsx React.DOM */
var Cart = React.createClass({
getInitialState: function() {
// also subscribe to product events here
$.subscribe('cart.added', this.addItem);
$.subscribe('cart.removed', this.removeItem);
return {
items: [],
total: 0,
currency: 'EUR'
};
},
addItem: function(e, item) {
this.state.items.push(item);
this.forceUpdate();
this.countTotal();
},
removeItem: function(e, itemId) {
var itemIndexInArray;
this.state.items.some(function(item, index) {
if(item.id === itemId) {
itemIndexInArray = index;
return true;
}
});Product
/** @jsx React.DOM */
var Product = React.createClass({
getInitialState: function() {
return {
added: false
};
},
addToCart: function(e) {
if(!this.state.added) {
// add
$.publish('cart.added', this.props.data);
}
else {
// remove
$.publish('cart.removed', this.props.data.id);
}
this.setState({
added: !this.state.added
});
},
render: function() {
// assign to props
var data = this.props.data;
return (
<div className="thumbnail">
<img src={data.image} className="fixwidth" alt="product image" />
<div className="caption clearfix">
<h3><a href={data.url}>{data.name}</a></h3>
<div className="product__price">{data.price} {data.currency}</div>
<div className="product__button-wrap">
<button className={this.state.added ? 'btn btn-danger' : 'btn btn-primary'} onClick={this.addToCart}>
{this.state.added ? 'Remove' : 'Add to cart'}
</button>
</div>
</div>
</div>
);
}
});Product List
/** @jsx React.DOM */
var ProductsList = React.createClass({
render: function() {
var products = this.props.data.map(function(product) {
return (
<li key={product.id}>
<Product data={product} />
</li>
)
});
return (
<ul className="clearfix">
{products}
</ul>
);
}
});
Make it Controlled component
import React, { Component } from 'react';
class SearchBar extends Component {
constructor(props) {
super(props);
this.state = { term: '' };
}
render() {
return (
<div>
<input
value={this.state.term}
onChange={event => this.setState({ term: event.target.value })} />
</div>
);
}
}
export default SearchBar;
Video List Components
import React from 'react';
import VideoListItem from './video_list_item';
const VideoList = (props) => {
const videoItems = props.videos.map((video) => {
return <VideoListItem video={video} />
});
return (
<ul className="col-md-4 list-group">
{videoItems}
</ul>
);
};
export default VideoList;Video List Item Components
import React from 'react';
const VideoListItem = (props) => {
return <li>Video</li>;
};
export default VideoListItem;
Now list from props .map(video)
import React from 'react';
import VideoListItem from './video_list_item';
const VideoList = (props) => {
const videoItems = props.videos.map((video) => {
return <VideoListItem key={video.etag} video={video} />
});
return (
<ul className="col-md-4 list-group">
{videoItems}
</ul>
);
};
export default VideoList;
Show one Video Details
import React from 'react';
const VideoDetail = ({video}) => {
const videoId = video.id.videoId;
const url = `https://www.youtube.com/embed/${videoId}`;
return (
<div className="video-detail col-md-8">
<div className="embed-responsive embed-responsive-16by9">
<iframe className="embed-responsive-item" src={url}></iframe>
</div>
<div className="details">
<div>{video.snippet.title}</div>
<div>{video.snippet.description}</div>
</div>
</div>
);
};
export default VideoDetail;
lets complete app..
React JS Section 4.4.x
By Tarun Sharma
React JS Section 4.4.x
React JS App using ES6
- 725