πŸ“

2. JSX

2-1. 기초

src에 μžˆλŠ” App.jsλ₯Ό μˆ˜μ •ν•˜λ©° μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
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> ); }
App.js의 App()ν•¨μˆ˜
html을 μ‚¬μš©ν•΄ 보셨닀면 return() μ•ˆμ— μžˆλŠ” λ‚΄μš©λ“€μ΄ μ΅μˆ™ν•  κ±°μ—μš”. μš°λ¦¬κ°€ κΈ°λ³Έ jsμ—μ„œ μœ„μ™€ 같은 λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•œλ‹€λ©΄ μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ μœ„μ™€ 같은 방법을 μ‚¬μš©ν•˜λ©΄ 더 νŽΈν•˜κ²Œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ½”λ“œλ₯Ό νŽΈν•˜κ²Œ μž‘μ„±ν•˜κ²Œ ν•΄μ£ΌλŠ” 방법이 기쑴의 jsλ₯Ό ν™•μž₯ν•œ jsxμž…λ‹ˆλ‹€. 이제 return μ•ˆμ˜ ꡬ문을 μ‹Ή μ§€μš°κ³  μ•„λž˜μ™€ 같이 μˆ˜μ •ν•΄ λ³΄μ„Έμš”. 닀뀄보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.
function App() { return ( <h1>μ•ˆλ…•, 라이캣!</h1> ); }
μˆ˜μ •λœ App()ν•¨μˆ˜
notion imagenotion image
μ½”λ“œλ₯Ό μˆ˜μ •ν•œ ν›„ ν„°λ―Έλ„μ—μ„œ npm start λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ μ‹€ν–‰ν•΄ λ΄…μ‹œλ‹€.
npm start
Β 

2-2 JSX문법

μ΅œμƒμœ„ λΆ€λͺ¨μš”μ†ŒλŠ” 1개

μ΄λ²ˆμ—λŠ” h1 νƒœκ·Έλ₯Ό μ΄μš©ν•΄ 2개의 νƒœκ·Έλ₯Ό μž‘μ„±ν•˜κ³  μ €μž₯ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
function App() { return ( <h1>μ•ˆλ…•, 라이캣 1호!</h1> <h1>μ•ˆλ…•, 라이캣 2호!</h1> ); }
notion imagenotion image
이런, μ»΄νŒŒμΌμ— μ‹€νŒ¨ν–ˆκ΅°μš”! λ¬Έμ œκ°€ μžˆλŠ” 뢀뢄에 μ΄λ ‡κ²Œ μ•Œλ¦Όμ„ μ£ΌλŠ”λ°μš”.
jsx둜 ν‘œν˜„ν•  λ•Œμ—λŠ” ν•˜λ‚˜μ˜ λΆ€λͺ¨λ§Œ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, μ΅œμƒμœ„μ—λŠ” ν•œ 개의 νƒœκ·Έλ§Œ μžˆμ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ•„λž˜μ™€ 같이 μ½”λ“œλ₯Ό μˆ˜μ •ν•˜λ©΄ 잘 μ‹€ν–‰λ˜λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
function App() { return ( <div> <h1>μ•ˆλ…•, 라이캣 1호!</h1> <h1>μ•ˆλ…•, 라이캣 2호!</h1> </div> ); }
μˆ˜μ •λœ App()
잘 λ™μž‘ν•©λ‹ˆλ‹€!잘 λ™μž‘ν•©λ‹ˆλ‹€!
잘 λ™μž‘ν•©λ‹ˆλ‹€!
Β 

주석

