App 컴포넌트에 있는 여러 메소드를 수정해봅시다.


8-1장에서는 우선 handleSubmit, handleRemove 함수 내부 코드를 다 지워놓았고, handleInput 함수는 아예 삭제했었습니다. 이번 장에서는 handleSubmit 함수와 handleRemove 함수를 수정해보겠습니다. 먼저 handleSubmit 함수 먼저 만들어볼 텐데, App 컴포넌트를 아래와 같이 수정해주세요.

import React, { useState } from "react";
import InputBox from "./components/InputBox";
import PhoneList from "./components/PhoneList";
import "./App.css";
import { dummyData, nextId, setNextId } from "./lib/dummyData.js";
import useInput from './lib/useInput';

const App = () => {
  const [data, setData] = useState(dummyData);
  const [name, setName, onChangeName] = useInput("");
  const [phone, setPhone, onChangePhone] = useInput("");

  const handleSubmit = () => {
    if (name === "" || phone === "") return;

    setData({
      ...data,
      [nextId]: {
        id: String(nextId),
        name,
        phone
      }
    });
    setName("");
    setPhone("");

    setNextId();
  };

  const handleRemove = id => {

  };

  return (
    <div className="container">
      <InputBox
        name={name}
        phone={phone}
        onChangeName={onChangeName}
        onChangePhone={onChangePhone}
        onSubmit={handleSubmit}
      />
      <PhoneList list={data} deleteItem={handleRemove} />
    </div>
  );
}

export default App;

먼저, name 값과 phone 값 모두 입력되어있지 않은 상황에서는 전화번호부 목록에 추가되지 않게 한 부분은 동일합니다. 저희가 주목해야 할 부분은 그다음 코드인데요, 먼저 setData 함수 코드 먼저 살펴봅시다. 기존의 코드는 아래와 같이 되어있었습니다.

this.setState({
  dummyData: {
    ...dummyData,
    [nextId]: {
      id: String(nextId),
      name,
      phone
    }
  },
  name: "",
  phone: ""
});

setData 함수는 위의 setState 함수 중에서 dummyData를 설정하는 부분만 따로 가져온 것입니다. 저 Hooks에는 dummyData와 관련된 데이터가 들어있기 때문입니다. 따라서 setData 함수만으로는 전화번호부 목록이 추가된 후에 input 값을 빈값으로 바꿔주지 못합니다. 그래서 setName, setPhone 함수로 빈 값을 설정해줘야 합니다.

다음으로 handleRemove 함수를 수정해봅시다. 아래와 같이 수정해주세요.

import React, { useState } from "react";
import InputBox from "./components/InputBox";
import PhoneList from "./components/PhoneList";
import "./App.css";
import { dummyData, nextId, setNextId } from "./lib/dummyData.js";
import useInput from './lib/useInput';

const App = () => {
  const [data, setData] = useState(dummyData);
  const [name, setName, onChangeName] = useInput("");
  const [phone, setPhone, onChangePhone] = useInput("");

  const handleSubmit = () => {
    if (name === "" || phone === "") return;

    setData({
      ...data,
      [nextId]: {
        id: String(nextId),
        name,
        phone
      }
    });
    setName("");
    setPhone("");

    setNextId();
  };

  const handleRemove = id => {
    const { [id]: _, ...dummyData } = data;

    setData(dummyData);
  };

  return (
    <div className="container">
      <InputBox
        name={name}
        phone={phone}
        onChangeName={onChangeName}
        onChangePhone={onChangePhone}
        onSubmit={handleSubmit}
      />
      <PhoneList list={data} deleteItem={handleRemove} />
    </div>
  );
}

export default App;

이전의 코드와 크게 다르지 않습니다. dummyData가 들어있는 data 변수에서 특정 id 값을 가진 아이템만 빼고, 나머지는 dummyData 객체에 넣어줬습니다. 그리고 setData 함수를 통해 값을 변경해주었습니다.