λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
[개발] Practice/React

[React] λΈ”λ‘œκ·Έ κΈ€λ°œν–‰ κΈ°λŠ₯ λ§Œλ“€κΈ°

by Connecting-the-dots 2022. 3. 22.
728x90
λ°˜μ‘ν˜•

πŸ’‘ μ‹€μŠ΅ 포인트!

  • μ˜€λŠ˜μ€ λΈ”λ‘œκ·Έ κΈ€λ°œν–‰ κΈ°λŠ₯을 λ§Œλ“€μ–΄λ³΄μ•˜λ‹€.
  • 맀번 짧은 κ°•μ˜μ— ν•„μš”ν•œ λ‚΄μš©λ§Œ μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ‹΄μ•„λ‚΄λŠ” κ°•μ˜λ ₯도 κ°•μ˜λ ₯μ΄μ§€λ§Œ, κ°•μ‚¬λ‹˜μ΄ ν•˜μ‹œλŠ” λ§μ”€μ΄λ‚˜ κ°•μ˜λ…ΈνŠΈκ°€ λ„ˆλ¬΄ μ›ƒκ²¨μ„œ κ³΅λΆ€ν•˜λ©° μ½”λ“œ μž‘μ„±ν•˜λŠ” 게 μž¬λ―Έμžˆλ‹€.
  • λ‹€ν–‰νžˆλ„ 30초 생각해보고 "μ•„ λͺ¨λ₯΄κ²Ÿλ„Ή μž‡νž~" ν•˜λŠ” 일은 μ—†μ—ˆκ³ , μ½”λ“œμž‘μ„±ν•˜κ³  λΈŒλΌμš°μ €μ—μ„œ 직접 ν™•μΈν•˜λŠ” λ°κΉŒμ§€ 10λΆ„ 정도 κ±Έλ¦° 것 κ°™λ‹€.
  • MongoDB λ‹€λ£¨λŠ” 방법도 μ „μ²΄μ μœΌλ‘œ ν•œλ²ˆ κ³΅λΆ€ν–ˆμœΌλ‹ˆ λ‚˜μ€‘μ—λŠ” μ΄λ ‡κ²Œ 'λ“±λ‘ν•˜κΈ°' λ²„νŠΌμ„ 톡해 μ „μ†‘λœ 데이터λ₯Ό DB 에도 μ €μž₯ν•˜κ³  뢈러올 수 μžˆμ§€ μ•Šμ„κΉŒ.

πŸ’œ μ‚¬μš©μžκ°€ μž…λ ₯ν•œ 글을 λ³€μˆ˜μ— μ €μž₯ν•˜κΈ°

🀍 μ‚¬μš©μžκ°€ input 에 μž…λ ₯ν•œ 데이터λ₯Ό state 둜 μ €μž₯ν•˜κΈ°

  • μ‚¬μš©μžκ°€ input 에 μž…λ ₯ν•œ λ°μ΄ν„°λŠ” μ€‘μš”ν•œ 데이터이기 λ•Œλ¬Έμ— state 에 μ €μž₯ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 게 μΌλ°˜μ μ΄λ‹€.
let [input, setInput] = useState('');
  • λ”°λΌμ„œ useState() λ₯Ό μ‚¬μš©ν•˜μ—¬ state λ₯Ό ν•˜λ‚˜ λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.
  • input νƒœκ·Έμ˜ μ΄ˆκΈ°κ°’μ€ κ³΅λž€μ΄λ―€λ‘œ λ”°μ˜΄ν‘œλ‘œ 빈 λ¬Έμžμ—΄μ„ ν‘œν˜„ν•΄μ£Όμ—ˆλ‹€.

🀍 μ‚¬μš©μžκ°€ input 에 μž…λ ₯ν•œ κ°’ μ•Œμ•„λ‚΄μ–΄ state 에 μ €μž₯해보기