function App() { //μ—¬κΈ°λŠ” jsν•  λ•Œμ™€ λ˜‘κ°™μ΄ 주석을 μž…λ ₯ν•©λ‹ˆλ‹€! return ( <div>{/* μ΅œμƒμœ„νƒœκ·ΈλŠ” ν•˜λ‚˜λ§Œ! */} {/* μ—¬κΈ°λΆ€ν„°λŠ” jsx! 주석은 μ΄λŸ°μ‹μœΌλ‘œ μž‘μ„±ν•©λ‹ˆλ‹€~ */} <h1>μ•ˆλ…•, 라이캣 1호</h1> <h1> μ•ˆλ…•, 라이캣 2호! </h1>{/* νƒœκ·ΈλŠ” 무쑰건 λ‹«μ•„μ€˜μ•Όν•©λ‹ˆλ‹€! μ•ˆκ·ΈλŸ¬λ©΄ μ—λŸ¬λ‚˜μ™€μš”! */} <div/>{/* μ΄λŸ°μ‹μœΌλ‘œ λ°”λ‘œ λ‹«νžˆκ²Œ ν•  μˆ˜λ„ μžˆμ–΄μš”! */} </div> ); }
Β 

νƒœκ·Έμ— 클래슀 λ„£κΈ° + μŠ€νƒ€μΌ μ μš©ν•˜κΈ°

import './App.css'; function App() { return ( <div> <h1>μ•ˆλ…•, 라이캣 1호</h1> <h1>μ•ˆλ…•, 라이캣 2호!</h1> <div className="newClass"/> {/* classλŒ€μ‹  className=""둜 진행! */} </div> ); } export default App;
Β 
자, μ΄λ²ˆμ—λŠ” μœ„μ—μ„œ μž‘μ„±ν•œ div νƒœκ·Έμ— μŠ€νƒ€μΌμ„ μ μš©ν•΄ λ΄…μ‹œλ‹€.
μš°μ„  λ§Œλ“  div에 클래슀λ₯Ό λ¨Όμ € μΆ”κ°€ν•˜κ² μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ HTMLμ—μ„œμ™€ 달리 클래슀λ₯Ό μΆ”κ°€ν•  λ•Œ jsxμ—μ„œλŠ” class라고 κΈ°μž¬ν•˜μ§€ μ•Šκ³  className이라고 ν‘œκΈ°ν•˜μ—¬ 클래슀λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.
클래슀λ₯Ό μΆ”κ°€ν•΄ μ£Όμ—ˆλ‹€λ©΄ μ΄μ œλŠ” css νŒŒμΌμ„ μˆ˜μ •ν•΄ λ΄…μ‹œλ‹€. μš°μ„  App.css νŒŒμΌμ„ μ—΄μ–΄λ΄…μ‹œλ‹€. μ•ˆμ„ μ‚΄νŽ΄λ³΄λ©΄ App.css도 기본으둜 μž‘μ„±λ˜μ–΄ μžˆλŠ” μ½”λ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. μ•ˆμ— μžˆλŠ” λ‚΄μš©μ„ λͺ¨λ‘ μ§€μ›Œμ€€ ν›„ μ•„λž˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€. cssλŠ” 기쑴에 μš°λ¦¬κ°€ μž‘μ„±ν–ˆλ˜ 방식 κ·ΈλŒ€λ‘œ! μ‚¬μš©ν•˜λ©΄ λ©λ‹ˆλ‹€.
.newClass{ width: 100%; height: 20px; background-color: black; }
Β 
notion imagenotion image
μ €μž₯ ν›„ μ‹€ν–‰ν•˜λ©΄ μœ„μ˜ 사진과 같이 'μ•ˆλ…•, 라이캣 2호!' ν•˜λ‹¨μ— 검은색 쀄이 생긴 λͺ¨μŠ΅μ„ 보싀 수 μžˆμŠ΅λ‹ˆλ‹€. cssκ°€ 잘 μ μš©λ˜μ—ˆλ„€μš”! in-line μŠ€νƒ€μΌλ‘œ μ μš©ν•˜λŠ” 법도 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
in-line μŠ€νƒ€μΌλ‘œ μ μš©ν•  λ•ŒλŠ” μ£Όμ˜ν•  점이 μžˆμŠ΅λ‹ˆλ‹€. style을 μ •μ˜ν•  λ•ŒλŠ” 였브젝트 ν˜•νƒœλ‘œ μž‘μ„±ν•΄μ•Ό ν•˜λŠ”λ°μš”! 였브젝트 ν˜•νƒœλŠ” μ•„λž˜μ™€ 같이 key와 valueλ₯Ό 짝을 지어 μž‘μ„±ν•©λ‹ˆλ‹€.
{ "key":value, }
Β 
μ•žμ„œ 클래슀 이름을 νƒœκ·Έμ— μΆ”κ°€ν•  λ•Œ class="ν΄λž˜μŠ€μ΄λ¦„" ν˜•νƒœκ°€ μ•„λ‹Œ className="ν΄λž˜μŠ€μ΄λ¦„"으둜 μ μ—ˆμ—ˆμ£ ?
이처럼 HTMLκ³Ό 또 λ‹€λ₯Έ 차이점이 μ‘΄μž¬ν•©λ‹ˆλ‹€. μŠ€νƒ€μΌμ„ μ •μ˜ν•  λ•ŒλŠ” '-'λ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— camelCase(단어λ₯Ό λŒ€λ¬Έμžλ‘œκ΅¬λΆ„)λ₯Ό μ‚¬μš©ν•˜μ—¬ μž‘μ„±ν•©λ‹ˆλ‹€.
μ•„λž˜μ™€ 같이 backgournd-color 라고 μž‘μ„±ν•˜λŠ” λŒ€μ‹  backgroundColor 처럼 μž‘μ„±ν•©λ‹ˆλ‹€.
<div style={{backgroundColor:"black", color:"white"}}></div>
Β 
  • λΉ„κ΅ν•΄λ³΄μ„Έμš”.
<h1 style={{backgroundColor:"black", color:"white"}}>μ•ˆλ…•, 라이캣 1호</h1> <h1 style='background-color:black; color:white'>μ•ˆλ…•, 라이캣 2호!</h1>
import './App.css'; function App() { return ( <div> <h1 style={{backgroundColor:"black", color:"white"}}>μ•ˆλ…•, 라이캣 1호</h1> <h1>μ•ˆλ…•, 라이캣 2호!</h1> <div className="newClass"/> </div> ); } export default App;
notion imagenotion image
Β 

μžλ°”μŠ€ν¬λ¦½νŠΈ μ‚¬μš©ν•˜κΈ°

μ΄λ²ˆμ—λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ³€μˆ˜λ₯Ό λ§Œλ“€κ³  이 λ³€μˆ˜λ₯Ό λ„£μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€. μ–΄λ””μ„œ μž‘μ„±ν•˜λƒκ³ μš”? jsx 문법 μ•ˆμ—μ„œ μž‘μ„±ν•©λ‹ˆλ‹€. μ–΄λ–»κ²Œ? λŠ” 이제 ν•¨κ»˜ 확인해 λ³΄μ‹œμ£ !
자! μ•„λž˜ μ½”λ“œλ₯Ό μž‘μ„±ν•΄ μ£Όμ„Έμš”. κΈ°μ‘΄ return() μœ„μ— const name = '라이캣!' 으둜 λ³€μˆ˜ ν•˜λ‚˜λ₯Ό μƒμ„±ν•˜κ³ , return() μ•ˆ jsx νƒœκ·Έ μ•ˆμ— 라이캣 λŒ€μ‹  μ€‘κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μ—¬ name으둜 λ³€κ²½ν•©λ‹ˆλ‹€.
import './App.css'; function App() { const name = '라이캣!'; return ( <div> <h1 style={{backgroundColor:"black", color:"white"}}> μ•ˆλ…•, {name} 1호 </h1> <h1>μ•ˆλ…•, 라이캣 2호!</h1> <div className="newClass"/> </div> ); } export default App;
notion imagenotion image
Β 
μŠ€νƒ€μΌλ„ λ³€μˆ˜μ— λ„£μ–΄ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 첫번째 h1에 μ μš©ν•œ μŠ€νƒ€μΌμ„ someStyle λ³€μˆ˜μ— ν• λ‹Ήν•΄ λ΄…μ‹œλ‹€.
const someStyle = {backgroundColor:"black", color:"white"}
Β 
λ³€μˆ˜λ₯Ό μ„ μ–Έν•΄ μ€€ ν›„ μ•„λž˜μ™€ 같이 style={somStyle} 을 μΆ”κ°€ν•˜μ—¬ μŠ€νƒ€μΌμ„ μ μš©ν•©λ‹ˆλ‹€.
import './App.css'; function App() { const name = '라이캣!'; const someStyle = {backgroundColor:"black", color:"white"}; return ( <div> <h1 style={someStyle}> μ•ˆλ…•, {name} 1호 </h1> <h1>μ•ˆλ…•, 라이캣 2호!</h1> <div className="newClass"/> </div> ); } export default App;
Β 
이 외에도 jsμ—μ„œ λ™μž‘ν•˜λŠ” 기본적인 κΈ°λŠ₯듀을 ν™œμš©ν•˜μ—¬ λ§Žμ€ 것듀을 ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 뢀뢄은 λ’€μ—μ„œ 더 μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.
특히 데이터λ₯Ό λ§€ν•‘ν•˜λŠ” 방법은 기쑴에 document.querySelector 등을 μ‚¬μš©ν•˜μ—¬ μ„ νƒμžλ₯Ό μ°Ύκ³ , element.innerHTML 을 톡해 값을 λ³€κ²½ν•΄μ£ΌλŠ” 방법에 λΉ„ν•΄ 맀우 νŽΈλ¦¬ν•©λ‹ˆλ‹€. 그리고 이런 데이터λ₯Ό λ„£μ–΄μ£ΌλŠ” 것을 데이터바인딩이라고 ν•©λ‹ˆλ‹€.
Β 

2-3. μ‹€μŠ΅

μ•žμ—μ„œ 배운 λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ μ•„λž˜μ™€ 같은 UIλ₯Ό μΆ”κ°€ν•΄ λ³΄μ„Έμš”.
notion imagenotion image
  1. 각 μ‹œκ°„μ€ 직접 μž…λ ₯(λ¬Έμžμ—΄λ‘œ 타이핑)ν•˜μ§€ μ•Šκ³  좜λ ₯ν•˜κ²Œ λ§Œλ“€μ–΄ μ£Όμ„Έμš”.
  1. μƒˆλ‘œκ³ μΉ¨ν•  λ•Œλ§ˆλ‹€ ν˜„μž¬ μ‹œκ°„μ„ ν‘œμ‹œν•©λ‹ˆλ‹€. Tip)μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ μ œκ³΅ν•˜λŠ” Date ν™œμš©, 데이터바인딩 ν•˜κΈ°!
  1. μŠ€νƒ€μΌλ„ μ μš©ν•΄ λ³΄μ„Έμš”.
μ •λ‹΅
import './App.css'; function App() { const name = '라이캣!'; const someStyle = {backgroundColor:"black", color:"white"}; const today = new Date(); const year = today.getFullYear(); const month = today.getMonth()+1; const date = today.getDate(); const hour = today.getHours(); const min = today.getMinutes(); const sec = today.getSeconds(); return ( <div> <div> <h1 style={someStyle}>μ•ˆλ…•, {name} 1호</h1> <h1>μ•ˆλ…•, 라이캣 2호!</h1> <div className="newClass"/> </div> <div style={{backgroundColor:"black", color:"white"}}> <h1 style={{color:'red'}}>λ…„ : {year}</h1> <h1>μ›”/일 : {month}/{date}</h1> <h1>μ‹œκ°„ : {hour}μ‹œ {min}λΆ„ {sec}초</h1> </div> </div> ); } export default App;
Β 
Β 
Β