├── .gitignore ├── README.md ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── index.html └── manifest.json ├── src ├── App.css ├── App.js ├── App.test.js ├── components │ ├── Body.js │ ├── Counter.js │ ├── FetchRandomUser.js │ ├── Header.js │ ├── ImageSlider.js │ ├── MyForm.js │ ├── Todo.js │ ├── TodoForm.js │ ├── TodoList.js │ └── ValidationForm.js ├── index.css ├── index.js ├── logo.svg └── registerServiceWorker.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | 6 | # testing 7 | /coverage 8 | 9 | # production 10 | /build 11 | 12 | # misc 13 | .DS_Store 14 | .env.local 15 | .env.development.local 16 | .env.test.local 17 | .env.production.local 18 | 19 | npm-debug.log* 20 | yarn-debug.log* 21 | yarn-error.log* 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # practical-react 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "practical-react", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "react": "^16.5.0", 7 | "react-dom": "^16.5.0", 8 | "react-scripts": "1.1.5", 9 | "shortid": "^2.2.13" 10 | }, 11 | "scripts": { 12 | "start": "react-scripts start", 13 | "build": "react-scripts build", 14 | "test": "react-scripts test --env=jsdom", 15 | "eject": "react-scripts eject" 16 | }, 17 | "devDependencies": {} 18 | } 19 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/benawad/practical-react/94b8949c235c0f75a341a6286c17c68fafa51ecf/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 12 | 13 | 22 | React App 23 | 24 | 25 | 28 |
29 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": "./index.html", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | animation: App-logo-spin infinite 20s linear; 7 | height: 80px; 8 | } 9 | 10 | .App-header { 11 | background-color: #222; 12 | height: 150px; 13 | padding: 20px; 14 | color: white; 15 | } 16 | 17 | .App-title { 18 | font-size: 1.5em; 19 | } 20 | 21 | .App-intro { 22 | font-size: large; 23 | } 24 | 25 | @keyframes App-logo-spin { 26 | from { 27 | transform: rotate(0deg); 28 | } 29 | to { 30 | transform: rotate(360deg); 31 | } 32 | } 33 | 34 | .hidden { 35 | display: none; 36 | } 37 | 38 | .visible { 39 | background-color: #f2f2f2; 40 | } 41 | -------------------------------------------------------------------------------- /src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from "react"; 2 | import "./App.css"; 3 | import TodoList from "./components/TodoList"; 4 | 5 | class App extends Component { 6 | state = { 7 | count: 0 8 | }; 9 | 10 | increment = () => { 11 | this.setState({ 12 | count: this.state.count + 1 13 | }); 14 | }; 15 | 16 | decrement = () => { 17 | this.setState({ 18 | count: this.state.count - 1 19 | }); 20 | }; 21 | 22 | render() { 23 | return ( 24 |
25 | 26 |
27 | ); 28 | } 29 | } 30 | 31 | export default App; 32 | -------------------------------------------------------------------------------- /src/App.test.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | 5 | it('renders without crashing', () => { 6 | const div = document.createElement('div'); 7 | ReactDOM.render(, div); 8 | ReactDOM.unmountComponentAtNode(div); 9 | }); 10 | -------------------------------------------------------------------------------- /src/components/Body.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default props => ( 4 |
5 |

{props.text}

6 |

{props.text2}

7 |

{props.myFunc(1, 2)}

8 |
9 | ); 10 | 11 | export const Body2 = () => ( 12 |
13 |
hi
14 |
15 | ); 16 | 17 | export const Body3 = () => ( 18 |
19 |
hi
20 |
21 | ); 22 | -------------------------------------------------------------------------------- /src/components/Counter.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default class Counter extends React.Component { 4 | render() { 5 | bacon; 6 | return ( 7 |
8 |
count: {this.props.count}
9 | 10 | 11 |
12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/components/FetchRandomUser.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default class FetchRandomUser extends React.Component { 4 | state = { 5 | loading: true, 6 | people: [] 7 | }; 8 | 9 | async componentDidMount() { 10 | const url = "https://api.randomuser.me/?results=5"; 11 | const response = await fetch(url); 12 | const data = await response.json(); 13 | this.setState({ people: data.results, loading: false }); 14 | } 15 | 16 | render() { 17 | if (this.state.loading) { 18 | return
loading...
; 19 | } 20 | 21 | if (!this.state.people.length) { 22 | return
didn't get a person
; 23 | } 24 | 25 | // const peopleJsx = []; 26 | 27 | // this.state.people.forEach(person => { 28 | // peopleJsx.push( 29 | //
30 | //
{person.name.title}
31 | //
{person.name.first}
32 | //
{person.name.last}
33 | // 34 | //
35 | // ); 36 | // }); 37 | 38 | return ( 39 |
40 | {this.state.people.map(person => ( 41 |
42 |
{person.name.title}
43 |
{person.name.first}
44 |
{person.name.last}
45 | 46 |
47 | ))} 48 |
49 | ); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/components/Header.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import logo from "../logo.svg"; 3 | 4 | export default class Header extends React.Component { 5 | render() { 6 | return ( 7 |
8 | logo 9 |

{this.props.title}

10 |
11 | ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/components/ImageSlider.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | /* 4 | 1. shallow merge 5 | 2. async 6 | */ 7 | 8 | export default class ImageSlider extends React.Component { 9 | state = { 10 | images: [ 11 | "https://i.pinimg.com/236x/b6/21/07/b62107d70659823c6f409480f7435d14--watercolor-food-watercolor-print.jpg", 12 | "https://i.pinimg.com/236x/8a/61/c1/8a61c1ca0d1a20db922aa5e3a8493d0e--watercolour-flowers-watercolor-ideas.jpg", 13 | "https://i.pinimg.com/236x/86/d6/46/86d646ce2f92efd7890843ef5af9e700.jpg", 14 | "https://i.pinimg.com/236x/f6/4d/d7/f64dd7eb8df298195d61569b9634f982--watercolor-sketch-watercolor-kiwi.jpg" 15 | ], 16 | idx: 0 17 | }; 18 | 19 | handleNext = () => { 20 | this.setState({ 21 | idx: this.state.idx + 1 22 | }); 23 | }; 24 | 25 | render() { 26 | return ( 27 |
28 | 37 | 44 | 45 |
46 | ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /src/components/MyForm.js: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | export default class MyForm extends React.Component { 4 | state = { 5 | name: "ben", 6 | favoritePet: "", 7 | rememberMe: false, 8 | title: "Miss." 9 | }; 10 | 11 | handleChange = event => { 12 | const isCheckbox = event.target.type === "checkbox"; 13 | this.setState({ 14 | [event.target.name]: isCheckbox 15 | ? event.target.checked 16 | : event.target.value 17 | }); 18 | }; 19 | 20 | handleSubmit = event => { 21 | event.preventDefault(); 22 | console.log(this.state); 23 | }; 24 | 25 | render() { 26 | return ( 27 |
28 | 33 |