React

[React] 배열안의 데이터 수정하기

Alexim 2022. 6. 11. 19:38

삭제하기 버튼 옆에 수정하기 버튼을 만들고 일기를 수정할 수 있게 만들어보자.

 

1. 수정하기 버튼 만들기

2. isEdit이라는 state를 만들어 버튼을 클릭했을 때 true가 되고 수정할 수 있는 칸이 나오게 해보자

  const [isEdit, setIsEdit] = useState(false)
  const toggleIsEdit = () => setIsEdit(!isEdit);

toggleIsEdit을 만들어 isEdit을 반전시키는 토글 함수를 만들고 버튼에 onClick 이벤트에 toggleIsEdit을 넣어주자.

 

      <div className="content">
        {isEdit
        ? (
          <>
            <textarea />
          </>
          )
        : {content}}
      </div>
      <button onClick={toggleIsEdit}>수정하기</button>
      <button onClick={handleRemove}>삭제하기</button>

일기가 들어가는 content부분에 삼항연산자를 사용하여 isEdit이 true일 때는 textarea가 뜨고 false일 때는 원래의 콘텐츠가 나오도록 해준다.

 

      <div className="content">
        {isEdit
        ? (<>
            <textarea
              value={localContent}
              onChange={(e) => setLocalContent(e.target.value)}
            />
          </>)
        : {content}}
      </div>
      {isEdit
      ? (<>
          <button onClick={toggleIsEdit}>수정 취소</button>
          <button>수정 완료</button>
        </>)
      : (<>
          <button onClick={toggleIsEdit}>수정하기</button>
          <button onClick={handleRemove}>삭제하기</button>
        </>)}

수정버튼을 클릭했을 때 수정 취소와 수정 완료 버튼이 나오게끔 삼항연산자를 이용해 써주고 "수정하기", "삭제하기" 버튼의 위치를 삼항연산자로 옮겨준다.

 

데이터는 위에서 밑으로 흐르고 이벤트는 밑에서 아래로 흐른다. 수정버튼을 클릭했을 때 수정이 되려면 상단 App에서 data를 수정해주어야 한다.

 

  const onEdit = (targetId, newContent) => {
    setData(
      data.map((it) =>
        it.id === targetId ? {...it, content: newContent} : it)
    )
  }

  return (
    <div className="App">
      <DiaryEditor onCreate={onCreate} />
      <DiaryList onEdit={onEdit} onRemove={onRemove} diaryList={data} />
    </div>
  );

 App.js에서 수정하는 함수 onEdit을 만든다. onEdit은 수정될 대상인 targetId, 수정된 콘텐츠인 newContent를 인자로 받는 함수이다. setData에서 map으로 id가 targetId와 같다면 content를 newContent로 바꿔준다.

 

onEdit을 DiaryList로 전달하고 -> DiaryItem으로 전달

 

<DiaryItem.js>

  const handleEdit = () => {
    if (localContent.length < 5) {
      localContentInput.current.focus();
      return;
    }

    if (window.confirm(`${id}번 째 일기를 수정하시겠습니까?`)) {
      onEdit(id, localContent);
      setIsEdit(false);
    }
  }
          <button onClick={handleEdit}>수정 완료</button>

수정완료 버튼의 onClick에 handleEdit을 넣어주고 콘텐츠의 길이가 5글자 미만이라면 수정칸에 focus가 가도록 하였다.