-
ํํ์๊ณผ ๋ฌธ, ๊ทธ๋ฆฌ๊ณ React์ JSX์นดํ ๊ณ ๋ฆฌ ์์ 2023. 2. 18. 12:38
1. ํํ์(Expression)
ํํ์์ด๋ ๊ฐ์ผ๋ก ํ๊ฐ๋ ์ ์๋ ๋ฌธ(statement)์ด๋ค. ํํ์์ด ํ๊ฐ๋๋ฉด ์๋ก์ด ๊ฐ์ ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด ๊ฐ์ ์ฐธ์กฐํ๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๋ฌธ๋ค์ ๋ชจ๋ ํํ์์ด๋ค.
100; 50 + 50; // ๋ฆฌํฐ๋ด & ์ฐ์ฐ์๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ ํ๊ฐ๋์ด ๊ฐ 100์ ์์ฑํ๋ฏ๋ก ํํ์ score; // ๋ณ์ ์๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด ๋ณ์ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ค. // ์๋ณ์ ์ฐธ์กฐ๋ ๊ฐ์ ์์ฑํ์ง๋ ์์ง๋ง ๊ฐ์ผ๋ก ํ๊ฐ๋๋ฏ๋ก ํํ์์ด๋ค.
// ๋ฆฌํฐ๋ด ํํ์ // ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ํด ํ๊ฐ๋์ด ๊ฐ์ ์์ฑํ๋ฏ๋ก ๊ทธ ์์ฒด๋ก ํํ์ 10 'Hello' // ์๋ณ์ ํํ์(์ ์ธ์ด ์ด๋ฏธ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ) // ์๋ณ์ ์ฐธ์กฐ๋ ๊ฐ์ ์์ฑํ์ง๋ ์์ง๋ง ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ฏ๋ก ํํ์ sum person.name arr[1] // ์ฐ์ฐ์ ํํ์ 10 + 20 sum = 10 sum !== 10 // ํจ์/๋ฉ์๋ ํธ์ถ ํํ์(์ ์ธ์ด ์ด๋ฏธ ์กด์ฌํ๋ค๊ณ ๊ฐ์ ) square() person.getName()
Quiz!
๋ค์ ์๋ JS ์ฝ๋ ์ฒญํฌ์ ๋ช ๊ฐ์ ํํ์์ด ์์๊น?
(5 + 1) * 2
๋ต : ์ด 5๊ฐ์ด๋ค!
1) 5
2) 1
3) 2
4) 6
5) 122. ๋ฌธ (statements)
๋ฌธ(statements)์ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ๋จ์์ด์ ์ต์ ์คํ ๋จ์๋ค. ๋ฌธ์ ์งํฉ์ผ๋ก ์ด๋ค์ง ๊ฒ์ด ํ๋ก๊ทธ๋จ์ด๋ฉฐ, ๋ฌธ์ ์์ฑํ๊ณ ์์์ ๋ง๊ฒ ๋์ดํ๋ ๊ฒ์ด ํ๋ก๊ทธ๋๋ฐ์ด๋ค.
๋ฌธ์ ์ฌ๋ฌ ํ ํฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค. ํ ํฐ์ด๋ ๋ฌธ๋ฒ์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ฌธ๋ฒ์ ์ผ๋ก ๋ ์ด์ ๋๋ ์ ์๋ ์ฝ๋์ ๊ธฐ๋ณธ ์์๋ฅผ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, ํค์๋, ์ฐ์ฐ์, ๋ฆฌํฐ๋ด, ์ธ๋ฏธ์ฝ๋ก ์ด๋ ๋ง์นจํ ๋ฑ์ ํน์ ๊ธฐํธ๋ ๋ฌธ๋ฒ์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋ฌธ๋ฒ์ ์ผ๋ก ๋ ์ด์ ๋๋ ์ ์๋ ์ฝ๋์ ๊ธฐ๋ณธ ์์์ด๋ฏ๋ก ๋ชจ๋ ํ ํฐ์ด๋ค.
๋ฌธ์ ๋ช ๋ น๋ฌธ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ์ฆ, ๋ฌธ์ ์ปดํจํฐ์ ๋ด๋ฆฌ๋ ๋ช ๋ น์ด๋ค. ๋ฌธ์ด ์คํ๋๋ฉด ๋ช ๋ น์ด ์คํ๋๊ณ ๋ฌด์จ ์ผ์ธ๊ฐ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค. ๋ฌธ์
์ ์ธ๋ฌธ, ํ ๋น๋ฌธ, ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ
๋ฑ์ผ๋ก ๊ตฌ๋ถํ ์ ์๋ค.// ๋ณ์ ์ ์ธ๋ฌธ var x; // ํ ๋น๋ฌธ x = 5; // ํจ์ ์ ์ธ๋ฌธ function foo () {} // ์กฐ๊ฑด๋ฌธ if (x > 1) {console.log(x);} // ๋ฐ๋ณต๋ฌธ for (var i = 0; i < 2; i++) { console.log(i); }
3. ํํ์๊ณผ ๋ฌธ์ ๊ตฌ๋ถํ๋ ๋ฒ
1. ๋ณ์์ ํ ๋นํด๋ณด๊ธฐ
var x = var x; // ๋ณ์์ ํ ๋น๊ฐ๋ฅํ๊ฐ? ์๋๋ค! ๊ณ ๋ก ์ ์ธ๋ฌธ์ ํํ์์ด ์๋
var x = 100; // ๋ณ์์ ํ ๋น๊ฐ๋ฅํ๊ฐ? ๊ทธ๋ ๋ค! ๊ณ ๋ก ํ ๋น๋ฌธ์ ํํ์์ด๋ค.
2. console.log ์ฐ์ด๋ณด๊ธฐ
๋ชจ๋ ํจ์ ์ธ์๊ฐ ํํ์์ด์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋์ํ๋ค. ํํ์์ ๊ฐ์ ์์ฑํ๊ณ ๊ทธ ๊ฐ์ด ํจ์์ ์ ๋ฌ๋๊ธฐ ๋๋ฌธ!
console.log(์ฌ๊ธฐ์ ์ฐ์ด๋ณด๊ธฐ!) console.log(if(~~~)) // Unexpected token 'if' console.log(1+2) // 3
3. Chrome์์ ์๋ฃ ๊ฐ(completion value) ํ์ธํด๋ณด๊ธฐ
- ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ํํ์์ด ์๋ ๋ฌธ์ ์คํํ๋ฉด ์ธ์ ๋ undefined๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋ฅผ ์๋ฃ ๊ฐ์ด๋ผ๊ณ ํ๋๋ฐ, ์๋ฃ ๊ฐ์ ํํ์์ ํ๊ฐ ๊ฒฐ๊ณผ๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ๋ค๊ทผ ๊ฐ๊ณผ ๊ฐ์ด ๋ณ์์ ํ ๋นํ ์ ์๊ณ ์ฐธ์กฐํ ์๋ ์๋ค.
์, ๋ค์ ๋ณ์ ์ ์ธ๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ์ 'undefined'๋ฅผ ๋ฐํํ๋ค.
๋ฐ๋ฉด, ํํ์์ธ ๋ฌธ์ ์คํํ๋ฉด ์ธ์ ๋ ํ๊ฐ๋ ๊ฐ์ ๋ฐํํ๋ค.
** ์ง๋ฌธ,
var num = 10
์ ๋ณ์ ์ ์ธ๋ฌธ์ด์ ํ ๋น๋ฌธ์ธ๋ฐ ์undefined๋ฅผ ๋ฐํํ ๊น?
์ฌ์ค, ์์ ๋ฌธ์ ๋ณ์ ์ ์ธ๊ณผ ํ ๋น์ ํ๋์ ๋ฌธ์ผ๋ก ๋จ์ถ ํํํด ๋์ ๊ฒ์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ณ์ ์ ์ธ๊ณผ ๊ฐ์ ํ ๋น์ 2๊ฐ์ ๋ฌธ์ผ๋ก ๋๋์ด ๊ฐ๊ฐ ์คํํ๋ค. ๋ํ ์ด ๋ ์ฃผ์ํ ์ ์ ๋ณ์ ์ ์ธ๊ณผ ๊ฐ์ ํ ๋น ์์ ์ด ๋ค๋ฅด๋ค๋ ๊ฒ์ธ๋ฐ, ๋ณ์ ์ ์ธ์ ๋ฐํ์ ์ด์ , ๊ฐ์ ํ ๋น์ ๋ฐํ์์ ์คํ๋๋ค.์์์ undefined๊ฐ ๋์จ๊ฒ์ var foo ์ด ๋ถ๋ถ๋ง ๋จผ์ ์คํ๋์๊ธฐ ๋๋ฌธ์ด ์๋๊น...๐ฎ ? (์ง๋ฌธํ๊ธฐ)
4. React์์ ๊ฐ / ํํ์์ ์๋ฏธ
React ๊ณต์๋ฌธ์์์
expression
์ ๊ฒ์ํด๋ณด๋ฉด, JSX์ curly braces({ }) ์์์ ํํ์์ด ์ฌ์ฉ๊ฐ๋ฅํ๋ค๋ ๋ง์ด ๋์์๋ค.Any JavaScript expression will work between curly braces, including function calls like formatDate():
๊ทธ๋ฆฌ๊ณ if ๋ฌธ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด conditional Rendering์ ํ๋๋ก ํด์ค์ผ ํ๋ค๊ณ ๋์ด ์๋ค.
if (isPacked) { return <li className="item">{name} โ</li>; } return <li className="item">{name}</li>;
๋ณดํต ์์ ๊ฐ์ ์กฐ๊ฑด๋ถ ๋ ๋๋ง์์ ์ฐ๋ฆฌ๋ Conditional(ternary) operator(? :) ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ค.
return ( <li className="item"> {isPacked ? name + ' โ' : name} </li> );
์์์ ์ดํด๋ดค๋ ๋๋ก, if๋ฌธ์ '๋ฌธ'์ด๋ฉฐ ternary operator๋ ๊ฐ์ผ๋ก ํ๊ฐ๋๋ 'ํํ์'์ด๋ค. ์ฆ, React JSX์์ { }์ค๊ดํธ ์์ ๋ฃ์ ์ ์๋ ๊ฒ์ ํํ์ ๋ฟ์ด๋ผ๋ ์๋ฆฌ์ธ๋ฐ, ์ด๊ฑด ์ ๊ทธ๋ด๊น?
JSX ๋ ์ฌ์ค ๋ฌธ๋ฒ์ ์คํ์ด๋ค!
๊ณต์๋ฌธ์์ ๋ณด๋ฉด, ์๋์ ๊ฐ์ด ์ ํ์๋ค.
๊ทผ๋ณธ์ ์ผ๋ก, JSX๋ React.createElement(component, props, ...children) ํจ์์ ๋ํ ๋ฌธ๋ฒ์ ์คํ์ ์ ๊ณตํ ๋ฟ์ ๋๋ค.
์ฌ์ค JSX๋ก ์ด ์ฝ๋๋ค์ ๋ด๋ถ์ ์ผ๋ก
React.createElement(component, props, ...children)
์ด๋ผ๋ ํจ์๋ฅผ ๊ฑฐ์ณ ์ฐ๋ฆฌ๊ฐ ๋ณด๋ ์ปดํฌ๋ํธ๋ค์ด ๋ง๋ค์ด ์ง๋ ๊ฒ์ด๋ค. ์์์ ํํ ์๊ณผ ๋ฌธ์ ๊ตฌ๋ถํ ๋, console.log๋ก ์ฐ์ด๋ณผ ์ ์๋ ๊ฒ์ ํํ์, ์๋ ๊ฒ์ ๋ฌธ์ด๋ผ๊ณ ํ๋ค. ์ด์ ๋ํ ์ด์ ๋ํจ์๋ ๊ฐ์ ์ธ์๋ก ๋ฐ๊ธฐ ๋๋ฌธ
์ด๋ผ๊ณ ํ๋ค. ์ฌ๊ธฐ์๋ ๊ฐ์ ๋งฅ๋ฝ์ด๋ค.{ }๋ก ์์ฑํ ๋ด์ฉ์ ...children parameter์ ํด๋นํ๊ฒ ๋๋๋ฐ, ๊ฐ์ ๋๊ฒจ์ผ ํ๋๋ฐ, ์ด ๋ถ๋ถ์ ๋ฌธ์ด ๋ค์ด๊ฐ๋ฉด ํจ์ ์คํ์ ์ค๋ฅ
๊ฐ ๋๋ ๊ฒ์ด๋ค.React.createElement
๋ฅผ ์ฝ๋๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.<MyButton color="blue" shadowSize={2}> Click Me </MyButton> React.createElement(MyButton, {color:'blue', shadowSize:2}, 'Click me'); <div className = "sidebar" /> React.createElement('div', {className: 'sidebar'})
Click Me
๊ฐ createElementํจ์์ ์ธ ๋ฒ์งธ ์ธ์๋ก ๋ค์ด๊ฐ ๊ฒ์ ๋ณผ ์ ์๋ค.
Babel compiler์์ ํ๋ฒ ๋ ์ดํด๋ณด์๋ค.function hello() { return <div>{100>1 ? 'minju' : 'ariel'}</div>; } function hello() { return /*#__PURE__*/React.createElement("div", null, 100 > 1 ? 'minju' : 'ariel'); }
๋ฐ๋ผ์ { }์์๋ ์ค๋ก์ง ํํ์๋ง ๋ฃ์ ์ ์๊ณ , ๋ฌธ์ ๋ฃ์ ์ ์๋ค!
์ฐธ๊ณ
- ๋ฆฌ์กํธ ๊ณต์๋ฌธ์
- ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ 05 ํํ์๊ณผ ๋ฌธ
- https://dev-boku.tistory.com/entry/%EB%B2%88%EC%97%AD-%EB%AC%B8-vs-%ED%91%9C%ED%98%84%EC%8B%9D