๐พ JSX(JavaScript XML)๋?
JSX๋ JavaScript๋ฅผ ํ์ฅํ ๋ฌธ๋ฒ์ผ๋ก React์์ UI๋ฅผ ๊ตฌ์ฑํ ๋ ์ฌ์ฉํ๋ค.
JSX๋ React์์ UI ์ปดํฌ๋ํธ๋ฅผ ์ ์ธ์ ์ผ๋ก ์์ฑํ๊ธฐ ์ํด ๋์ ๋์๋ค. ๊ธฐ์กด์ JavaScript ์ฝ๋ ์์ HTML๊ณผ ์ ์ฌํ ๊ตฌ๋ฌธ์ ์ธ๋ผ์ธ์ผ๋ก ์์ฑํ์ฌ UI ์์๋ฅผ ํํํ ์ ์๊ฒ ํ๋ค. ์ด๋ UI์ ๊ด๋ จ๋ ๋ก์ง๊ณผ ๋งํฌ์ ์ ํ ๊ณณ์์ ์์ฑํ ์ ์์ด ๊ฐ๋ฐ์์๊ฒ ํธ๋ฆฌํจ์ ์ ๊ณตํ๋ค.
JSX๋ฅผ ์ฌ์ฉํ๋ฉด JavaScript ๋ณ์, ํจ์, ํํ์ ๋ฑ์ ๋งํฌ์ ์์์ ์ค๊ดํธ({})๋ก ๊ฐ์ธ์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋์ ์ธ ๊ฐ์ ํ ํ๋ฆฟ์ ์ฝ๊ฒ ์ฝ์ ํ๊ณ , ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ ๋ฑ์ ํ์ฉํ์ฌ ์ ์ฐํ UI๋ฅผ ์์ฑํ ์ ์๋ค.
JSX๋ JavaScript๊ฐ ํ์ฅ๋ ๋ฌธ๋ฒ์ด์ง๋ง, ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฐ๋ก ์คํํ ์ ์๋ JavaScript ์ฝ๋๊ฐ ์๋๊ธฐ ๋๋ฌธ์ Babel๊ณผ ๊ฐ์ ํธ๋์คํ์ผ๋ฌ๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ ์ ์๋ JavaScript๋ก ์ปดํ์ผํด์ผ ํ๋ค. ์ปดํ์ผ ํ, JavaScript๋ฅผ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฝ๊ณ ํ๋ฉด์ ๋ ๋๋งํ๋ค.
๐พ JSX ๋ฌธ๋ฒ ๊ท์น
โ๏ธ 1. ์ฃผ์
JSX ์์์ ์ฃผ์์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ฑํ๋ ๋ฐฉ๋ฒ๊ณผ๋ ๋ค๋ฅด๋ฉฐ, {/* ์ฃผ์ */}
์ด์ ๊ฐ์ด ํํํ๋ค.
function App() {
return (
// ํ๊ทธ ์ธ๋ถ์์์ ์ฃผ์
<div>
{/* ํ๊ทธ ๋ด๋ถ์์์ ์ฃผ์ */}
Hello, React!
</div>
);
}
โ๏ธ 2. ์ต์์ ํ๊ทธ ๊ท์น: ๋ฐ๋์ ํ๋์ ์ต์์ ํ๊ทธ๊ฐ ์์ด์ผ ํ๋ค.
function App() {
return (
<div> {/* ์ต์์ ํ๊ทธ */}
<div>
<h1>Hello</h1>
</div>
<div>
<h2>React</h2>
</div>
</div>
)
}
→ VirtualDOM ์์ ์ปดํฌ๋ํธ ๋ณํ๋ฅผ ๊ฐ์งํด ๋ผ ๋ ํจ์จ์ ์ผ๋ก ๋น๊ตํ ์ ์๋๋ก ํ๋์ DOM ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค๋ ๊ท์น์ด ์๊ธฐ ๋๋ฌธ
• ๋๋ React v16 ์ด์๋ถํฐ ๋์
๋ <React.Fragment>
๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
Fragment
๋ ๋ธ๋ผ์ฐ์ ์์์ ๋ฐ๋ก ๋ณ๋์ ์๋ฆฌ๋จผํธ๋ก ๋ํ๋์ง ์๋๋ค.
import { Fragment } from 'react';
function App() {
return (
<Fragment>
<div>
<h1>Hello</h1>
</div>
<div>
<h2>React</h2>
</div>
</Fragment>
)
}
• ํ๊ทธ๋ฅผ ์์ฑ ํ ๋ ์ด๋ฆ ์์ด ์์ฑ์ ํ๊ฒ ๋๋ฉด Fragment
๊ฐ ๋ง๋ค์ด์ง๋ค.
function App() {
return (
<>
<div>
<h1>Hello</h1>
</div>
<div>
<h2>React</h2>
</div>
</>
)
}
โ๏ธ 3. JSX์์๋ ๋ชจ๋ ํ๊ทธ๋ฅผ ๋ซ์์ค์ผ ํ๋ค.
<div></div>
<input /> // self-closing ํ๊ทธ
โ๏ธ 4. CSS class ์์ฑ์ className์ผ๋ก ํ๊ธฐํ๋ค.
<div className="myClass"></div>
โ๏ธ 5. JavaScript ํํ์ ์ฌ์ฉ์ {์ค๊ดํธ}๋ฅผ ์ฌ์ฉํ๋ค.
์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ผ๋ฐ ํ ์คํธ๋ก ์ธ์ํ๋ค.
function App() {
const name = "react"
return (
<div>
Hi, {name}
</div>
)
}
โ๏ธ 6. ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ ๋๋ฌธ์๋ก ์์ํ๋ค. (PascalCase)
์๋ฌธ์๋ก ์์ํ๊ฒ ๋๋ฉด ์ผ๋ฐ์ ์ธ HTML ์๋ฆฌ๋จผํธ๋ก ์ธ์ํ๋ค.
function MyComponent() {
return <div>Hello, {name}</div>
}
function Hello() {
return <MyComponent />
}
โ๏ธ 7. ์กฐ๊ฑด๋ถ ๋ ๋๋ง
• ์กฐ๊ฑด๋ถ ๋ ๋๋ง์๋ if๋ฌธ์ด ์๋ ์ผํญ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
JSX ๋ด๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ์์๋ if๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. (JSX ์ธ๋ถ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ)
function App() {
const name = "react";
return (
<div>
{name === "react" ? <p>react</p> : <p>javascript</p> }
</div>
)
}
• ๋๋ AND ์ฐ์ฐ์(&&)๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
function App() {
const name = "react";
return (
<div>
{name === "react" && <p>react</p> }
</div>
)
}
→ JSX์์ boolean, null, undefined๋ฅผ ๋ ๋๋งํ๊ฒ ๋๋ค๋ฉด ์๋ฌด๊ฒ๋ ๋ํ๋์ง ์๋๋ค. (์ ํจํ์ง๋ง ๋ ๋๋ง๋ง ๋์ง ์๋๋ค.)
ํ์ง๋ง 0๊ณผ ๊ฐ์ falsyํ ๊ฐ๋ค์ React๊ฐ ๋ ๋๋ง ํ๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผ ํ๋ค.
(๊ด๋ จ ์๋ฃ๋ react ๊ณต์๋ฌธ์ ํ์ธ)
โ๏ธ 8. ์ฌ๋ฌ ๊ฐ์ HTML ์๋ฆฌ๋จผํธ๋ฅผ ํ์ํ ๋๋ map() ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
• map ํจ์๋ฅผ ์ฌ์ฉํ ๋๋ key๋ผ๋ props๋ฅผ ์ค์ ํด์ผ ํ๋ค.
• key ์์ฑ๊ฐ์ ๋ณํ์ง ์๊ณ , ์์๊ฐ๋ฅํ๋ฉฐ, ์ ์ผํด์ผ ํ๋ค. (ex. id)
const posts = [
{ id : 1, title : 'Hello World', content : 'Welcome to learning React!' },
{ id : 2, title : 'Installation', content : 'You can install React via npm.' },
{ id : 3, title : 'reusable component', content : 'render easy with reusable component.' },
// ...
{ id : 100, title : 'I just got hired!', content : 'OMG!' },
];
function Blog() {
const postToElement = (post) => (
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
);
const blogs = posts.map(postToElement);
return <div className="post-wrapper">{blogs}</div>;
}
โ๏ธ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์๋ชป๋ ์ ๋ณด๋ ๋ ๊ณต์ ํ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
'Frontend Dev > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React์ Props Drilling๊ณผ ์ํ๊ด๋ฆฌ (0) | 2023.06.25 |
---|---|
React Hooks - useEffect (0) | 2023.05.31 |
React์ ๋ฐ์ดํฐ ํ๋ฆ - React๋ก UI๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ๋จ๊ณ (0) | 2023.05.30 |
React ๊ธฐ๋ณธ, props ์ฌ์ฉํ๊ธฐ (0) | 2023.05.23 |
React state์ ๊ฐ๋จํ๊ฒ ์์๋ณด๋ useState (0) | 2023.05.23 |