ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 13. 배열에 항목 추가하기 - 리액트 입문 | 벨로퍼트
    Front-end/React.js 2020. 6. 29. 20:18
    반응형

     

    이번에는 배열에 새로운 항목을 추가하는 방법을 알아보겠습니다.

     

    우선, input 두개와 button 하나로 이루어진 CreateUser.js 라는 컴포넌트를 src 디렉터리에 만들어봅시다.

    /src/CreateUser.js :

    import React from 'react';
    
    function CreateUser({ username, email, onChange, onCreate }) {
      return (
        <div>
          <input name="username" placeholder="계정명" onChange={onChange} value={username}/>
          <input name="email" placeholder="이메일" onChange={onChange} value={email}/>
          <button onClick={onCreate}>등록</button>
        </div>
      );
    }
    
    export default CreateUser;

    이번 컴포넌트에서는 상태관리를 CreateUser 에서 하지 않고 부모 컴포넌트인 App 에서 하게 하고, input 의 값 및 이벤트로 등록할 함수들을 props 로 넘겨받아서 사용해주겠습니다.

     

    이 컴포넌트를 App 에서 UserList 위에 렌더링해보세요.

    /src/App.js : 

    import React, { useRef } from 'react';
    import UserList from './UserList';
    import CreateUser from './CreateUser';
    
    function App() {
      const userInfo = [
        ...
      ];
    
      const nextId = useRef(4);
      const onCreate = () => {
    	...
      };
      return (
        <>
          <CreateUser />
          <UserList users={userInfo} />
        </>
      );
    }
    
    export default App;

    CreateUser 컴포넌트에게 필요한 props 를 App 에서 준비해주겠습니다.

    /src/App.js : 

    import React, { useRef, useState } from 'react';
    import UserList from './UserList';
    import CreateUser from './CreateUser';
    
    function App() {
      const [inputs, setInputs] = useState({
        username: '',
        email: ''
      });
      const { username, email } = inputs;
      const onChange = e => {
        const { name, value } = e.target;
        setInputs({
          ...inputs,
          [name]: value
        });
      };
      
      const userInfo = [
        ...
      ];
    
      const nextId = useRef(4);
      const onCreate = () => {
        setInputs({
          username: '',
          email: ''
        });
        nextId.current += 1;
      };
      return (
        <>
          <CreateUser username={username} email={email} onChange={onChange} onCreate={onCreate}/>
          <UserList users={userInfo} />
        </>
      );
    }

    코드를 작성 후, input 에 값을 입력하고, 등록 버튼을 눌렀을 때 input 값들이 잘 초기화되는지 확인해보세요.

     

    그 다음에는, users 도 useState 를 사용하여 컴포넌트의 상태로서 관리해주세요.

    /src/App.js : 

    function App() {
      ...
      const [userInfo, setUserInfo] = useState([
        {
          id: 1,
          username: 'velopert',
          email: 'public.velopert@gmail.com'
        },
        {
          id: 2,
          username: 'tester',
          email: 'tester@example.com'
        },
        {
          id: 3,
          username: 'liz',
          email: 'liz@example.com'
        }
      ]);
    
      const nextId = useRef(4);
      const onCreate = () => {
        ...
      };
      return (
        ...
      );
    }

    이제 배열에 변화를 줄 차례입니다. 배열에 변화를 줄 때에는 객체와 마찬가지로, 불변성을 지켜주어야 합니다. 그렇기 때문에, 배열의 push, splice, sort 등의 함수를 사용하면 안됩니다. 만약에 사용해야 한다면, 기존의 배열을 한번 복사하고 나서 사용해야합니다.

     

    불변성을 지키면서 배열에 새 항목을 추가하는 방법은 두가지가 있습니다.

     

    첫 번째,  spread 연산자 사용

    /src/App.js : 

    function App() {
      ...
      const [userInfo, setUserInfo] = useState([
        ...
      ]);
    
      const nextId = useRef(4);
      const onCreate = () => {
        const user = {
          id: nextId.current,
          username,
          email
        };
        setUserInfo([...userInfo, user]);
        ...
      };
      return (
        ...
      );
    }

    두 번째, concat 함수 사용

    concat 함수는 기존의 배열을 수정하지 않고, 새로운 원소가 추가된 새로운 배열을 만들어줍니다.

     

    function App() {
      ...
      const [userInfo, setUserInfo] = useState([
        ...
      ]);
    
      const nextId = useRef(4);
      const onCreate = () => {
        const user = {
          id: nextId.current,
          username,
          email
        };
        setUserInfo(userInfo.concat(user));
        ...
      };
      return (
        ...
      );
    }

    배열에 새 항목을 추가 할 때에는 이렇게 spread 연산자를 사용하거나, concat 을 사용하시면 됩니다.

    반응형

    댓글

Luster Sun