⚛️ React/문제풀기 (코딩애플: React)

React : input에 글 쓰면 게시글 추가하기 (onChange, 매개변수, trim, splice)

Zoeeey 2023. 5. 11. 12:45

input에 글 쓰면 게시글 추가하기

조건

input에 텍스트를 넣고 발행버튼을 클릭하면 게시글 목록 상단에 추가된다.
아무 텍스트도 입력하지 않았다면 발행을 막는다.


풀이

let [input, setInput] = useState('');
let handleSubmit = (e) => {
  e.preventDefault();
  if (input.trim() !== ""){
    let copyTitle = [...title];
    copyTitle.unshift(input);
    setTitle(copyTitle);
  } else {alert(`글제목을 입력하세요.`)}
}
return (
    <div className="App">
      { 
        title.map(function(a,i){
          return (
            <div className="list" key={i}>
                <h4>{ title[i] }</h4>
                <button onClick={(i) => handlesetLike(i)}>👍  { like[i] }</button>
                <button onClick={()=>{ modal ? setModal(false) : (setModal(true),setTitleIndex(i)) } }>🗨</button>
                <p>2월 18일 발행</p>
              </div>
          );
        }) 
      }
      <input id='title' name='title' type="text" onChange={ (e)=> setInput(e.target.value) }/>
      <button type="submit" onClick={ handleSubmit }>발행</button>
    </div>
  );

알게 된 점 1

input태그에 onChange는 텍스트를 한글자씩 타자칠때마다 바뀌는건데 그걸 setInput 해버리면 한글자씩 다 배열에 들어가버리지 않을까? 생각했지만,
당연히 아니었다. input state는 애초에 배열이 아닌 ' ' 문자열로 세팅되어 있었고, handleSubmit 되는 시점도 발행 버튼을 누르는 시점이기 때문이다.
생각을 좀더 가볍게 할 필요가 있따.

알게 된 점 2

빈 문자열을 검사하려면 trim()을 쓰면 된다.


게시글 삭제하기

조건

삭제 버튼을 누르면 해당 게시글이 삭제된다.


풀이

let handleDelete = (i, e) => {
  e.preventDefault();
  let copyTitle = [...title];
  copyTitle.splice(i, 1);
  setTitle(copyTitle);
}
title.map(function(a,i){
  return (
    <div className="list" key={i}>
      <h4>{ title[i] }</h4>
      <button onClick={() => handlesetLike(i)}>👍  { like[i] }</button>
      <button onClick={()=>{ modal ? setModal(false) : (setModal(true),setTitleIndex(i)) } }>🗨</button>
      <button onClick={(e) => handleDelete(i,e) }>삭제</button>
      <p>2월 18일 발행</p>
    </div>
  );
})

코드는 다 짜놓고 매개변수를 잘못 넣어서 고생했다.


알게 된 점 1

i는 map 메서드가 호출될 때 자동으로 제공되므로, map 함수 내에서 i를 매개변수로 별도 지정할 필요가 없다. (배열이기 때문이다. 이를 "콜백 함수 인자"라고 한다고..)

알게 된 점 2

그에 반해 e는 매개변수로 지정해주어야 한다. onClick 함수는 자체적으로 이벤트 객체를 생성한다. handleDelete 함수에서 이벤트 객체에 접근하기 위해서는 onClick 함수에서 이벤트 객체를 받아 handleDelete에 전달해야 하기 때문에, e를 꼭 넣어줘야 했다.


출처 : 코딩애플 https://codingapple.com/