function App() {

  let [input, setInput] = useState('');
  
  return (
    <div className="App">
        <input onChange={ (e)=>{ setInput(e.target.value) } } />    
    </div>
  );
}
  • input 에 μž…λ ₯ν•œ 값을 μ•Œκ³  μ‹Άλ‹€λ©΄ input 에 onChange λΌλŠ” μ΄λ²€νŠΈν•Έλ“€λŸ¬λ₯Ό λΆ™μ—¬μ„œ μ‚¬μš©ν•˜λ©΄ λœλ‹€.
  • 일반적으둜 onChange λŠ” input 에 무언가λ₯Ό μž…λ ₯ν•  λ•Œλ§ˆλ‹€ νŠΉμ • ν•¨μˆ˜λ₯Ό λ™μž‘μ‹œν‚€κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.
  • e.target 은 μ§€κΈˆ μ΄λ²€νŠΈκ°€ λ™μž‘ν•˜κ³  μžˆλŠ” HTML μš”μ†Œ 즉, μ—¬κΈ°μ„œλŠ” input 을 μ˜λ―Έν•˜λ―€λ‘œ e.target.value λŠ” input 에 μž…λ ₯ν•œ 값이 λ˜λŠ” 것이닀.
  • λ”°λΌμ„œ μœ„ μ½”λ“œλ₯Ό ν•΄μ„ν•˜μžλ©΄ input 에 무언가λ₯Ό μž…λ ₯ν•  λ•Œλ§ˆλ‹€ input 에 μž…λ ₯ν•œ 값을 setInput() 에 λ„£μ–΄μ„œ input 의 값을 λ³€κ²½ν•˜μ—¬ μ €μž₯ν•΄λ‹¬λΌλŠ” 말이 λœλ‹€. 
  • μ΄λŸ¬ν•œ 방법은 <input> 외에도 <textarea>, <select> 등에도 μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

πŸ’œ λΈ”λ‘œκ·Έ κΈ€λ°œν–‰ κΈ°λŠ₯ λ§Œλ“€κΈ°

🀍 UI λ””μžμΈν•΄λ³΄κΈ°

<div className='publish'>
    <input onChange={ (e)=>{ setInput(e.target.value) } } />
    <button>λ“±λ‘ν•˜κΈ°</button>
</div>

 

.publish {
	margin: 20px 0;
}

.publish input {
	width: 80%;
	height: 25px;
	font-size: 18px;
	padding: 10px 15px;
	border-radius: 5px;
	border: 1px solid grey;
	background: #eee;
}

.publish input:focus {
	outline: none;
}

.publish button {
	padding: 13px 30px;
}

.publish button:hover {
	background: lightcoral;
	color: white;
	transition: all 0.5s;
	transform: scale(1.05);
}
  • κΈ€λ°œν–‰μ„ μœ„ν•΄ λ¨Όμ € 글을 적을 수 μžˆλŠ” UI λ₯Ό λ§Œλ“€μ–΄λ³΄μ•˜λ‹€.
  • 크게 λ””μžμΈν•  ν•„μš”λŠ” μ—†κ³ , input κ³Ό button 만 λ„£κ³  κ°„λ‹¨ν•œ 효과만 μ£Όμ—ˆλ‹€.

🀍 λΈ”λ‘œκ·Έ κΈ€λ°œν–‰ κΈ°λŠ₯ λ§Œλ“€κΈ°

// 전체 μ½”λ“œ 미리보기
// 전체 μ½”λ“œκ°€ λ„ˆλ¬΄ κΈΈμ–΄μ„œ λΆˆν•„μš”ν•œ μ½”λ“œλŠ” μ œμ™Έν–ˆλ‹€.

