jineecode

concat 활용하기 본문

JS/react

concat 활용하기

지니코딩 2021. 11. 8. 10:53

Array.prototype.concat()

concat() 메서드는 인자로 주어진 배열이나 값들을 기존 배열에 합쳐서 새 배열을 반환합니다. 

 

이를 이용하여 setState에 새로운 배열을 넣어 불변성을 유지합니다.

 

import React, { useState, useRef, useCallback } from "react";
import "./App.css";
import TodoTemplate from "./components/TodoTemplate";
import TodoInsert from "./components/TodoInsert";
import TodoList from "./components/TodoList";

function App() {
  const [todos, setTodos] = useState([
    {
      id: 1,
      text: "리액트의 기초 알아보기",
      checked: true,
    },
    {
      id: 2,
      text: "컴포넌트 스타일링해 보기",
      checked: true,
    },
    {
      id: 3,
      text: "일정 관리 앱 만들어 보기",
      checked: false,
    },
  ]);

  const nextId = useRef(4);
  const onInsert = useCallback(
    (text) => {
      const todo = {
        id: nextId.current,
        text,
        checked: false,
      };
      setTodos(todos.concat(todo));
      nextId.current += 1;
    },
    [todos]
  );
  return (
    <TodoTemplate>
      <TodoInsert onInsert={onInsert}/>
      <TodoList todos={todos} />
    </TodoTemplate>
  );
}

export default App;

onInsert로 콜백이 실행되면, 

todo에 객체 만들고,

 

setTodos(todos.concat(todo));

 

하면 불변성이 유지된다. 

 

더불어,

 

nextId.current += 1 

 

을 처리해서 Ref을 따로 준다.

 

import React, { useState, useCallback } from "react";

const TodoInsert = ({ onInsert }) => {
  const [value, setValue] = useState("");
  const onChange = useCallback((e) => {
    setValue(e.target.value);
  }, []);

  const onSubmit = useCallback((e) => {
    onInsert(value);
    setValue("");
    e.preventDefault();
  });

  return (
    <form onSubmit={onSubmit}>
      <input
        placeholder="할일을 입력하세요"
        value={value}
        onChange={onChange}
      />
      <button type="submit">제출</button>
    </form>
  );
};

export default TodoInsert;

 

'JS > react' 카테고리의 다른 글

Next.js 세팅  (0) 2021.11.19
next 위에서 i18next 적용하기  (1) 2021.11.17
react 위에서 i18next 적용하기  (0) 2021.09.01
SPA 환경에서 구글 태그 관리자 넣기  (0) 2021.09.01
React Native 기본 원리  (0) 2021.06.19
Comments