Learn react and make movie-app with nomadcoders ๐
This repo is react basic course. So I will summarize
react basic concept(a.k.a must know concept)
here.
This is written based on NomadCoders React Fundemental Course and React Official Site
npm์ด๋ผ๊ณ ํ๋ฉด
Node Package Manager
๋ผ๊ณ ํ์ฌ ํจํค์ง ๊ด๋ฆฌํ๋ ๋๊ตฌ์ด๋ค. ํ์ง๋ง npx๋ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ์๋๋ค. npm์์ ์ ๊ณตํด์ฃผ๋ ์๋ก์ด ๋๊ตฌ์ด๋ค. npm์ ์ข ๋ ํธํ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ก์ npm์ ํตํด์ ์ค์นํ๋ ํจํค์ง๋ฅผ npx๋ฅผ ํตํด์ ์ฝ๊ฒ ์ค์นํ๊ณ ์คํํ ์ ์๊ฒ ๋์์ค๋ค.
npx์ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
npm์ผ๋ก ํจํค์ง๋ฅผ ์ค์นํ ๋, ์ ์ญ์ ์ผ๋ก ์ค์นํ์ฌ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ์ ๋ก์ปฌ์ ํ๋ก์ ํธ๋ณ๋ก ์ค์นํด์ ๊ด๋ฆฌํ๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค. ์ด ๋ ํจํค์ง์ ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ์ํ๊ณ์ ๋น ๋ฅธ ๋ณํ๋ก ์ธํด ๋ฒ์ ์ญ์ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋ณํํ๊ฒ ๋๋๋ฐ ์ด์ ๋ง์ถฐ์ ๋งค๋ฒ ์ ๋ฐ์ดํธ๋ฅผ ํ๋ ๊ฒ์ ์ฌ๊ฐ ๊ท์ฐฎ์ ๊ฒ์ด ์๋ ์ ์๋ค. ๊ทธ๋์ ๋์จ ๊ฒ์ด npx์ด๋ค.
npx๋ ์ด๋ป๊ฒ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ๋ ๊ฒ์ผ๊น?
์ฐ์ ํด๋น ํจํค์ง๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋์ด์ผ ํ ์์น์ ์๋์ง ํ์ธํ๋ค. ์์น์ ํด๋น ํจํค์ง๊ฐ ์๋ค๋ฉด, npm ๋ ์ง์คํธ๋ฆฌ์ ์ฌ๋ผ๊ฐ์๋ ์ต์ ๋ฒ์ ์ผ๋ก ์ค์นํ๊ณ ์คํํ๋ค. ์ฆ ๋ฐ๋ก ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ ํ์์์ด ์ธ์ ๋ ์ผํ์ฑ์ผ๋ก ์ต์ ๋ฒ์ ์ผ๋ก ์ค์นํ๊ณ ์คํํด์ฃผ๋ ๊ฒ์ด๋ค.
Virtial DOM(๊ฐ์๋)์ ์ดํดํ๊ธฐ ์ํด์ ๋จผ์
SPA(Single Page Application)
์ ๋ํด์ ์์์ผ๋ณด์.
SPA
๋ ์ต์ด๋ก ์ ์ ์ธ ํ์ด์ง๊ฐ ์๋ฒ๋ก๋ถํฐ ๋๋๋ง๋๊ณ ์ด ํ์ ์์ฒญ์์ ์๋ฒ๋ก๋ถํฐ ์๋กญ๊ฒ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํด์ ๋ค์ ๋๋๋งํ๋ ๊ฒ์ด ์๋, ์๋ฒ๋ก๋ถํฐ ์์ฒญ๋ ๋ฐ์ดํฐ๋ง์ JSONํ์์ผ๋ก ๋ฐ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ํตํด์ ํ์ด์ง์์ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง์ ๋์ ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ธฐ์ ์ ๋งํ๋ค.
์ ์ด๋ฏธ์ง๋ ์ ํต์ ์ธ ํ์ด์ง ๋๋๋ง ๋ฐฉ์๊ณผ SPA ๋ฐฉ์์ ๊ทธ๋ฆผ์ผ๋ก ๋น๊ตํ ๊ฒ์ด๋ค.
๋ฆฌ์กํธ๋ SPA๋ฐฉ์์์ ๋ทฐ์ ์ด์ ์ ๋ง์ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ฐ์๋์ ์ฌ๊ธฐ์ ์ด๋ป๊ฒ ์์ฉ์ ํ๋ ๊ฒ์ผ๊น?
์์์๋ ๋งํ๋ฏ์ด SPA๋ ์ต์ด๋ก ํ์ด์ง๊ฐ ๋๋๋ง๋ ํ์ ๋ฐ์ดํฐ ์์ฒญ์ ๋ฐ๋ผ์ ๋ฐ์ดํฐ๋ง์ ๋ฐ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ก DOM์ ์ ๊ทผํ์ฌ ํ์ด์ง๋ฅผ ์กฐ์ํ๋ค. ์ฆ ๋ณต์กํ SPA์์๋ ๋ง์ DOM ์กฐ์์ด ๋ฐ์ํ๊ณ ์ด๋ก ์ธํด ํ์ด์ง ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
DOM ์กฐ์์ ๊ต์ฅํ ๋น์ผ ์์ ์ด๋ค. ์ด๋ ๋๋๋ง ๊ณผ์ ์ ์กฐ๊ธ๋ง ์ดํดํ๋ฉด ์ ์ ์๋ค. ๋๋๋ง ๊ณผ์ ์ ๊ฐ๋จํ ์ค๋ช ํ๋ฉด ์ฐ์ ๋ํธ๋ฆฌ(๋๋ ธ๋๋กค ์ด๋ฃจ์ด์ง ํธ๋ฆฌ)๊ฐ ์์ฑ๋๊ณ ๋ํธ๋ฆฌ์ ๋ฐ๋ผ์ ๋๋ํธ๋ฆฌ(์คํ์ผ ํธ๋ฆฌ)๊ฐ ์์ฑ๋๋ค. ๋๋ํธ๋ฆฌ๊ฐ ์์ฑ๋๋ฉด ํธ๋ฆฌ์ ๋ง๋ ์์น๊ฐ ๊ณ์ฐ๋์ด ๊ฐ๊ฐ์ ๋ ธ๋๋ค์ด ๋ธ๋ผ์ฐ์ ์ ์ด๋ ์์น์ ๋ํ๋์ผํ ์ง๊ฐ ์ ํด์ง๋ค.์ด ํ ํ์ธํ ์์ ์ ํตํด์ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ์ ํํ๋๋ค. ์ด๋ฌํ ๊ณผ์ ์
DOM ์กฐ์
์ด๋ผ๋ ๋ง๋ก ์์ฝ ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ๋ฆฌ์กํธ๋ ์ด๋ฌํ DOM ์กฐ์์ ์ค์ด๊ณ ์, ์ค์ DOM์ ์กฐ์ํ๊ธฐ ์ ์ ๊ฐ์์ ๋์ ์์ฒญ์ ๋ฐ๋ฅธ ๋ณํ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฉํ๊ณ ์ค์ ์ ์ธ ์ต์ข ๋ณํ๋ง์ ์ค์ DOM์ ์ ๋ฌํ๋ค. ์๋ฅผ ๋ค์ด์ ์์ฒญ์ 10๋ฒ ์ผ์ด๋์ ์ต์ข ์ ์ธ ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ฒ ๋๋ค๋ฉด, ๊ฐ๊ฐ์ ์์ฒญ๋ง๋ค DOM ์กฐ์์ ํ๋ ๊ฒ์ด ์๋๋ผ 10๋ฒ์ ์์ฒญ์ ๋ฐ๋ฅธ ๋ณํ๋ฅผ ๊ฐ์๋์ ์ ์ฉํ ํ ์ต์ข ์ ์ธ ๋ณํ์ ํ์ฌ DOM๊ณผ์ ์ฐจ์ด์ ์ ๊ณ์ฐํ์ฌ์ ํ ๋ฒ๋ง DOM ์กฐ์์ ํ๊ฒ ๋๋ค. ์ฆ ๊ฐ์๋์ ๋ธ๋ผ์ฐ์ ๋ด์ ์ฐ์ฐ์ ์ค์์ผ๋ก์ ์ฑ๋ฅ์ ๊ฐ์ ์ํค๋ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ HTML์ด ๋ค์ด๊ฐ ํํ๋ก ๋ณด์ด๋ ์ฝ๋๋ฅผ ๋งํ๋ค. ๋จ์ํ๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ณํ๋ ํํ๋ผ๊ณ ๋ณด๋ฉด ์ฝ๋ค.
JSX์ ์ญํ ์ ์ค์ ์ ์ผ๋ก HTML ํ๊ทธ๋ฅผ ๋ง๋ค๊ณ ์ด๋ฅผ DOM์ ๋ฃ์ด์ค๋ค. ์ฆ ํ์ด์ง์ HTML ํ๊ทธ๋ฅผ ๋๋๋งํ ์ ์๊ฒ ํด์ค๋ค.
๊ถ๊ทน์ ์ผ๋ก JSX๋ HTML์ ๋ง๋ค๊ธฐ ์ํ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ์์ UI๋ฅผ ์์ ํ๋ ๊ฒ์ด ๊ฐ๋ ์ฑ ์ธก๋ฉด์์ ํจ์จ์ ์ด๋ค. ์ฆ ๊ธฐ์กด์ HTML ํ๊ทธ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ด๋ถ์์ ์ฌ์ฉํจ์ผ๋ก์ ์ฝ๋๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง๋ฅผ ์ข ๋ ์๊ฐ์ ์ผ๋ก ๋ช ํํ๊ฒ ์ธ์งํ ์ ์๋ค.
ํ์ง๋ง JSX๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํด์ํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ฒจ์ ์ํด์
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ
๋ก ๋ณํ๋์ด ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด์ง๋ค.
import React from 'react';
const App = function () {
return <div class="text">Hello World</div>;
};
์์ JSX๋ ๋ฐ๋ฒจ์ ์ํด์ ์๋์ ๊ฐ์ด ๋ณํ๋๋ค. ๋ํ
function(){ }
์ด๋ผ๊ณ ์ ํ์๋ ๋ถ๋ถ์์ปดํผ๋ํธ
๋ผ๊ณ ํ๋ค. ์ฌ์ค ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ ํจ์์ ์ ์ฌํ๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๋ค.
'use strict';
const App = function App() {
return React.createElement('div', null, 'Hello World');
};
JSX ์ฝ๋๋ฅผ ๋ณด๋ฉด 'div ํ๊ทธ์ Hello World ๋ผ๋ ๊ธ์๊ฐ ๋ค์ด๊ฐ ๋ธ๋ญ์ด ์๊ธธ๊ฑฐ์ผ' ๋ผ๋ ๊ฒ์ ์ง๊ด์ ์ผ๋ก ์ ์ ์๋ค. ํ์ง๋ง ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ(์๋ ์ฝ๋) ์ฒ๋ผ ์ ํ์์ผ๋ฉด, ๋ญ ๋ง๋ ๋ค๋ ๊ฑฐ๋ ๊ฐ์๋ฐ...ํ๋ฉด์ ์ฝ๋๋ฅผ ์ข ์ดํด๋ด์ผํ ๊ฒ์ด๋ค. ๋ํ ์ค์ฒฉ๋ ํ๊ทธ๋ฅผ ๋ง๋๋ ๊ฒฝ์ฐ๋ React.createElement() ์์ ๋๋ค์ ์ค์ฒฉ๋๊ธฐ ๋๋ฌธ์ ๋์ฑ ์๊ฐ์ ์ผ๋ก ๋ณด๋ ๊ฒ์ด ํ๋ค์ด์ง๋ค. ์ด๊ฒ์ด JSX๋ฅผ ์ฌ์ฉํ๋ ์ด์ ์ด๋ค.
React vs ReactDOM
:
import React from 'react';
import ReactDOM from 'react-dom';
์ผ๋ฐ์ ์ผ๋ก ์ด๋ ๊ฒ ์ํฌํธ๋ฅผ ํ์ฌ ์ฌ์ฉํ๋ค. ์ต์ข ์ ์ธ ์ปดํผ๋ํธ์์๋ ReactDOM์ ์ฌ์ฉํ๋ค. ์ด ๋์ ์ฐจ์ด์ ์ ๋ฌด์์ด๊ธฐ์ ์ด๋ ๊ฒ ์ฌ์ฉํ ๊น?
React๋ ์ฝ์ด ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํ๋ค. ์ด๊ฒ์ ๋ทฐ(UI)๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๊ฒ์ด๋ค. ๋ ๋ฆฝ์ ์ด๊ณ ์ฌ์ฌ์ฉ๊ฐ๋ฅํ ์ปดํผ๋ํธ๋ฅผ ๋ง๋ค๋ ํ์ํ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ค. ์ฆ, ์ปดํผ๋ํธ๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ํ์ํ๋ค. ๋ํ JSX๋ฅผ ๋ณํํ๋๋ฐ ํ์ํ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ JSX๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฐ๋์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํ๋ค.
ReactDOM์ ์ค์ ๋ก DOM์ ๋๋๋ง ํ ๋ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ปดํผ๋ํธ๋ฅผ ํตํด์ ๋ง๋ค์ด์ง ์ต์ข ๊ฒฐ๊ณผ๋ฌผ๋ง์ ํ์ด์ง์ ๋๋๋ง ํ ๋ ์ฌ์ฉํ๋ค.(์ผ๋ฐ์ ์ผ๋ก ์ด๋ฐ ํํ๋ก ์ฌ์ฉํ๋ค)
์ฝ๊ฒ ๋งํด์ ์ปดํผ๋ํธ๋ ํจ์์ด๋ค. (๋ฌผ๋ก ํด๋์ค ์ปดํผ๋ํธ๋ ์์ง๋ง, ํด๋์ค๋ ๊ฒฐ๊ตญ์ ํจ์์ด๋ค.) ํน์ ๋ทฐ(UI)๋ฅผ ๋ฐํํ ์ ์๋ ํจ์์ด๋ค.
์ปดํผ๋ํธ๋ UI์ ์ผ๋ถ๋ถ์ ํํํ๋ ์๊ณ ๋ ๋ฆฝ์ ์ธ ๊ตฌ์ฑํ(์ํฐํฐ/๊ฐ์ฒด)์ด๋ค. ๊ฐ๊ฐ์ ์ปดํผ๋ํธ๋ค์ด ํฉ์ฑ๋์ด์ ์ต์ข ์ ์ผ๋ก ๋ง๋ค๊ณ ์ ํ๋ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ง๋ค์ด์ง ์ ์๋ค.
//์ปดํผ๋ํธ ํด๋์ค(ํจ์)
function App() {
return <div>Hello</div>;
}
//์ปดํผ๋ํธ ์ธ์คํด์ค(๋ณดํต ๋๋ค๋ฅธ JSX ์์ ํฉ์ฑํ์ฌ ์ฌ์ฉํ๋ค)
<App />;
์ค์ ๋ก ์ฐ๋ฆฌ๊ฐ ์ปดํผ๋ํธ๋ฅผ ์ฌ์ฉํ ๋๋ ์ปดํผ๋ํธ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ค. ์ปดํผ๋ํธ ์ธ์คํด์ค??๋ผ๊ณ ํ๋ฉด ์ข ์์ํ ์ ์๋ค. ํ์ง๋ง ๋ณ๊ฑฐ ์๋ค. ๊ทธ๋ฅ ์ปดํผ๋ํธ๋ฅผ JSX ํํ๋ก ๋ถ๋ฌ์ค๋ฉด ๊ทธ๊ฒ์ด ์ธ์คํด์ค๊ฐ ๋๋ค. ๋ด๋ถ์ ์ผ๋ก ์ดํด๋ณด๋ฉด JSX๊ฐ ๋ณํ ๋ ๋,
React.createElement()
๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ด๊ฒ์ ์ค์ ์ ์ธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด๊ฒ์ด ์๋ก์ด ๊ฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ด๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๊ณ ๊ทธ ๋ฐํ๊ฐ์ ๋ํ๋ด๊ฒ ๋๋ ๊ฒ์ด๋ค.
props์ state ๋ชจ๋ ๋ฐ์ดํฐ(์ ๋ณด)๋ฅผ ๋งํ๋ค. ํ์ง๋ง ์ฌ๋ฌ๊ฐ์ง ์ธก๋ฉด์์ ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค. ์ฐจ์ด์ ์ ์ค์ ์ ๋๊ณ ์ดํด๋ณด์
์ ์ด๋ฏธ์ง๋ props์ stats์ ๋ํ ๊ฐ๊ด์ ๋ณด์ฌ์ฃผ๋ ์ด๋ฏธ์ง์ด๋ค. ๊ฐ๋ ์ ์ดํดํ๊ณ ๋ณด๋ฉด ์ํ!๋ผ๋ ๊ฐํ์ฌ๊ฐ ๋์ฌ์ง๋ ๐คฉ
-
ํน์ง
์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ด๋ค
ํด๋์ค ์ปดํผ๋ํธ์์๋ง ์ฌ์ฉํ ์ ์๋ค.(React Hooks์ ๋ฑ์ฅ์ผ๋ก ํจ์ํ ์ปดํผ๋ํธ์์๋ state๋ฅผ ์ฌ์ฉ๊ฐ๋ฅํด์ก๋ค.)
์ปดํผ๋ํธ์์ state๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ์ด๊ธฐํ ๋จ๊ณ๊ฐ ํ์ํ๋ค. ํด๋์ค์ ์์ฑ์(constructor)์์ ์ด๊ธฐํ์์ผ์ ์ฌ์ฉํ๋ค.
-
์๋ ์๋ฆฌ
๊ธฐ๋ณธ์ ์ผ๋ก this.state = {
key : value
} ๊ฐ์ ํํ๋ก ์์ฑ์์์ ์ด๊ธฐํ์ํจ๋ค. ํ์ง๋ง ์์ฑ์๋ฅผ ์ ์ธํ ์์น์์ ์ง์ state์ ์ ๊ทผํ ์ ์๋ค. state์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋ฐ๋์setState()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.์์ฑ์๋ฅผ ์ ์ธํ ์์น์์ this.state.[key]ํํ๋ก ์ฐธ์กฐ๋ ๊ฐ๋ฅํ๋ค.
-
setState()
element.addEventListener('click', handler); //์ด๋ฒคํธ ๋ฆฌ์ค๋ : ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ค.
function handler(e) {
//์ด๋ฒคํธ ํธ๋ค๋ฌ : ์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ ์ด๋ค ์๋์ ํ๋์ง์ ๋ํด ์์ฑํ๋ค. ํธ๋ค๋ฌ๋ ์ฝ๋ฐฑํจ์์ด๋ค.
//code here
}
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์ด๋ฒคํธ ๋ฆฌ์ค๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฌด์์ธ์ง ์ ์ ์๋ค. ๋ฆฌ์กํธ์์๋ DOM์์ ์๋ํ๋ ๊ฒ๊ณผ ๋๊ฐ์ด ์ด๋ฒคํธ๊ฐ ์๋ํ๋ค. ๋จ์ง ๋ช๊ฐ์ง ๋ฌธ๋ฒ์ ์ฐจ์ด๊ฐ ์กด์ฌํ๋ค.
-
๋ฆฌ์กํธ์์๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ฑ๋กํ์ง ์๋๋ค. ๋จ์ง ํ์ด์ง๊ฐ ์ฒ์ ๋๋๋ง ๋ ๋ ๋ฆฌ์ค๋๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ ๊ณตํ๋ค.
์ด๋ฒคํธ ์์์ ์ฌ์ฉํ์ฌ ํ์ด์ง์ wrapper๊ฐ์ฒด์ ๋ด๋ถ์ ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ์ฌ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ค.(์ ํํ์ง์๋ค...๐คช ์งง์ ์ง์์ผ๋ก ์ฐพ์๋ณธ ๊ฒฐ๊ณผ...) ๋ด๋ถ์ ์ผ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง์ ๋ํด์๋ ์ข ๋ ๋ณต์กํ ๋ถ๋ถ์ด ์๋ ๊ฒ ๊ฐ๋ค.
-
๋ฌธ๋ฒ์ ์ฐจ์ด
class App extends React.Component{ handleClick(event){ const { target } = event; //code here } render(){ return <button onClick={this.handleClick}>; } }
์ ์ฝ๋๋ ๋ฆฌ์กํธ์์ ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉํ๋ ์ด๋ฒคํธ ๋ฐฉ์์ด๋ค. props๋ก์ (์ฝ๋ฐฑ) ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ์ ๋ฌํด์ฃผ๋ฉด ๋๋ค. ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค ํธ๋ค๋ฌ๊ฐ ์๋ ํ ๊ฒ ์ด๋ค.
ํ์ง๋ง ์ ์ฝ๋๋ ๋ฌธ์ ๊ฐ ์๋ค. ๋ฐ๋ก
this
์ด๋ค. ์ด ๋ฌธ์ ๋ ๋ฆฌ์กํธ์์์ ๋ฌธ์ ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ์ ๋ฐ์ ๊ฑธ์น ๋ฌธ์ ์ด๋ค. ๊ทธ๊ฒ์ this์ ๋ฌธ๋งฅ์ ๊ฒฐ์ ์ this๊ฐ ํธ์ถ๋ ๋ ์ผ์ด๋๋ค๋ ์ ์ด๋ค. ์ํฉ์ ๋ฐ๋ผ์ this๊ฐ undfined๊ฐ ๋์ค๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์๋ค. ๋ฆฌ์กํธ์์๋ ์ด๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ๋์ง์ ์์๋ณด์ํ์ดํํจ์๋ฅผ ์ฌ์ฉํ ํด๊ฒฐ
: ํ์ดํ ํจ์์์์ this๋ ์์ ์ค์ฝํ๋ฅผ ๋ฐ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์ด๋ค.๋ฐฉ๋ฒ1 : ํธ๋ค๋ฌ ํจ์๋ฅผ props ์์์ ํ์ดํํจ์๋ก ์์ฑ
class App extends React.Component{ render(){ return <button onClick={() => console.log(this)}>; <!-- this is App --> } }
๋ฐฉ๋ฒ2
class App extends React.Component{ handleClick(){ console.log(this) //App } render(){ return <button onClick={() => this.handleClick()}>; }
public class syntax
๋ฅผ ์ฌ์ฉํ ํด๊ฒฐclass App extends React.Component{ handleClick = () => { console.log(this) //App } render(){ return <button onClick={this.handleClick}>; }
handleClick ๋ฉ์๋๊ฐ ํ์ดํ ํจ์๋ก ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ํธ์ถ๋ ๋ this๋ ์์ ์ค์ฝํ์ ๋ฐ์ธ๋ฉ๋๋ค. ํผ๋ธ๋ฆญ ํ๋์ ์ ๋ฐ ํํ๋ก ์์ฑ์ด ๊ฐ๋ฅํด์ก๋ค.
์์ฑ์๋ฅผ ํ์ฉํ ํด๊ฒฐ
: ์ปดํผ๋ํธ์์ ์์ฑ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ์ถ์ฒํ๋ค๊ณ ํ๋ค.(๊ณต์ํํ์ด์ง ์!)class App extends React.Component{ constructor(props){ super(props); this.handleClick = this.handleClick.bind(this); //this binding : ()์์ this == App } handleClick() { console.log(this) } render(){ return <button onClick={this.handleClick}>; }
์ปดํผ๋ํธ๊ฐ ๋ถ๋ฆด ๋, ์ฒ์๋ถํฐ ์์ฑ์๋ฅผ ์ด์ฉํ์ฌ ๋ช ์์ ์ผ๋ก this๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ ์ฌ์ฉํ๋ค.
2023๋ ํ์ฌ
class component
๋ ๋ ์ ๋ ๊ฑฐ์ ์ฝ๋๊ฐ ๋์๋ค. ์์๋ ํจ์ํ์ด ๋์ธ์ด์ ์ ์์ผ๋ก ์๋ฆฌ์ก์๋ค. ์๋ ํด๋์ค!
ps. ํด๋น ์ฑํฐ์ ๋ํ ๋ด์ฉ์ด ์์ด์ ์ฑ์๋ฃ์๋ค.
2023๋ ํ์ฌ ๋ฆฌ์กํธ ํ๋ ์์ํฌ(Next.js, Remix, Gatsby ๋ฑ)์ ๋ฐ์ ์ผ๋ก ์ธํด
pure-react
๋ง์ผ๋ก ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ๊ฐ ์ ์ ์ค์ด๋ค๊ณ ์๋ค. ์ฆ, ๋ผ์ฐํฐ ํจํค์ง๋ฅผ ์ค์นํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์ ์ด์ก๋ค๋ ์๋ฏธ! ๋ํ react-router-dom ์ญ์๋ฒ์ 6
๊น์ง ์ฌ๋ผ๊ฐ๋ฉด์ ๋ด๊ฐ ์ฒ์ ๋ฐฐ์ธ ๋์ ๊ทธ react-router-dom๊ณผ๋ ๋ง์ด ๋ฌ๋ผ์ง ๋ชจ์ต์ด๋ค. ์์ธํ ๋ด์ฉ์ ๊ณต์๋ฌธ์๋ฅผ ์ฝ์ด๋ณด๊ธธ ๊ถ์ฅํ๋ค. (๋ ์ญ์ ๊ณต์๋ฌธ์๋ฅผ ํตํ ํ์ต์react-tutorials repo
์์ ์งํํ์๋ค.)
ps. ํด๋น ์ฑํฐ์ ๋ํ ๋ด์ฉ์ด ์์ด์ ์ฑ์๋ฃ์๋ค.
How to deploy gh-page
-
npm install -D ghpages
-
package-json์ homepage ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ค.
"homepage": "https://jjanmo.github.io/react101"
-
scripts ๋ช ๋ น์ด ์ค์
"scripts": { "start": "react-scripts start", "build": "react-scripts build", "deploy": "gh-pages -d build", "predeploy": "npm run build" },
์ ์คํฌ๋ฆฝํธ ๋ช ๋ น์ด์ ๋ํ ์คํ ๊ณผ์ ์ค๋ช
npm run deploy
์คํํ๋ค.- deploy๋ฅผ ํ ๋ ๋ง๋ค npm์ ์๋์ ์ผ๋ก predeploy ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
- predeploy๊ฐ ์๋๋๋ฉด build ๋ช ๋ น์ด๋ฅผ ํตํด์ ๋ค์ build ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ์์ฑํ์ฌ ์ต์ ์ ์ฝ๋๋ก ํ๋ก๊ทธ๋จ์ ์ ๋ก๋(?)ํ๋ค
- predeploy๊ฐ ๋๋๋ฉด npm์ (ํ๊ณ ์ํ๋) deploy๋ฅผ ์คํํ๋ค.
- gh-pages๋ฅผ ํธ์ถํ๊ณ ๊ฑฐ๊ธฐ์ build์ ์๋ ๋ด์ฉ์ ์ ๋ก๋ ํ๋ค.
- ๋ง์ฝ์ ํ์ด์ง๋ฅผ ์
๋ฐ์ดํธ ํ๋ค๋ฉด ๋ค์ deploy๋ฅผ ํด์ค์ผํ๋ค.(
npm run deploy
๋ฅผ ๋ค์ ์คํํ๋ค.)
-
Chap00 :
npx
-
Chap01 :
Virtual DOM
-
Chap02 :
JSX and Components
-
Chap03 :
Props & State
-
Chap04 :
event in React
-
Chap05 :
Class Component vs Function Component
-
Chap06 :
React Router DOM