import React, { Component } from "react";
import Box from "./Box";
import NewBoxForm from "./NewBoxForm";
export default class BoxList extends Component {
constructor(props) {
super(props);
this.state = { boxes: [] };
this.create = this.create.bind(this);
}
remove(id) {
this.setState({
boxes: this.state.boxes.filter(box => box.id !== id)
});
}
create(newBox) {
this.setState({
boxes: [...this.state.boxes, newBox]
});
}
render() {
const boxes = this.state.boxes.map(box => (
<Box
key={box.id}
id={box.id}
width={box.width}
height={box.height}
color={box.color}
removeBox={() => this.remove(box.id)}
/>
));
return (
<div>
<h1>Color Box Maker Thingy</h1>
<NewBoxForm createBox={this.create} />
{boxes}
</div>
);
}
}
import React, { Component } from "react";
import uuid from "uuid/v4";
export default class NewBoxForm extends Component {
constructor(props) {
super(props);
this.state = { height: "", width: "", color: "" };
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(evt) {
this.setState({
[evt.target.name]: evt.target.value
});
}
handleSubmit(evt) {
evt.preventDefault();
const newBox = { ...this.state, id: uuid() };
this.props.createBox(newBox);
this.setState({
height: "",
width: "",
color: ""
});
}
render() {
return (
<form onSubmit={this.handleSubmit}>
<div>
<label htmlFor="height">Height</label>
<input
type="text"
name="height"
value={this.state.height}
onChange={this.handleChange}
id="height"
/>
</div>
<div>
<label htmlFor="width">Width</label>
<input
type="text"
name="width"
value={this.state.width}
onChange={this.handleChange}
id="width"
/>
</div>
<div>
<label htmlFor="color">Color</label>
<input
type="text"
name="color"
value={this.state.color}
onChange={this.handleChange}
id="color"
/>
</div>
<button>Add New Box!</button>
</form>
);
}
}
import React, { Component } from "react";
export default class Box extends Component {
render() {
return (
<div>
<div
style={{
height: `${this.props.height}em`,
width: `${this.props.width}em`,
backgroundColor: this.props.color
}}
/>
<button onClick={this.props.removeBox}>X</button>
</div>
);
}
}