function App() {

  let [title, setTitle] = useState([
      '[React] React μ„€μΉ˜μ™€ κ°œλ°œν™˜κ²½ μ…‹νŒ…ν•˜κΈ°', 
      '[React] JSX λ₯Ό μ΄μš©ν•΄ HTML νŽ˜μ΄μ§€ μ œμž‘ν•΄λ³΄κΈ°', 
      '[React] React μ—μ„œ state 변경해보기'
  ]);
  
  let [thumbsUp, setThumbsUp] = useState([0, 0, 0]);

  let [clickedNum, setClickedNum] = useState(0);
 
  let [input, setInput] = useState('');
  
function addTitle(input) {
    let newTitle = [...title];
    newTitle.unshift(input);
    setTitle(newTitle);
}

  return (
    <div className="App">

      {
        title.map(function(content, idx){
          return (
          <div className='list' key={idx}>
            <h3 onClick={()=>{setClickedNum(idx)}}>
                {content}
                <span className='thumbs-up' onClick={ ()=>{ changeThumbsUp(idx) } }>πŸ‘</span> 
                {thumbsUp[idx]} 
            </h3>
            <p>2022-03-18</p>
            <hr/>
          </div>            
          )
        })
      }

      <div className='publish'>
        <input onChange={ (e)=>{ setInput(e.target.value) } } />
        <button onClick={()=>{addTitle(input)}}>λ“±λ‘ν•˜κΈ°</button>
      </div>
      
    </div>
  );
}
  • κΈ€λ°œν–‰ κΈ°λŠ₯μ΄λž€, input 에 μ‚¬μš©μžκ°€ κ²Œμ‹œκΈ€ λ‚΄μš©μ„ μž‘μ„±ν•œ 후에 'λ“±λ‘ν•˜κΈ°' λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ κ²Œμ‹œκΈ€ 리슀트 쀑 맨 μœ„ κ²Œμ‹œκΈ€λ‘œ μž‘μ„±ν•œ κ²Œμ‹œκΈ€ λ‚΄μš©μ΄ 등둝이 λ˜λŠ” 것이닀.
  • κ²Œμ‹œκΈ€ λ¦¬μŠ€νŠΈμ— μ‚¬μš©μžκ°€ μž‘μ„±ν•œ κ²Œμ‹œκΈ€μ΄ μΆ”κ°€λ˜λ €λ©΄ title μ΄λΌλŠ” state 에 μ €μž₯된 array 에 input 에 μž…λ ₯ν•œ λ‚΄μš©μ„ 맨 첫 μš”μ†Œλ‘œ μΆ”κ°€ν•΄μ£Όλ©΄ λœλ‹€.
<button onClick={()=>{addTitle(input)}}>λ“±λ‘ν•˜κΈ°</button>
  • μ΄λŠ” button νƒœκ·Έμ˜ onClick 속성에 λ°”λ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ£Όμ–΄λ„ λ˜μ§€λ§Œ 가독성을 μœ„ν•΄ λ”°λ‘œ addTitle() ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄μ£Όκ³  input state λ₯Ό input μ΄λΌλŠ” νŒŒλΌλ―Έν„°λ‘œ λ„£μ–΄μ£Όμ—ˆλ‹€.
function addTitle(input) {
    let newTitle = [...title];
    newTitle.unshift(input);
    setTitle(newTitle);
}
  • addTitle() ν•¨μˆ˜λŠ” μœ„μ™€ 같이 λ§Œλ“€μ–΄μ£Όμ—ˆλ‹€.
  • λ¨Όμ € title μ΄λΌλŠ” state 에 μ €μž₯된 array λ₯Ό κΉŠμ€ 볡사λ₯Ό ν•΄μ„œ newTitle μ΄λΌλŠ” 사본을 λ§Œλ“ λ‹€.
  • λ§Œλ“€μ–΄μ§„ 사본인 newTitle array 에 unshift() λ₯Ό μ‚¬μš©ν•˜μ—¬ νŒŒλΌλ―Έν„°λ‘œ λ°›μ•„μ˜¨ input 을 newTitle array 의 맨 처음 μš”μ†Œλ‘œ μ‚½μž…ν•΄μ€€λ‹€.
  • κ·Έλ ‡κ²Œ λ§Œλ“€μ–΄μ§„ newTitle array λ₯Ό setTitle() ν•¨μˆ˜μ— λ„£μ–΄μ„œ title μ΄λΌλŠ” state 에 μ €μž₯된 array λ₯Ό newTitle array 둜 ꡐ체해쀀닀.
  • 이제 input 에 μž…λ ₯ν–ˆλ˜ λ‚΄μš©μ΄ title μ΄λΌλŠ” state 에 μΆ”κ°€κ°€ 되고, map() ν•¨μˆ˜λ₯Ό ν†΅ν•΄μ„œ λ Œλ”λ§λ˜κ³  λΈŒλΌμš°μ € 화면에 보이게 λœλ‹€. 

 

728x90
λ°˜μ‘ν˜•