https://ko.legacy.reactjs.org/docs/introducing-jsx.html
JSX ์๊ฐ – React
A JavaScript library for building user interfaces
ko.legacy.reactjs.org
๐ก JSX๋?
JSX๋ JavaScript์ ํ์ฅ ๋ฌธ๋ฒ์ผ๋ก, HTML๊ณผ JavaScript๋ฅผ ๊ฒฐํฉ ํ์ฌ UI๋ฅผ ๋ ์ง๊ด์ ์ผ๋ก ๊ตฌ์ฑํ ์ ์๊ฒ ํฉ๋๋ค. HTML ์ฝ๋์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ JavaScript ๊ฐ์ฒด๋ก ๋ณํ๋์ด ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ๋๋ฉฐ, ์นํฉ(Webpack) ๋ก๋๋ฅผ ํตํด ์ฝ๋๊ฐ ์์ ๋ ๋๋ง๋ค ์๋์ผ๋ก ํ๋ฉด์ด ๊ฐฑ์ (๋ฆฌ๋ ๋๋ง) ๋ฉ๋๋ค. ์ฃผ๋ก ๋ฆฌ์กํธ์์ ์ฌ์ฉ๋์ง๋ง, ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ํ์ฉํ ์ ์์ต๋๋ค.
* React๋ UI๋ฅผ ๋ง๋ค๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ณ , JSX๋ React์์ HTML๊ณผ JavaScript๋ฅผ ๊ฒฐํฉํ ๋ฌธ๋ฒ์ ๋๋ค.
// JSX ์์
const element = <h1>Hello, React!</h1>;
ReactDOM.render(element, document.getElementById('root'));
๐ก JSX ๋ฌธ๋ฒ ๊ฐ์ด๋
โ๏ธ 1. ํ๋์ ์ต์์ ํ๊ทธ ๋ฐํ
JSX์์๋ ๋ฐ๋์ ํ๋์ ์ต์์ ํ๊ทธ๋ง ๋ฐํํด์ผ ํฉ๋๋ค.
return (
<div>
<h1>Hello, World!</h1>
<p>This is a paragraph.</p>
</div>
);
โ๏ธ 2. JSX ์ฃผ์ ์์ฑ
JSX ์ฃผ์์ `{/* ... */}` ํํ๋ก ์์ฑํฉ๋๋ค. VS Code(Visual Studio Code)์์๋ `Alt + Shift + A`๋ฅผ ์ฌ์ฉํ์ฌ JSX ์ฃผ์์ ์์ฑํ ์ ์์ต๋๋ค.
function MyComponent() {
return (
<div>
{/* JSX ๋ด๋ถ์์ ์ฃผ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. */}
<p>์ด ๋ฌธ์ฅ์ ๋ ๋๋ง๋ฉ๋๋ค.</p>
{/*
์ฌ๋ฌ ์ค ์ฃผ์๋ ๊ฐ๋ฅํฉ๋๋ค.
์ฃผ์์ JSX ๋ด์ ๋ค๋ฅธ ๋ชจ๋ ์์์ฒ๋ผ ์๋ํฉ๋๋ค.
*/}
</div>
);
}
export default MyComponent;
โ๏ธ 3. Fragment ์ฌ์ฉ
๋ถํ์ํ ๋ ธ๋๋ฅผ ํผํ๊ธฐ ์ํด `<div>` ๋์ `<React.Fragment>` ๋๋ ๋น ํ๊ทธ `<>`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
import React from 'react';
function MyComponent() {
return (
<div>
{/* React.Fragment ์ฌ์ฉ */}
<React.Fragment>
<h1>Hello, World!</h1>
</React.Fragment>
{/* ๋น ํ๊ทธ ์ฌ์ฉ */}
<>
<h2>Welcome to JSX</h2>
</>
</div>
);
}
export default MyComponent;
โ๏ธ 4. ๋ณ์ ์ฐธ์กฐ
JSX ๋ด๋ถ์์ ๋ณ์๋ฅผ ์ฐธ์กฐํ ๋ ์ค๊ดํธ `{}`๋ฅผ ์ฌ์ฉํฉ๋๋ค.
const name = 'React';
return <h1>{name} ๋ฐฐ์ฐ๊ธฐ</h1>;
โ๏ธ 5. ์กฐ๊ฑด๋ถ ๋ ๋๋ง
JSX์์๋ if ๋ฌธ ๋์ ์ผํญ ์ฐ์ฐ์(condition ? true : false)๋ฅผ ์ฌ์ฉํด ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ๊ตฌํํฉ๋๋ค.
const currentMenu = 'home'; // ํ์ฌ ํ์ฑํ๋ ๋ฉ๋ด (์: 'home', 'about' ๋ฑ)
function NavigationMenu() {
return (
<ul>
<li className={currentMenu === 'home' ? 'active' : ''}>Home</li>
<li className={currentMenu === 'about' ? 'active' : ''}>About</li>
</ul>
);
}
export default NavigationMenu;
โ๏ธ 6. null ์ฌ์ฉ(undefined ๋ฐํ ๊ธ์ง)
๋ ๋๋งํ ๋ด์ฉ์ด ์์ ๋๋ `null`์ ๋ฐํํ์ฌ ๋ ๋๋ง์ ๋ฐฉ์งํด์ผ ํฉ๋๋ค. ๋ํ, `undefined`๋ฅผ ๋ฐํํ๋ฉด ๋ฆฌ์กํธ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก, ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ํญ์ null์ ๋ฐํํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
const value = undefined;
// 'value'๊ฐ ์ ์๋์ง ์์ ๊ฒฝ์ฐ, 'Default value'๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
return <div>{value !== undefined ? value : 'Default value'}</div>;
// ํน์ ๋ ๋๋งํ ๋ด์ฉ์ด ์์ ์์ ๊ฒฝ์ฐ
return null; // ์๋ฌด๊ฒ๋ ๋ ๋๋งํ์ง ์์
โ๏ธ 7. ์คํ์ผ ๊ฐ์ฒด
JSX์์ ์คํ์ผ์ ์ง์ ์ง์ ํ ๋๋ ๊ฐ์ฒด ํํ๋ก ์์ฑํ๋ฉฐ, ์์ฑ์ ์นด๋ฉ ํ๊ธฐ๋ฒ(camelCase)์ ์ฌ์ฉํฉ๋๋ค.
const style = { backgroundColor: 'blue', fontSize: '16px' };
return <div style={style}>Styled Text</div>;
โ๏ธ 8. className ์ฌ์ฉ
JSX์์๋ JavaScript์ ์์ฝ์ด์ธ `class` ๋์ `className`์ ์ฌ์ฉํ์ฌ CSS ํด๋์ค๋ฅผ ์ง์ ํฉ๋๋ค.
return <div className="container">Content</div>;
โ๏ธ 9. ์ ํ ํด๋ก์ง ํ๊ทธ
ํ๋ก ์ฌ์ฉํ๋ ํ๊ทธ๋ ๋ฐ๋์ ๋ซ์์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, `<img>`, `<input>` ํ๊ทธ๋ ์ ํ ํด๋ก์ง ํํ๋ก ์์ฑํด์ผ ํฉ๋๋ค.
<img src="image.png" alt="์ด๋ฏธ์ง ์ค๋ช
" />
<input type="text" />
โ๏ธ 10. JSX์ HTML ์์ฑ ์ฐจ์ด์
JSX์์๋ ๋ช ๊ฐ์ง HTML ์์ฑ์ด JavaScript ์์ฝ์ด์ ์ถฉ๋ํ๊ฑฐ๋ ๋ค๋ฅธ ํ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ๋ค์์ ์์ฃผ ์ฌ์ฉํ๋ ์์ฑ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋ค.
- for๋ htmlFor๋ก ์ฌ์ฉํฉ๋๋ค.
- onclick์ onClick์ผ๋ก ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค.
โ๏ธ 11. ์ด๋ฒคํธ ํธ๋ค๋ง
React์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ JSX ์์ฑ์ผ๋ก ์ ๋ฌ๋๋ฉฐ, ํจ์ ํํ๋ก ์ ๋ฌ๋ฉ๋๋ค. ์ด๋ฒคํธ ์ด๋ฆ์ camelCase๋ฅผ ์ฌ์ฉํฉ๋๋ค.
<button onClick={handleClick}>ํด๋ฆญํ์ธ์</button>
โ๏ธ 12. JSX ์์ JavaScript ํํ์
์ค๊ดํธ `{}`๋ฅผ ์ฌ์ฉํ์ฌ JavaScript ํํ์์ ํฌํจํ ์ ์์ต๋๋ค.
const name = 'React';
return <h1>{name.toUpperCase()} ๋ฐฐ์ฐ๊ธฐ</h1>;
โ๏ธ 13. ํค (Key) ์์ฑ
๋ฐฐ์ด ๋ ๋๋ง ์,๊ฐ ์์์ ๊ณ ์ ํ key ์์ฑ์ ์ ๊ณตํด์ผ ํฉ๋๋ค.
const listItems = items.map(item => <li key={item.id}>{item.name}</li>);
return <ul>{listItems}</ul>;
โ๏ธ 14. PropTypes์ DefaultProps
`PropTypes`์ `DefaultProps`๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ props์ ํ์ ์ ๊ฒ์ฆํ๊ณ , props๊ฐ ์ ๋ฌ๋์ง ์์์ ๋์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
import PropTypes from 'prop-types';
function MyComponent({ name }) {
return <h1>{name}</h1>;
}
// PropTypes๋ก 'name' prop์ ํ์
์ ๋ฌธ์์ด๋ก ์ง์
MyComponent.propTypes = {
name: PropTypes.string.isRequired,
};
// DefaultProps๋ก 'name' prop์ ๊ธฐ๋ณธ๊ฐ ์ค์
MyComponent.defaultProps = {
name: '๊ธฐ๋ณธ ์ด๋ฆ',
};
export default MyComponent;
โ๏ธ 15. ์ปดํฌ๋ํธ์ ๋๋ฌธ์
React์์๋ ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๊ฐ ๋๋ฌธ์๋ก ์์ํด์ผ ํฉ๋๋ค. ์๋ฌธ์๋ก ์์ํ๋ ํ๊ทธ๋ ๊ธฐ๋ณธ HTML ํ๊ทธ๋ก ์ธ์๋ฉ๋๋ค.
function MyComponent() {
return <div>Hello</div>;
}
โ๏ธ 16. JSX ์คํ๋ ๋ ์ฐ์ฐ์
JSX์์๋ ์คํ๋ ๋ ์ฐ์ฐ์(...)๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ props๋ฅผ ํ ๋ฒ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
const buttonProps = {
className: 'primary-button',
disabled: true
};
// ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด props ์ ๋ฌ
function MyButton() {
return <button {...buttonProps}>Click Me</button>;
}
export default MyButton;
โ๏ธ 17. ์ธ๋ผ์ธ ์กฐ๊ฑด๋ถ JSX
๊ฐ๋จํ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ ์ํด && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
const isLoggedIn = true;
return (
<div>
{isLoggedIn && <p>๋ก๊ทธ์ธ ๋์์ต๋๋ค!</p>}
</div>
);
'๐งฉFront-End' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Webpack ๋น๋ ์๋ฃ ์๊ฐ ํฐ๋ฏธ๋์ ์ถ๋ ฅํ๊ธฐ(npm run watch) (0) | 2024.09.08 |
---|---|
[React] Props ์ ๋ฌ ๋ฐฉ๋ฒ 10๊ฐ์ง ์์ ๋ก ์ดํด๋ณด๊ธฐ (2) | 2024.09.06 |
[JS] ES6 ๋ฌธ๋ฒ 8๊ฐ์ง ์์ ๋ก ์ดํด๋ณด๊ธฐ (1) | 2024.09.06 |
[๋ชฉ์ฐจ] ๋ฆฌ์กํธ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ (๊ฐ์ ํ) (2) | 2024.08.31 |