JSX๋ ํจ์ ํธ์ถ๊ณผ ๊ฐ์ฒด ์์ฑ์ ์ํ ๋ฌธ๋ฒ์ ํธ์๋ฅผ ์ ๊ณตํ๋ JavaScript์ ํ์ฅ์ด๋ค.
HTML๊ณผ ๋น์ทํ ํํ๋ฅผ ๋๊ณ ์์ผ๋, ์ํ์ JavaScript์ด๋ฉฐ HTML๊ณผ ๋ค๋ฆ.
JSX๋ Babel์ ์ํด์ Transcompile ๋๋ค. (์์ฐ์ฑ ํฅ์)
JSX
<div className='App'> <header className='App'> <img src={logo} className='App-logo' alt='logo' /> <h1 className='App-title'>Welcome to React</h1> </header> <p className='App-intro'> Hello World </p> </div>
JS (Babel์ผ๋ก ๋ณํ๋ JS ์ฝ๋)
react.createElement('div', { className: 'App' }, React.createElement('header', { className: 'App-header' }, React.createElement('img', { src: logo, className: 'App-logo', alt: 'logo' }), React.createElement('h1', { className: 'App-title' }, 'Welcome to React')), React.createElement('p', { className: 'App-intro' }, 'Hello world'));
HTML+JS์ ๊ฒฝ์ฐ
<div> <span id='a'></span> + <span id='b'></span> = <span id='sum'></span> </div> <script> const a = 3; const b = 6; document.getElementById('a').innerHTML = a; document.getElementById('b').innerHTML = b; document.getElementById('sum').innerHTML = a+b; </script>
JSX
const App = () => { const a = 3; const b = 6; return <div>{a} + {b} = {a+b}</div> }
1. class => className์ผ๋ก ์ ๋ ฅ
(
<div className='greeting' style={{padding:10, color: 'red'}}>
{name}๋ ์ด์์ค์ธ์. <br/>
ํ์ํฉ๋๋ค.
</div>
)
์ฃผ์์ : ์์ ๊ฐ์ด Inline style์ Propery name์ camelCase๋ก ์์ฑํ๋ค.
(e.g. font-size -> fontSize, padding-left -> paadingLeft)
2. ์คํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ object๋ก ์์ฑํ๋ค.
style={{padding:10, color: 'red'}}
style์ ์ฒซ๋ฒ์งธ ์ค๊ดํธ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์์ ์๋ฆฌ๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ธ์ ํธ ํํ๋ก ์์ฑ.
3. ๋ซ๋ ํ๊ทธ๊ฐ ํ์์ ์ด๋ค.
<div>
<input type='text'/>
<br/>
</div>
4. ์ต์๋จ element๋ ๋ฐ๋์ ํ๋์ฌ์ผ ํ๋ค.
const App = () => {
return (
<> {/* React.Fragment */}
<div>Hello</div>
<div>World</div>
</>
)
}
JSX์ ์์น์ ์ต์๋จ Element๋ ํ ๊ฐ๋ง ์์ฑ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ div ๋๋ React.Fragment๋ฅผ ์ด์ฉํด ๊ฐ์ผ๋ค. ์ค์ ๋ ๋๋ง ์์๋ Fragment ์์ ์๋ ๋ด์ฉ๋ง ์ถ๋ ฅ๋๋ค.
const MyComponent = ({ children }) => { return <div style={{ padding: 20, color: 'blue' }}> } const App = () => { return ( <div> <p>์๋ </p> <MyComponent>์ฌ๊ธฐ</MyComponent> <div>๋ฐ์ด๋ฐ์ด</div> </div> ); }
Component์ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ํ๋ค. (htmlํ๊ทธ์ ๊ตฌ๋ถํ๋ค)
Class Component
class Hello extends Component { render() { const { name } = this.props; return <div>{name}๋ ์ด์์ค์ธ์.</div> } }
Function Component
const Hello = (props) => { const { name } = props; return <div>{name}๋ ์ด์์ค์ธ์.</div> }
์ด๊ธฐ React์ Component๋ ๋ชจ๋ Class Component์์ผ๋, v16๋ฒ์ ๋ถํฐ ์๋ก์ด Function Component์ Hooks ๊ฐ๋ ์ด ๋ฐํ๋๊ณ ๋ ํ, ํ์ฌ๋ Function Component๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋๊ณ ์๋ค.
<MyComponent user={{name: '๋ฏผ์' }} color='blue'>
<div>์๋
</div>
</MyComponent>
์ปดํฌ๋ํธ์ Attribute์ ํด๋นํ๋ ๋ถ๋ถ์ Props(Properties)๋ผ๊ณ ํ๋ค.
์ปดํฌ๋ํธ ์์ ์์ฑ๋ ํ์ Element๋ฅผ children์ด๋ผ๊ณ ํ๋ฉฐ, children๋ props ์ค ํ๋์ด๋ค.
const MyComponent = (props) => {
const { user, color, children } = props;
return (
<div style={{ color }}>
<p>{user.name}์ ํ์ ์์๋</p>
{ children }
</div>
)
}
์ปดํฌ๋ํธ์ ์์(children)์์๋ props๋ก๋ถํฐ ๊ฐ์ ๋ฐ์์จ๋ค.
- Controlled Component: ๊ฐ Input๋ค์ ๋ฐ์ดํฐ๋ฅผ state๋ฅผ ์ด์ฉํด ์ง์ ๊ด๋ฆฌํ๋ ์ปดํฌ๋ํธ
- Uncontrolled Component: ๋ฐ์ดํฐ๋ฅผ ๋ฆฌ์กํธ๋ก ๊ด๋ฆฌํ์ง ์๊ณ , ํ์ํ ๋ Element๋ก ๋ถํฐ ๋ถ๋ฌ์ค๋ ์ปดํฌ๋ํธ
ํ์ค ํ: React๋ฅผ ์ ํ์ฉํ๋ ค๋ฉด, JSX์ Component์ ๊ฐ๋ ์ ์ ์ดํดํ๊ณ ์ง๊ณ ๋์ด๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ์ ๋ฐฐ์ ๋ค.