рд░рд┐рдПрдХреНрдЯ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдореЗрдо рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

тЖТ
рднрд╛рдЧ 1: рдкрд╛рдареНрдпрдХреНрд░рдо рдЕрд╡рд▓реЛрдХрди, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдХрд╛рд░рдг, ReactDOM рдФрд░ JSXтЖТ
рднрд╛рдЧ 2: рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХтЖТ
рднрд╛рдЧ 3: рдШрдЯрдХ рдлрд╛рдЗрд▓реЗрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛тЖТ
рднрд╛рдЧ 4: рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдмрдЪреНрдЪреЗ рдХреЗ рдШрдЯрдХтЖТ
рднрд╛рдЧ 5: рдПрдХ TODO рдЖрд╡реЗрджрди рдкрд░ рдХрд╛рдо рдХреА рд╢реБрд░реБрдЖрдд, рд╕реНрдЯрд╛рдЗрд▓ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВтЖТ
рднрд╛рдЧ 6: рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЬреЗрдПрд╕рдПрдХреНрд╕ рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯтЖТ
рднрд╛рдЧ 7: рдЗрдирд▓рд╛рдЗрди рд╢реИрд▓реАтЖТ
рднрд╛рдЧ 8: TODO рдЖрд╡реЗрджрди рдкрд░ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦрд╛, рдШрдЯрдХреЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рддтЖТ
рднрд╛рдЧ 9: рдШрдЯрдХ рдЧреБрдгтЖТ
рднрд╛рдЧ 10: рдШрдЯрдХ рдЧреБрдгреЛрдВ рдФрд░ рд╕реНрдЯрд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛тЖТ
рднрд╛рдЧ 11: рдбрд╛рдпрдиреЗрдорд┐рдХ рдорд╛рд░реНрдХрдЕрдк рдЬреЗрдирд░реЗрд╢рди рдФрд░ рдореИрдк рдПрд░реЗ рд╡рд┐рдзрд┐тЖТ
рднрд╛рдЧ 12: рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛, рдПрдХ TODO рдЖрд╡реЗрджрди рдкрд░ рдХрд╛рдо рдХрд╛ рддреАрд╕рд░рд╛ рдЪрд░рдгтЖТ
рднрд╛рдЧ 13: рд╡рд░реНрдЧ-рдЖрдзрд╛рд░рд┐рдд рдШрдЯрдХтЖТ
рднрд╛рдЧ 14: рд╡рд░реНрдЧ-рдЖрдзрд╛рд░рд┐рдд рдШрдЯрдХреЛрдВ, рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ рдкрд░ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛тЖТ
рднрд╛рдЧ 15: рдШрдЯрдХ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛рдПрдБтЖТ
рднрд╛рдЧ 16: TODO рдЖрд╡реЗрджрди, рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдкрд░ рдХрд╛рдо рдХрд╛ рдЪреМрдерд╛ рдЪрд░рдгтЖТ
рднрд╛рдЧ 17: TODO рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд░ рдХрд╛рдо рдХрд╛ рдкрд╛рдВрдЪрд╡рд╛ рдЪрд░рдг, рдШрдЯрдХреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИтЖТ
рднрд╛рдЧ 18: TODO рдЖрд╡реЗрджрди рдкрд░ рдХрд╛рдо рдХрд╛ рдЫрдард╛ рдЪрд░рдгтЖТ
рднрд╛рдЧ 19: рдШрдЯрдХ рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпрд╛рдБрднрд╛рдЧ 20: рд╕рд╢рд░реНрдд рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рдкрд╣рд▓рд╛ рдкрд╛рдатЖТ
рднрд╛рдЧ 21: рд╕рд╢рд░реНрдд рдкреНрд░рддрд┐рдкрд╛рджрди рдкрд░ рджреВрд╕рд░рд╛ рдкрд╛рда рдФрд░ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛тЖТ
рднрд╛рдЧ 22: TODO рдЖрд╡реЗрджрди рдкрд░ рдХрд╛рдо рдХрд╛ рд╕рд╛рддрд╡рд╛рдВ рдЪрд░рдг, рдмрд╛рд╣рд░реА рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛тЖТ
рднрд╛рдЧ 23: рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдкрд╣рд▓рд╛ рдкрд╛рдатЖТ
рднрд╛рдЧ 24: рджреВрд╕рд░рд╛ рд░реВрдк рдкрд╛рдатЖТ
рднрд╛рдЧ 25: рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛тЖТ
рднрд╛рдЧ 26: рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛, рдХрдВрдЯреЗрдирд░ / рдШрдЯрдХ рдкреИрдЯрд░реНрдитЖТ
рднрд╛рдЧ 27: рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░рд┐рдпреЛрдЬрдирд╛рдкрд╛рда 45. рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ред рдореЗрдореЗ рдЬрдирд░реЗрдЯрд░
тЖТ
рдореВрд▓рддреЛ рд╣рдо рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдЬреЛ рдореЗрдореЛрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рдЖрдЗрдП рдЗрд╕ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рдорд╛рдирдХ рдмрдирд╛рдПрдБ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ:
npx create-react-app meme-generator
рдпрд╣рд╛рдВ рдЖрдк рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛ред рдорд╛рдирдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рд╕реНрдерд┐рдд рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ,
index.js
рдФрд░
App.js
ред рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдорд╛рдирдХ рддрдВрддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЦреБрдж рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
* { box-sizing: border-box; } body { margin: 0; background-color: whitesmoke; } header { height: 100px; display: flex; align-items: center; background: #6441A5; background: -webkit-linear-gradient(to right, #2a0845, #6441A5); background: linear-gradient(to right, #2a0845, #6441A5); } header > img { height: 80%; margin-left: 10%; } header > p { font-family: VT323, monospace; color: whitesmoke; font-size: 50px; margin-left: 60px; } .meme { position: relative; width: 90%; margin: auto; } .meme > img { width: 100%; } .meme > h2 { position: absolute; width: 80%; text-align: center; left: 50%; transform: translateX(-50%); margin: 15px 0; padding: 0 5px; font-family: impact, sans-serif; font-size: 2em; text-transform: uppercase; color: white; letter-spacing: 1px; text-shadow: 2px 2px 0 #000, -2px -2px 0 #000, 2px -2px 0 #000, -2px 2px 0 #000, 0 2px 0 #000, 2px 0 0 #000, 0 -2px 0 #000, -2px 0 0 #000, 2px 2px 5px #000; } .meme > .bottom { bottom: 0; } .meme > .top { top: 0; } .meme-form { width: 90%; margin: 20px auto; display: flex; justify-content: space-between; } .meme-form > input { width: 45%; height: 40px; } .meme-form > button { border: none; font-family: VT323, monospace; font-size: 25px; letter-spacing: 1.5px; color: white; background: #6441A5; } .meme-form > input::-webkit-input-placeholder { font-family: VT323, monospace; font-size: 25px; text-align: cen } .meme-form > input::-moz-placeholder { font-family: VT323, monospace; font-size: 25px; text-align: cen } .meme-form > input:-ms-input-placeholder { font-family: VT323, monospace; font-size: 25px; text-align: cen } .meme-form > input:-moz-placeholder { font-family: VT323, monospace; font-size: 25px; text-align: cen }
рдЗрди рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ
index.css
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░
index.js
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
index.css
рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐
index.js
рдФрд░
App.js
рдлрд╛рдЗрд▓реЗрдВ рдЕрднреА рдЦрд╛рд▓реА рд╣реИрдВ, рдЖрдк, рдкрд╣рд▓реЗ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ,
index.js
рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ,
App.js
рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдШрдЯрдХ
App.js
рдФрд░ рдЗрд╕реЗ
index.js
рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣рд╛рдБ рд╣реИ рдХрд┐
index.js
рдореЗрдВ рдХреНрдпрд╛ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
import React from "react" import ReactDOM from "react-dom" import './index.css' import App from "./App" ReactDOM.render(<App />, document.getElementById("root"))
рдпрд╣рд╛рдБ рд╣рдо
React
рдФрд░
ReactDOM
рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ,
index.css
рдФрд░
App
рдШрдЯрдХ рд╕реЗ рдЖрдпрд╛рдд рд╢реИрд▓рд┐рдпреЛрдВред рдЙрд╕рдХреЗ рдмрд╛рдж,
ReactDOM.render()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рдпрд╣
ReactDOM.render()
рдХрд░рддреЗ рд╣реИрдВ рдХрд┐
App
рдШрдЯрдХ рдХреНрдпрд╛
root
рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (
<div id="root"></div>
) рдХреЗ рд╕рд╛рде
index.html
рдкреГрд╖реНрда рдХреЗ рддрддреНрд╡ рдореЗрдВ рдмрдирд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ
App.js
рдлрд╛рдЗрд▓
App.js
рд╕рдХрддреА рд╣реИ:
import React from "react" function App() { return ( <h1>Hello world!</h1> ) } export default App
рдпрд╣рд╛рдБ рдЕрдм рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЗрд╕ рд╕реНрддрд░ рдкрд░, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдХреА рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдЕрдм рджреЛ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рджреЛ рдирдП рдШрдЯрдХ рдмрдирд╛рдПрдВ, рдЬрд┐рдирдХреЗ рдирд╛рдо рдШрдЯрдХреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ:
Header
рдШрдЯрдХ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЗрдбрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редMemeGenerator
рдШрдЯрдХ, рдЬрд┐рд╕рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕реМрдВрдкреЗ рдЧрдП рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╣рд▓ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЕрд░реНрдерд╛рддреН, рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдпрд╣рд╛рдБ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрдЯрд╛ рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрди рдШрдЯрдХреЛрдВ рдХреЛ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдп рд╕реМрдВрдкреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
рдпрд╣рд╛рдБ
Header.js
рдлрд╝рд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рд╣реИ:
import React from "react" function Header() { return ( <h1>HEADER</h1> ) } export default Header
рдЪреВрдВрдХрд┐ рдпрд╣ рдШрдЯрдХ рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЗрдбрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рд╣реИред
рдпрд╣рд╛рдБ
MemeGenerator.js
рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
import React, {Component} from "react" class MemeGenerator extends Component { constructor() { super() this.state ={} } render() { return ( <h1>MEME GENERATOR SECTION</h1> ) } } export default MemeGenerator
рдпрд╣рд╛рдВ, рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдЬрд┐рдиреНрд╣реЗрдВ
MemeGenerator
рдШрдЯрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ, рд╣рдо рдХрдХреНрд╖рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рдЦрд╛рд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд░рд╛рдЬреНрдп рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВред
рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрдиреНрд╣реЗрдВ
App.js
рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░
App
рдХреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рд╕реЗ рдорд╛рд░реНрдХрдЕрдк рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрди рдШрдЯрдХреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдШрдЯрдХ рдХрдИ рддрддреНрд╡реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдХреБрдЫ рдореЗрдВ
App.js
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣
<div>
ред рдпрд╣рд╛рдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛
App.js
рдХреЛрдб рд╣реИ:
import React from "react" import Header from "./Header" import MemeGenerator from "./MemeGenerator" function App() { return ( <div> <Header /> <MemeGenerator /> </div> ) } export default App
рдЖрд╡реЗрджрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдЕрдм
Header
рдШрдЯрдХ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо рд╢рдмреНрджрд╛рд░реНрде рддрддреНрд╡ HTML5
<header>
рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЯреИрдЧ рдореЗрдВ рдЪрд┐рддреНрд░ рдФрд░ рдкрд╛рда рд╣реЛрдЧрд╛ред рдЕрдм
Header.js
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
import React from "react" function Header() { return ( <header> <img src="http://www.pngall.com/wp-content/uploads/2016/05/Trollface.png" alt="Problem?" /> <p>Meme Generator</p> </header> ) } export default Header
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдРрдк рдХрд╛ рд▓реБрдХ рдХреИрд╕реЗ рдмрджрд▓реЗрдЧрд╛ред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реАрд░реНрд╖рдХ рдХреЛ рдкрд╣рд▓реЗ
index.js
рдореЗрдВ
index.js
рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
Header
рдШрдЯрдХ рдкрд░ рдХрд╛рдо рдЕрдм рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред
рд╣рдо
MemeGenerator
рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рдЕрдм рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдХреЛ рд▓рд┐рдЦрдХрд░ рдЗрд╕ рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
- рдореЗрдореЗ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдкрд╛рда (
topText
рдкреНрд░реЙрдкрд░реНрдЯреА)ред - рдореЗрдореЗ рдХреЗ рддрд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдкрд╛рда (
bottomText
рд╕рдВрдкрддреНрддрд┐)ред - рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЫрд╡рд┐ (
randomImage
рдЧреБрдг рдЬреЛ рд▓рд┐рдВрдХ http://i.imgflip.com/1bij.jpg ) рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдпрд╣ рд░рд╛рдЬреНрдп рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
MemeGenerator.js
рдХреЛрдб рд╣реЛрдЧрд╛:
import React, {Component} from "react" class MemeGenerator extends Component { constructor() { super() this.state = { topText: "", bottomText: "", randomImg: "http://i.imgflip.com/1bij.jpg" } } render() { return ( <h1>MEME GENERATOR SECTION</h1> ) } } export default MemeGenerator
рдЕрдм рдЖрд╡реЗрджрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдЧреАред
рд╣рдо рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореЗрдо рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдХрд╛рдо рдХреЗ рдЗрд╕ рдЪрд░рдг рдореЗрдВ, рдЖрдкрдХреЛ
MemeGenerator
рдШрдЯрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдПрдкреАрдЖрдИ https://api.imgflip.com/get_memes/ рдкрд░ рдХреЙрд▓ рдХрд░реЗрдВ ред
- рдирдИ рд╕реНрдЯреЗрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА (
allMemeImgs
) рдореЗрдВ response.data.memes
рдПрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдбреЗрдЯрд╛ рдХреЛ рд╕рд╣реЗрдЬреЗрдВред
рдпрд╣рд╛рдБ, рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, JSON рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЗрд╕ рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдБрдЪрддреЗ рд╕рдордп рд╡рд╛рдкрд╕ рдЖрдпрд╛:
{ "success":true, "data":{ "memes":[ { "id":"112126428", "name":"Distracted Boyfriend", "url":"https:\/\/i.imgflip.com\/1ur9b0.jpg", "width":1200, "height":800, "box_count":3 }, { "id":"87743020", "name":"Two Buttons", "url":"https:\/\/i.imgflip.com\/1g8my4.jpg", "width":600, "height":908, "box_count":2 }, { "id":"129242436", "name":"Change My Mind", "url":"https:\/\/i.imgflip.com\/24y43o.jpg", "width":482, "height":361, "box_count":2 }, тАж. ] } }
рдКрдкрд░ рдкреНрд░рд╕реНрддреБрдд рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╣рдо рдЙрд╕ рдбреЗрдЯрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдШрдЯрдХ рдХреЛ рдЖрд╡реЗрджрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣реА рдЪрд╛рд╣рд┐рдПред
рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо
componentDidMount()
рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд┐рдзрд┐ рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдВрдЧреЗред рдпрд╣рд╛рдВ рд╣рдо, рдорд╛рдирдХ
fetch()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдкреАрдЖрдИ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рдпрд╣ рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛, рд╣рдо
memes
рдПрд░реЗ рдХреЛ рдЗрд╕рдореЗрдВ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдирдП рд╕реНрдЯреЗрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА
allMemeImgs
, рдЬрд┐рд╕реЗ рдЦрд╛рд▓реА рдПрд░реЗ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдЕрднреА рддрдХ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдбреЗрдЯрд╛ рд▓реЛрдбрд┐рдВрдЧ рддрдВрддреНрд░ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВрдЧреЗред
рдпрд╣рд╛рдБ рдХрд╛рдо рдХреЗ рдЗрд╕ рд╕реНрддрд░ рдкрд░
MemeGenerator
рдШрдЯрдХ рдХрд╛ рдХреЛрдб рд╣реИ:
import React, {Component} from "react" class MemeGenerator extends Component { constructor() { super() this.state = { topText: "", bottomText: "", randomImg: "http://i.imgflip.com/1bij.jpg", allMemeImgs: [] } } componentDidMount() { fetch("https://api.imgflip.com/get_memes") .then(response => response.json()) .then(response => { const {memes} = response.data console.log(memes[0]) this.setState({ allMemeImgs: memes }) }) } render() { return ( <h1>MEME GENERATOR SECTION</h1> ) } } export default MemeGenerator
рдбреЗрдЯрд╛ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрдВрд╕реЛрд▓ рдХреЛ рдпрд╣реА рдорд┐рд▓рддрд╛ рд╣реИред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЗ рдХрдВрд╕реЛрд▓ рдкрд░ рдЖрдЙрдЯрдкреБрдЯрдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЫрд╡рд┐ рдХрдИ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрдгрд┐рдд рд╣реИред рд╣рдо рдХреЗрд╡рд▓
url
рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЫрд╡рд┐ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдордиреЗ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдХрд┐ рдпрд╣ рдЖрд╡реЗрджрди рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛ред
рдореЗрдореЗ рдЬрдирд░реЗрдЯрд░рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд╛рда рджрд░реНрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдлрд╝реАрд▓реНрдб рд╣реИрдВ, рдЬреЛ рдЫрд╡рд┐ рдХреЗ рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдВрдЧреЗред рдЕрдм рдЖрдкрдХреЛ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП
MemeGenerator
рдШрдЯрдХ рдХреЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдШрдЯрдХ рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реЗ рдЕрд▓рдЧ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлрд╝реЙрд░реНрдо рд░рд┐рдХреНрдд рдпрд╣рд╛рдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ, рдкрд╛рда рдлрд╝реАрд▓реНрдб,
topText
рдФрд░
bottomText
рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдпреЗ рдкреНрд░рдмрдВрдзрд┐рдд рдШрдЯрдХ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЙрдирдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВред рдЗрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЗ
onChange
рдПрдХ
onChange
рдИрд╡реЗрдВрдЯ
onChange
рдмрдирд╛рдПрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдЯреЗрдЯ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЙрдирдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВред
import React, {Component} from "react" class MemeGenerator extends Component { constructor() { super() this.state = { topText: "", bottomText: "", randomImg: "http://i.imgflip.com/1bij.jpg", allMemeImgs: [] } } componentDidMount() { fetch("https://api.imgflip.com/get_memes") .then(response => response.json()) .then(response => { const {memes} = response.data this.setState({ allMemeImgs: memes }) }) } render() { return ( <div> <form className="meme-form"> { // } <button>Gen</button> </form> </div> ) } } export default MemeGenerator
рд╡реИрд╕реЗ, рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
render()
рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдХреЛрдб рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдерд╛ рдХрд┐ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЖрд╡реЗрджрди рдкрд░ рдХрд╛рдо рдХреЗ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП:
import React, {Component} from "react" class MemeGenerator extends Component { constructor() { super() this.state = { topText: "", bottomText: "", randomImg: "http://i.imgflip.com/1bij.jpg", allMemeImgs: [] } this.handleChange = this.handleChange.bind(this) } componentDidMount() { fetch("https://api.imgflip.com/get_memes") .then(response => response.json()) .then(response => { const {memes} = response.data this.setState({ allMemeImgs: memes }) }) } handleChange(event) { const {name, value} = event.target this.setState({ [name]: value }) } render() { return ( <div> <form className="meme-form"> <input type="text" name="topText" placeholder="Top Text" value={this.state.topText} onChange={this.handleChange} /> <input type="text" name="bottomText" placeholder="Bottom Text" value={this.state.bottomText} onChange={this.handleChange} /> <button>Gen</button> </form> </div> ) } } export default MemeGenerator
рдЕрдм рдЖрд╡реЗрджрди рдкреГрд╖реНрда рдиреАрдЪреЗ рджрд┐рдЦрд╛рдП рдЧрдП рдЬреИрд╕рд╛ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдЬрдмрдХрд┐ рдХреЗрд╡рд▓ рдорджрдж рдкрд╛рда рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рдбреЗрдЯрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рддрдВрддреНрд░ рдХреЗ рд╕рд╣реА рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк
console.log()
рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдм рд╣рдо рдЙрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЫрд╡рд┐-рдореЗрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░рдгреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╣реИ рдЬреЛ рдХрд┐ рдореЗрдореНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ
Gen
рдмрдЯрди рджрдмрд╛рдХрд░, рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рд░рдгреА рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдЪреБрдиреЗрдВ рдФрд░ рдПрдХ рдореЗрдо рдмрдирд╛рдПрдВред
рдпрд╣рд╛рдБ
MemeGenerator
рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣рд╛рдВ, рдлреЙрд░реНрдо рд╡рд┐рд╡рд░рдг рдХреЛрдб рдХреЗ рдиреАрдЪреЗ
render()
рд╡рд┐рдзрд┐ рдореЗрдВ, рдПрдХ
<div>
рддрддреНрд╡ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ
<img>
рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ рдПрдХ рдЫрд╡рд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░
<h2>
рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдЬреЛрдбрд╝рд╛ рдЬреЛ рд▓реЗрдмрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
<div>
рдФрд░
<h2>
рддрддреНрд╡ рдЙрди рд╢реИрд▓рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдерд╛ред
import React, {Component} from "react" class MemeGenerator extends Component { constructor() { super() this.state = { topText: "", bottomText: "", randomImg: "http://i.imgflip.com/1bij.jpg", allMemeImgs: [] } this.handleChange = this.handleChange.bind(this) } componentDidMount() { fetch("https://api.imgflip.com/get_memes") .then(response => response.json()) .then(response => { const {memes} = response.data this.setState({ allMemeImgs: memes }) }) } handleChange(event) { const {name, value} = event.target this.setState({ [name]: value }) } render() { return ( <div> <form className="meme-form"> <input type="text" name="topText" placeholder="Top Text" value={this.state.topText} onChange={this.handleChange} /> <input type="text" name="bottomText" placeholder="Bottom Text" value={this.state.bottomText} onChange={this.handleChange} /> <button>Gen</button> </form> <div className="meme"> <img align="center" src={this.state.randomImg} alt="" /> <h2 className="top">{this.state.topText}</h2> <h2 className="bottom">{this.state.bottomText}</h2> </div> </div> ) } } export default MemeGenerator
рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ рдХрд┐ рдРрдк рдЕрдм рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд░рд╛рдЬреНрдп рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдЫрд╡рд┐ рдпрд╣рд╛рдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реИред рд╣рдо рдЕрднреА рддрдХ рдЙрди рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд░рд╛рдЬреНрдп рд╕рдВрдкрддреНрддрд┐
allMemeImgs
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рдкрд╛рда рдлрд╝реАрд▓реНрдб рдореЗрдВ рдХреБрдЫ рджрд░реНрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рд░реНрдп рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдм рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐
Gen
рдмрдЯрди рджрдмрд╛рдХрд░ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЫрд╡рд┐ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░
<img>
рддрддреНрд╡ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЬреЛ рдкрд╛рда рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рдиреАрдЪреЗ рдкреГрд╖реНрда рдкрд░ рдореМрдЬреВрдж рд╣реИред
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓реИрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░реЗрдВред рдЬрдм рдЖрдк
Gen
рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд░рд╛рдЬреНрдп рд╕рдВрдкрддреНрддрд┐
allMemeImgs
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдФрд░ рдлрд┐рд░ рдРрд╕реА рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдкрд╛рда рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдХреЗ рддрд╣рдд рд╕реНрдерд┐рдд
<img>
рддрддреНрд╡ рдореЗрдВ рдЗрд╕ рдЫрд╡рд┐ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред
allMemeImgs
рдХрд┐
allMemeImgs
рдЪрд┐рддреНрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ
url
рдЧреБрдг рд╣реЛрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ рдЬреЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
import React, {Component} from "react" class MemeGenerator extends Component { constructor() { super() this.state = { topText: "", bottomText: "", randomImg: "http://i.imgflip.com/1bij.jpg", allMemeImgs: [] } this.handleChange = this.handleChange.bind(this) this.handleSubmit = this.handleSubmit.bind(this) } componentDidMount() { fetch("https://api.imgflip.com/get_memes") .then(response => response.json()) .then(response => { const {memes} = response.data this.setState({ allMemeImgs: memes }) }) } handleChange(event) { const {name, value} = event.target this.setState({ [name]: value }) } handleSubmit(event) { event.preventDefault() const randNum = Math.floor(Math.random() * this.state.allMemeImgs.length) const randMemeImg = this.state.allMemeImgs[randNum].url this.setState({ randomImg: randMemeImg }) } render() { return ( <div> <form className="meme-form" onSubmit={this.handleSubmit}> <input type="text" name="topText" placeholder="Top Text" value={this.state.topText} onChange={this.handleChange} /> <input type="text" name="bottomText" placeholder="Bottom Text" value={this.state.bottomText} onChange={this.handleChange} /> <button>Gen</button> </form> <div className="meme"> <img align="center" src={this.state.randomImg} alt="" /> <h2 className="top">{this.state.topText}</h2> <h2 className="bottom">{this.state.bottomText}</h2> </div> </div> ) } } export default MemeGenerator
Gen
рдмрдЯрди рдХреЛ рдПрдХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрдм рдЖрдк рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдмрдЯрди рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЗрд╕ рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлреЙрд░реНрдо рдХреЗ
onSubmit
рдЗрд╡реЗрдВрдЯ
onSubmit
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ,
handleSubmit()
, рд╣рдо рдорд╛рдирдХ рдлреЙрд░реНрдо
event.preventDefault()
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рдХреА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕
event.preventDefault()
рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЗрд╡реЗрдВрдЯ рдХреЛ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдкреЗрдЬ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо 0 рд╕реЗ рд░реЗрдВрдЬ рдореЗрдВ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ
allMemeImgs
рд╕рд░рдгреА рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЗ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ рдФрд░ рдЗрд╕реА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрдмрдВрдзрд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд╕рд╛рде рддрддреНрд╡ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рддрддреНрд╡ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реБрдП, рдЬреЛ рд╡рд╕реНрддреБ рд╣реИ, рд╣рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рдВрдкрддреНрддрд┐
url
рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рд░рд╛рдЬреНрдп рд╕рдВрдкрддреНрддрд┐
randomImg
ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреГрд╖реНрда рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рддреА рд╣реИред
рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреЗрдЬрдХреЛрд░реНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреВрд░рд╛ рд╣реБрдЖред
рдкрд░рд┐рдгрд╛рдо
рдЗрд╕ рдкрд╛рда рдореЗрдВ, рдЖрдкрдиреЗ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛, рдЬреЛ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдиреЗ рдЬреЛ рд╕реАрдЦрд╛ рд╣реИ рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд▓реА рдмрд╛рд░ рд╣рдо рдЖрдзреБрдирд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕ рдкрд░ рдЕрдорд▓ рдХрд░рддреЗ рд╣реБрдП рдЖрдк рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рдХреЛрд░реНрд╕ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд┐рдпрд╛ рд╣реИ?