-
Notifications
You must be signed in to change notification settings - Fork 0
Exercise React Components State Props
sergio edited this page Jan 25, 2021
·
2 revisions
//fetch library without backend?
import fetchMock from 'fetch-mock';
import { getAll, getByType } from './data/pets';
import 'whatwg-fetch';
fetchMock.get('/api/pets', getAll());
fetchMock.get('/api/pets?type=cat', getByType('cat'));
fetchMock.get('/api/pets?type=dog', getByType('dog'));
fetchMock.get('/api/pets?type=micropig', getByType('micropig'));
export default fetchMock;
//index
import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App';
import './fetch-setup';
ReactDOM.render(<App />, document.getElementById('root'));//App
import React from 'react';
import Filters from './Filters';
import PetBrowser from './PetBrowser';
class App extends React.Component {
constructor() {
super();
this.state = {
pets: [],
filters: {
type: 'all'
}
};
}
fetchPets = () => {
let endpoint = '/api/pets';
if (this.state.filters.type !== 'all') {
endpoint += `?type=${this.state.filters.type}`;
}
fetch(endpoint)
.then(res => res.json())
.then(pets => this.setState({ pets: pets }));
};
onChangeType = ({ target: { value } }) => {
this.setState({ filters: { ...this.state.filters, type: value } });
};
onAdoptPet = petId => {
const pets = this.state.pets.map(p => {
return p.id === petId ? { ...p, isAdopted: true } : p;
});
this.setState({ pets: pets });
};
render() {
return (
<div className="ui container">
<header>
<h1 className="ui dividing header">React Animal Shelter</h1>
</header>
<div className="ui container">
<div className="ui grid">
<div className="four wide column">
<Filters
onChangeType={this.onChangeType}
onFindPetsClick={this.fetchPets}
/>
</div>
<div className="twelve wide column">
<PetBrowser pets={this.state.pets} onAdoptPet={this.onAdoptPet} />
</div>
</div>
</div>
</div>
);
}
}
export default App;
//Filters
import React from 'react';
class Filters extends React.Component {
render() {
return (
<div className="ui form">
<h3>Animal type</h3>
<div className="field">
<select name="type" id="type" onChange={this.props.onChangeType}>
<option value="all">All</option>
<option value="cat">Cats</option>
<option value="dog">Dogs</option>
<option value="micropig">Micropigs</option>
</select>
</div>
<div className="field">
<button
onClick={this.props.onFindPetsClick}
className="ui secondary button">
Find pets
</button>
</div>
</div>
);
}
}
export default Filters;
//PetBrowser
import React from 'react';
import Pet from './Pet';
class PetBrowser extends React.Component {
render() {
const petCards = this.props.pets.map(pet => (
<Pet pet={pet} key={pet.id} onAdoptPet={this.props.onAdoptPet} />
));
return <div className="ui cards">{petCards}</div>;
}
}
export default PetBrowser;
//Pet
import React from 'react';
class Pet extends React.Component {
render() {
return (
<div className="card">
<div className="content">
<a className="header">
{this.props.pet.name}{' '}
{this.props.pet.gender === 'female' ? '♀' : '♂'}
</a>
<div className="meta">
<span className="date">{this.props.pet.type}</span>
</div>
<div className="description">
<p>Age: {this.props.pet.age}</p>
<p>Weight: {this.props.pet.weight}</p>
</div>
</div>
<div className="extra content">
{this.props.pet.isAdopted ? (
<button className="ui disabled button">Already adopted</button>
) : (
<button
onClick={() => this.props.onAdoptPet(this.props.pet.id)}
className="ui primary button">
Adopt pet
</button>
)}
</div>
</div>
);
}
}
export default Pet;
- Mounting -
static getDerivedStateFromProps(props, state)- Mounting -
componentDidMount()- Updating -
static getDerivedStateFromProps(props, state)- Updating -
shouldComponentUpdate(nextProps, nextState)- Updating -
render()- Updating -
getSnapshotBeforeUpdate(prevProps, prevState)- Updating -
componentDidUpdate(prevProps, prevState, snapshot)- Unmounting -
componentWillUnmount()- Element Ref