[React] 02. JSX
- -
๐ JSX
๋ฆฌ์กํธ๋ HTML๊ณผ ๋น์ทํ ํ์์ ์ฝ๋ ์์ฑ ๋ฐฉ์์ธ JSX๋ฅผ ํตํด ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ค๋์ JSX์ ๊ธฐ๋ฅ๊ณผ ๊ท์น๋ค์ ๋ฐฐ์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ํ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์์ฑ์ ๋๋ ESLint์ Prettier๋ ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ I. ์ฝ๋ ์ดํดํ๊ธฐ
src/App.js ํ์ผ์ ์ด์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์์ ๊ฒ์ ๋๋ค.
import logo from './logo.svg';
import './App.css';
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App;
์์ ์ฝ๋๋ฅผ ํ๋์ฉ ์ดํดํด๋ด ์๋ค.
๐ 1. import ๊ตฌ๋ฌธ
import logo from './logo.svg';
import './App.css';
- import ๊ตฌ๋ฌธ์ ํน์ ํ์ผ์ ๋ถ๋ฌ์ค๋ ๊ฒ์ ์๋ฏธ
- ๋ชจ๋์ ๋ถ๋ฌ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ค ๋ธ๋ผ์ฐ์ ์ ์๋, Node.js์์ ์ง์ํ๋ ๊ธฐ๋ฅ
๐ 2. ๋ฒ๋ค๋ฌ(Bundler)
- ๋ธ๋ผ์ฐ์ ์์๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ฒ๋ค๋ฌ(bundler)๋ฅผ ์ฌ์ฉ
- ๋ฒ๋ค(bundle)์ ํ์ผ์ ๋ฌถ์ด์ ์ฐ๊ฒฐํ๋ค๋ ๊ฒ
- ์นํฉ, Parcel, browserify ๋ฑ์ ๋๊ตฌ๋ค์ด ์์ง๋ง, ๋ฆฌ์กํธ ํ๋ก์ ํธ์์๋ ์ฃผ๋ก ์นํฉ์ ๋ค๋ฃธ
- ๋ฒ๋ค๋ฌ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด import๋ก ๋ชจ๋์ ๋ถ๋ฌ์์ ๋ ๋ชจ๋์ ๋ชจ๋ ํฉ์ณ ํ๋์ ํ์ผ๋ก ๋ง๋ค์ด ์ค
- ์ต์ ํ ๊ณผ์ ์์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ๋ก ๋ถ๋ฆฌํ ์๋ ์์
๐ 3. ๋ก๋(Loader)
- ์นํฉ์ ์ด์ฉํ๋ฉด SVG ํ์ผ๊ณผ CSS ํ์ผ๋ ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์์
- ํ์ผ๋ค์ ๋ถ๋ฌ์ค๋ ๊ฒ์ด ๋ก๋(loader)
- CSS ํ์ผ์ ๋ถ๋ฌ์ค๋ css-loader, ์น ํฐํธ๋ ๋ฏธ๋์ด ํ์ผ์ ๋ถ๋ฌ์ค๋ file-loader ๋ฑ์ด ์์
- ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๋ create-react-app์ด ์นํฉ์ ๋ก๋๋ฅผ ์๋์ผ๋ก ์ค์น
๐ 4. ํจ์ ์ปดํฌ๋ํธ
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
- ์ด ์ฝ๋๋ function ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ App์ด๋ผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ฆ
- ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ํจ์ ์ปดํฌ๋ํธ๋ผ๊ณ ํจ
- ํ๋ก์ ํธ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ฉด ํจ์์์ ๋ฐํํ๊ณ ์๋ ๋ด์ฉ์ ๋ณด์
๐ II. JSX๋?
์์ ์์ฑ๋ ์ฝ๋๋ HTML ๋ฌธ๋ฒ๊ณผ ๋น์ทํด ๋ณด์ ๋๋ค. ์ด๋ฌํ ์ฝ๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฅ ๋ฌธ๋ฒ์ธ JSX์ ๋๋ค. ์ฝ๋๊ฐ ๋ฒ๋ค๋ง๋๋ ๊ณผ์ ์์ ๋ฐ๋ฒจ์ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์ ์ฝ๋๋ก ๋ณํ๋ฉ๋๋ค.
function App() {
return (
<div>
Hello <b>react</b>
</div>
);
}
function App() {
return React.createElement("div", null, "Hello", React.createElement("b", null, "react"));
}
JSX ์ฝ๋๋ ์๋์ ์ฝ๋๋ก ๋ณํ๋ฉ๋๋ค. React.createElement๋ฅผ ์ปดํฌ๋ํธ ๋ ๋๋ง ๋๋ง๋ค ์ ๋ ฅํ๋ ์ผ์ ๋นํจ์จ์ ์ด๋ผ JSX๋ฅผ ์ฌ์ฉํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
๐ III. JSX์ ์ฅ์
๐ 1. ๋ณด๊ธฐ ์ฝ๊ณ ์ต์ํ๋ค
HTML ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋น์ทํ์ฌ ์ผ์ผ์ด ์์๋ค์ ๋ง๋ค ์ง ์์๋ ๋ฉ๋๋ค.
๐ 2. ๋์ฑ ๋์ ํ์ฉ๋
div๋ span๊ณผ ๊ฐ์ HTML ํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ก ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ JSX ์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ IV. JSX ๋ฌธ๋ฒ
๐ 1. ๊ฐ์ธ์ธ ์์
์ปดํฌ๋ํธ์ ์ฌ๋ฌ ์์๊ฐ ์๋ค๋ฉด ๋ฐ๋์ ๋ถ๋ชจ ์์ ํ๋๋ก ๊ฐ์ธ์ผํฉ๋๋ค. Virtual DOM์์ ์ปดํฌ๋ํธ ๋ณํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ฐ์งํ๊ธฐ ์ํด ์ปดํฌ๋ํธ ๋ด๋ถ๋ ํ๋์ DOM ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค.
function App() {
return (
<div>
<h1>๋ฆฌ์กํธ ์๋
!</h1>
<h2>์ ์๋๋๋?</h2>
</div>
);
}
<div> ํ๊ทธ ์ธ์๋, ๋ฆฌ์กํธ v16 ์ด์๋ถํฐ ๋์ ๋ Fragment <Fragment> ํ๊ทธ๋, Fragment์ ๋ค๋ฅธ ํํ์ธ <></>์ผ๋ก ๊ฐ์ ์ ์์ต๋๋ค.
๐ 2. ์๋ฐ์คํฌ๋ฆฝํธ ํํ
JSX๋ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. JSX ๋ด๋ถ์์ ์ฝ๋๋ฅผ { }๋ก ๊ฐ์ธ๋ฉด ๋ฉ๋๋ค.
function App() {
const name = "๋ฆฌ์กํธ";
return (
<div>
<h1>๋ฆฌ์กํธ ์๋
!</h1>
<h2>์ ์๋๋๋?</h2>
</div>
);
}
์๋ฐ์คํฌ๋ฆฝํธ ES6์ ๋ณ์ ์ค์ ๊ณผ ๊ด๋ จ๋ ๋ด์ฉ์ ๋ค์์ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ธ์
https://jiyesmoon.tistory.com/2?category=967739
๐ 3. if๋ฌธ ๋์ ์กฐ๊ฑด๋ถ ์ฐ์ฐ์
JSX ๋ด๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์์ if ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. JSX ๋ฐ์์ if ๋ฌธ์ ์ฌ์ฉํ์ฌ ์ฌ์ ์ ๊ฐ์ ์ค์ ํ๊ฑฐ๋ { } ์์ ์กฐ๊ฑด๋ถ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ผํญ ์ฐ์ฐ์๋ฅผ ํตํด ํํํ ์ ์์ต๋๋ค.
function App() {
const name = "๋ฆฌ์กํธ";
return (
<div>
{
name === "๋ฆฌ์กํธ" ? (
<h1>๋ฆฌ์กํธ ์๋ ์ค</h1>
) : (
<h2>๋ฆฌ์กํธ๊ฐ ์๋</h2>
)
}
</div>
);
}
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด "๋ฆฌ์กํธ ์๋ ์ค"์ด๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์์ฑ๋ฉ๋๋ค. const name์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด "๋ฆฌ์กํธ๊ฐ ์๋"์ด๋ผ๋ ๋ฌธ๊ตฌ๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
๐ 4. AND ์ฐ์ฐ์(&&)๋ฅผ ์ฌ์ฉํ ์กฐ๊ฑด๋ถ ๋ ๋๋ง
ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋๋ง ๋ด์ฉ์ ๋ณด์ฌ์ฃผ๊ณ , ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด ์๋ฌด๊ฒ๋ ๋ ๋๋ง ํ์ง ์์์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ์ํฉ์ ์กฐ๊ฑด๋ถ ์ฐ์ฐ์๋ฅผ ํตํด ๊ตฌํํ ์ ์์ต๋๋ค.
function App() {
const name = "๋ฆฌ์กํธ";
return (
<div>
{name == "๋ฆฌ์กํธ" && <h1>๋ฆฌ์กํธ์
๋๋ค.</h1>}
</div>
);
}
์์ ์ฝ๋๋ && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ํ ์ ์์ต๋๋ค. ๋ฆฌ์กํธ์์ false๋ฅผ ๋ ๋๋งํ ๋๋ null๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ฌด๊ฒ๋ ๋ํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ ์ฝ๋๋ก ์์ฑํ ์ ์์ต๋๋ค. ๋จ falsyํ ๊ฐ์ธ 0์ ์์ธ์ ์ผ๋ก ํ๋ฉด์ ์ถ๋ ฅ๋ฉ๋๋ค.
๐ 5. undefined ๋ ๋ ๋๋งํ์ง ์๊ธฐ
๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์๋ ํจ์์์๋ null๊ณผ ๋ฌ๋ฆฌ undefined๋ง ๋ฐํํ์ฌ ๋ ๋๋งํ๋ ์ํฉ์ ๋ง๋ค๋ฉด ์ ๋ฉ๋๋ค. OR(||)์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด undefined์ผ ๋์ ๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
import './App.css';
function App() {
const name = undefined;
return name || "๊ฐ์ด undefined์
๋๋ค."
}
export default App;
๋จ JSX ๋ด๋ถ์์ undefined๋ฅผ ๋ ๋๋งํ๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค.
๐ 6. ์ธ๋ผ์ธ ์คํ์ผ๋ง
๋ฆฌ์กํธ์์ DOM ์์์ ์คํ์ผ์ ์ ์ฉํ ๋๋ ๋ฌธ์์ด ํํ๊ฐ ์๋ ๊ฐ์ฒด ํํ๋ก ๋ฃ์ด์ผ ํฉ๋๋ค. ์คํ์ผ ์ด๋ฆ ์ค์์ background-color ์ฒ๋ผ -๊ฐ ์๋ ๊ฒฝ์ฐ -๋ฅผ ์์ ๊ณ ์นด๋ฉ ํ๊ธฐ๋ฒ(camelCase)์ผ๋ก ์์ฑํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ backgroundColor, fontSize, fontWeight ๋ฑ๊ณผ ๊ฐ์ด ์ ํ์ผ ํฉ๋๋ค.
function App() {
const name = "๋ฆฌ์กํธ";
const style = {
backgroundColor: 'black',
color: 'aqua',
fontSize: '48px',
fontWeight: 'bold',
padding: 16
};
return <div style={style}>{name}</div>
}
๐ 7. class ๋์ className
HTML์์ CSS ํด๋์ค๋ฅผ ์ฌ์ฉํ ๋๋ <div class="myClass"></div>์ ๊ฐ์ด class๋ผ๋ ์์ฑ์ ์ค์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ JSX์์๋ class๊ฐ ์๋ className์ผ๋ก ์ค์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค. ์ด์ ์๋ class๋ก CSS ํด๋์ค๋ฅผ ์ค์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์์ง๋ง, ๋ฆฌ์กํธ v16์ด์๋ถํฐ๋ class๋ฅผ className์ผ๋ก ๋ณํํด์ฃผ๊ณ ๊ฒฝ๊ณ ๋ฅผ ๋์๋๋ค.
๐ 8. ๊ผญ ๋ซ์์ผ ํ๋ ํ๊ทธ
HTML์์๋ <input>๊ณผ ๊ฐ์ด ํ๊ทธ๋ฅผ ๋ซ์ง ์์ ์ฑ๋ก ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ JSX์์ ํ๊ทธ๋ฅผ ๋ซ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
function App() {
const name = "๋ฆฌ์กํธ";
return (
<>
<div className="react">{name}</div>
<input></input>
</>
)
}
ํ๊ทธ ์ฌ์ด์ ๋ณ๋์ ๋ด์ฉ์ด ๋ค์ด๊ฐ์ง ์๋ ๊ฒฝ์ฐ <input />๋ก ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํ๊ทธ๋ฅผ self-closing ํ๊ทธ๋ผ๊ณ ํฉ๋๋ค/ ํ๊ทธ ์ ์ธ๊ณผ ๋์์ ๋ซ์ ์ ์๋ ํ๊ทธ์ ๋๋ค.
function App() {
const name = "๋ฆฌ์กํธ";
return (
<>
<div className="react">{name}</div>
<input />
</>
)
}
๐ 9. ์ฃผ์
JSX ๋ด๋ถ์์ ์ฃผ์์ ์์ฑํ ๋์๋ {/* */}์ ๊ฐ์ ํ์์ผ๋ก ์ฌ๋ฌ ์ค์ ์ฃผ์์ ์์ฑํฉ๋๋ค. ์์ ํ๊ทธ๋ฅผ ์ฌ๋ฌ ์ค๋ก ์์ฑํ ๋๋ ๊ทธ ๋ด๋ถ์์ //์ ๊ฐ์ ํํ์ ์ฃผ์๋ ์์ฑํ ์ ์์ต๋๋ค.
๐ V. ESLint์ Prettier ์ ์ฉํ๊ธฐ
ESLint๋ ๋ฌธ๋ฒ ๊ฒ์ฌ ๋๊ตฌ์ด๊ณ , Prettier๋ ์ฝ๋ ์คํ์ผ ์๋ ์ ๋ฆฌ ๋๊ตฌ์ ๋๋ค. ๋ ๋๊ตฌ ๋ชจ๋ VS Code ๋ง์ผ ํ๋ ์ด์ค์์ ์ค์นํ ์ ์์ต๋๋ค.
๐ 1. ESLint
ESLint๋ ์ฝ๋ ์์ฑ ์ ๋ฐ์๋ ์ค์์ ๋ํ ์๋ฌ ๋ฐ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ์๋ํฐ์์ ๋ฐ๋ก ํ์ธํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ก์ ์ค์ด ๊ทธ์ด์ง ์ฝ๋๋ ๋ฌด์ํด๋ ๋์ง๋ง, ๋นจ๊ฐ์ ์ค์ด ๊ทธ์ด์ง ์ฝ๋๋ ๋ฐ๋์ ๊ณ ์ณ์ผ ํฉ๋๋ค. ์๋ํฐ ํ๋จ์ ๋จ๋ ๋ฌธ์ ํญ์ VS Code ์๋จ ๋ฉ๋ด์์ ๋ณด๊ธฐ > ๋ฌธ์ ๋ฅผ ํด๋ฆญํ์ฌ ์ด ์ ์์ต๋๋ค.
๐ 2. Prettier
JSX๋ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ์ํด ๋ค์ฌ ์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. VS code์์ F1์ ๋๋ฅด๊ณ format์ด๋ผ๊ณ ์ ๋ ฅํ ๋ค์ enter๋ฅผ ์ ๋ ฅํฉ๋๋ค. Prettier๊ฐ ์๋์ผ๋ก ์ฝ๋๋ฅผ ์ ๋ฆฌํด์ค ๊ฒ์ ๋๋ค. Prettier๋ ์ฝ๋๋ฅผ ์ ๋ ฌํด์ค ๋ฟ ์๋๋ผ ์ธ๋ฏธ์ฝ๋ก ์ด ๋น ์ง ๊ณณ์๋ ์ถ๊ฐ๋๊ณ ์์๋ฐ์ดํ๋ฅผ ํฐ ๋ฐ์ดํ๋ก ๋ฐ๊ฟ์ค๋๋ค.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] 04. ์ด๋ฒคํธ ํธ๋ค๋ง (0) | 2022.10.10 |
---|---|
[React] # ํด๋์คํ ์ปดํฌ๋ํธ VS ํจ์ํ ์ปดํฌ๋ํธ (0) | 2022.10.09 |
[React] 03. ์ปดํฌ๋ํธ (1) | 2022.10.04 |
[React] # ๋ฆฌ์กํธ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ (0) | 2022.09.25 |
[React] 01. ๋ฆฌ์กํธ ์์ (1) | 2022.09.24 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค