Getting Started With React
๐ Taniarascia์ getting-started-with-react
์ด ๊ธ์ Taniarascia์ getting-started-with-react๋ฅผ ํ๊ตญ์ด๋ก ์์ฝํ ์ ๋ฆฌ ๊ธ์ ๋๋ค. ๊ณต๋ถ ๋ชฉ์ ์ผ๋ก ์์ฝํ ์ฃผ๊ด์ ์ธ ๋ด์ฉ์ ๋๋ค. ๐
๋ฆฌ์กํธ๋?
- ๋ฆฌ์กํธ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.(ํ๋ ์์ํฌ๊ฐ ์๋๋ค.)
- ๋ฆฌ์กํธ๋ ํ์ด์ค๋ถ(ํ ๋ฉํ)์์ ๊ฐ๋ฐ๋ ์คํ์์ค ํ๋ก์ ํธ์ด๋ค.
- ๋ฆฌ์ํธ๋ ํ๋ก ํธ์๋์์ User Interface(UI)๋ฅผ ์ ์ํ๊ธฐ์ํด ์ฌ์ฉ๋๋ค.
- ๋ฆฌ์กํธ๋ MVC(Model View Controller) ์ดํ๋ฆฌ์ผ์ด์ ์์ View๋ฅผ ๋ด๋นํ๋ค.
๋ฆฌ์กํธ์ ๊ฐ์ฅ ์ค์ํ ์ธก๋ฉด์ ๋น์ ์ด ๋น์ ๋ง์, ์ฌ์ฌ์ฉ๊ฐ๋ฅํ HTML ์์์ธ
์ปดํฌ๋ํธ
๋ฅผ ๋น ๋ฅด๊ณ ํจ๊ณผ์ ์ผ๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ํ ๋ฆฌ์กํธ๋state
์props
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณผ ์กฐ์์ ์ ์ฐํ๊ฒ ํ ์ ์๋ค.
๋ฆฌ์กํธ ์ฑ ๋ง๋๋ ๋ฐฉ๋ฒ
npm๊ณผ yarn ๋ชจ๋ ๋ฆฌ์กํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์์ ์ง์ํ๋ค.
npx create-react-app [์ดํ๋ฆฌ์ผ์ด์
์ด๋ฆ]
yarn create react-app [์ดํ๋ฆฌ์ผ์ด์
์ด๋ฆ]
๊ธฐ๋ณธ์ ์ผ๋ก index.html ๋ด๋ถ์ id๊ฐ root์ธ div ํ๊ทธ๊ฐ ๋ฆฌ์กํธ์ ์์์ ์ด ๋๋ค. ๋ํ, index.js๋ฅผ ๋ณด๋ฉด
class App extends React.Component {
render() {
return (
<div className="App">
<h1>Hello, React!</h1>
</div>
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
// ์๋ ํด๋์ค ์ปดํฌ๋ํธ ๊ธฐ์ค์ด๋ค. ์ต๊ทผ์๋ ํจ์ ์ปดํฌ๋ํธ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ฉฐ ์ด๋ ์ง์ ์ฐพ์๋ณด๊ธธ!
์ฆ, App ์ปดํฌ๋ํธ๋ root ์์์ ๋ ๋๋ง ๋๋ฉฐ, ์ฐ๋ฆฌ๋ ์ด App ์ปดํฌ๋ํธ์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
๋ฆฌ์กํธ DevTools
๋ฆฌ์กํธ์ ๊ด๋ จ๋ ๊ฐ๋ฐ๋๊ตฌ๋ฅผ ํ์ฅ์์ผ์ฃผ๋ ํฌ๋กฌ extension์ด๋ค. ์ปดํฌ๋ํธ์ ๋ํ ๋ด์ฉ๊ณผ props, state์ ํ๋ฆ์ ๋ณด๊ธฐ ์ฝ๊ฒ ๋์์ค๋ค.
JSX : JavaScript + XML
๋ฆฌ์กํธ ์ฝ๋์์ HTML๊ณผ ์ ์ฌํ ์ฝ๋๋ฅผ ๋ณด์์ ๊ฒ์ด๋ค. ์ด ๋ถ๋ถ์ HTML๊ณผ ์ ์ฌํ๊ธด ํ์ง๋ง, ์๋ฐํ ๋งํ๋ฉด JSX๋ก JavaScript์ ํ์ฅ ๋ฌธ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์๋์ ๊ฐ์ด JavaScript์์ HTML์ ๋ค๋ฃฐ ์ ์๊ฒ ๋๋ค.
const heading = <h1 className="site-heading">Hello, React</h1>;
๋ํ, JSX๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ์๋์ ๊ฐ์ด ์จ๋ ๋๋ค.
const heading = React.createElement('h1', { className: 'site-heading' }, 'Hello, React!');
(๊ทธ๋ฌ๋ ์์ ์ฝ๋๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ ธ ์ง๊ด์ ์ด์ง ์๋ค. ์ฌ์ค์ JSX๋ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ฉด์ ํ์์ ์ธ ๋ ์์ด๋ค.)
JSX์ ํน์ง ๋ฐ ์ฃผ์์ฌํญ
JSX๋ ๋ณด์ด๊ธฐ์ HTML์ด์ง๋ง ์ค์ JavaScript ์ฝ๋์ด๋ค.
- CSS ์คํ์ผ์ ์ํ
class
๋className
์ผ๋ก ํ๊ธฐํ๋ค. ์๋ํ๋ฉด JavaScript์๋ ์ด๋ฏธclass
๋ผ๋ ์์ฝ์ด๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค. - ์์ฑ๊ณผ ๋ฉ์๋๋ CamelCase๋ก ์์ฑํ๋ค. ex) onclick => onClick
- Self-closing tags๋ ๋ฐ๋์ ์ฌ๋์ฌ๊ฐ ๋ค์ ์จ๋ค. ex)
<img />
- JSX ๋ด์์ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์ {}๋ก ํ ์ ์๋ค.(๋ง์น ๋ฌธ์ ๋ฆฌํฐ๋ด๋ด์์ ${} ์ฌ์ฉํ๋ฏ์ด)
Components(์ปดํฌ๋ํธ)
๋ฆฌ์กํธ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋์ด์๋ค. ์ปดํฌ๋ํธ ์์ ๋ ์์ ์ปดํฌ๋ํธ๋ค์ด ๋ค์ด์๊ณ , ๊ทธ ์ปดํฌ๋ํธ๋ค ๋ด๋ถ๋ ๋๋๋ ์์ ์ปดํฌ๋ํธ๋ค๋ก ๊ตฌ์ฑ๋๋ค.
- class component
import React, { Component } from 'react';
class ClassComponent extends Component {
render() {
return <div>Example</div>;
}
}
export default ClassComponent;
- simple component(ํจ์ ์ปดํฌ๋ํธ)
const SimpleComponent = () => {
return <div>Example</div>;
};
export default SimpleComponent;
Props
๋ฆฌ์กํธ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก porps๋ผ๊ณ ํ๋ ์์ฑ๊ณผ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค.
(๊ธฐ์กด ๊ธ์์๋ class component ์์์ด์ง๋ง, ์ ๋ ํจ์ ์ปดํฌ๋ํธ๋ก ์์ฑํ์์ต๋๋ค.)
function ParentComponent() {
const characters = [
{
name: 'Charlie',
job: 'Janitor',
},
{
name: 'Mac',
job: 'Bouncer',
},
{
name: 'Dee',
job: 'Aspring actress',
},
{
name: 'Dennis',
job: 'Bartender',
},
];
return <ChildComponent characterData={characters} />;
}
function ChildComponent(props) {
return (
<>
{props.characterData.map((v, i) => (
<div key={i}>
<p>{v.name}</p>
<p>{v.job}</p>
</div>
))}
</>
);
}
- ์์ ๊ฐ์ด ๋ฐฐ์ด ํจ์(map)์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ๋ํ ์ฌ๋ฌ JSX ์์๋ฅผ ๋ฐํํ ๋๋ ๋ฐ์ดํฐ๋ง๋ค์ ๊ณ ์ ํ ๊ฐ์ ํตํด key๊ฐ์ ์ง์ ํด์ฃผ์ด์ผํฉ๋๋ค.(๋๋๋ง ์ ๊ฐ ํญ๋ชฉ์ ์๋ณํ๋๋ฐ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ด๋ฉฐ ์ฌ์ค ์์๊ฐ์ด ๋ฐฐ์ด์ ์์์ธ i๋ฅผ ์ฃผ๋ ๊ฒ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์๋๋๋ค.)
- ์ฌ๊ธฐ์ ์๋ฌธ์ด ์๊น๋๋ค. props๋ฅผ ํตํด ์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ํ์ ์ปดํฌ๋ํธ์ ์ ๋ฌํ๋ ๊ฑด ์ข์๋๋ฐ, ๊ทธ๋ ๋ค๋ฉด ํด๋น ์ปดํฌ๋ํธ์์ ๋ค๋ฃจ๋ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ์ ์ดํ ์ ์์๊น์?
State
state๋ฅผ ์ฌ์ฉํ๋ฉด ํค๋น ์ปดํฌ๋ํธ์์ ๋ฐ์ดํฐ๋ฅผ ์์ (์ถ๊ฐ ํน์ ์ญ์ ๋ฑ)์ ํ ์ ์๊ฒ ๋ฉ๋๋ค. ํจ์ ์ปดํฌ๋ํธ๋ useState()๋ผ๋ ํ ์ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ํ๋ฅผ ์ ์ฅํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค.
ํ๊ณ
์๋ฌด๋๋ ์ค๋์ ์ ๋ฆฌ์กํธ์ ํฐ ๊ฐ๋ ์ ์ ๋ฆฌํ ๊ธ์ด๋ผ์ ํจ์ ์ปดํฌ๋ํธ๋ก ์ค๋ช ํ๋ ๋ด์ฉ์ด ์์๋ค. ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ ์ ์ฅ์์๋ ์ ๋ง ๋น์ฐํ๊ณ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด์ง๋ง, ๋ง์ฐํ๊ฒ โ๋ฆฌ์กํธ์์ ์ํ๊ฐ ๋ญ์ง??โ์ ๊ฐ์ ์๋ฌธ์ด ๋๋ ์ฌ๋๋ค์๊ฒ๋ ์ข์ ๊ธ์ธ ๊ฒ ๊ฐ๋ค.