React

[React #27] ToDo List - Create

PEAZH 2024. 3. 14. 17:00
반응형

📌임시 데이터 생성

const mokData = [
  {
    id: 0,
    isDone: false,
    content: '리액트 공부',
    date: new Date().getTime(),
  },
  {
    id: 1,
    isDone: false,
    content: '치과',
    date: new Date().getTime(),
  },
  {
    id: 2,
    isDone: false,
    content: '운동하기',
    date: new Date().getTime(),
  },
  {
    id: 3,
    isDone: false,
    content: '장보기',
    date: new Date().getTime(),
  },
];

📌리스트 추가하기

App.jsx

import { useState, useRef } from 'react';
import './App.css';
import Header from './components/Header';
import Editor from './components/Editor';
import List from './components/List';

function App() {
  const [todos, setTodos] = useState(mokData);
  const idRef = useRef('4');

  const onCreate = (content) => {
    const newTodo = {
      id: idRef.current++,
      isDone: false,
      content: content,
      date: new Date().getTime(),
    };
    setTodos([newTodo, ...todos]);
  };

  return (
    <div className='App'>
      <Header />
      <Editor onCreate={onCreate} />
      <List />
    </div>
  );
}

export default App;
  • state의 값은 반드시 상태 변화 함수를 호출해야 수정할 수 있음

Editor.jsx

import { useState } from 'react';

function Editor({ onCreate }) {

  const [input, setInput] = useState('');

  const onChange = (e) => {
    setInput(e.target.value);
  };
  
  const onSubmit = () => {
    onCreate(input);
  };

  return (
    <div className='Editor'>
      <input value={input} onChange={onChange} placeholder='새로운 Todo...' />
      <button onClick={onSubmit}>추가</button>
    </div>
  );
}

export default Editor;

 


📌완성한 Create를 Develop하기

빈 항목일 때

입력칸에 아무것도 없을 때 '추가' 버튼을 누른다면 추가하지 않고 해당 입력칸 포커스 주기

// 새로운 래퍼런스 객체 생성
const inputRef = useRef();

const onSubmit = () => {
	// 조건문
    if (input === '') {
      inputRef.current.focus();
      return;
    }
    onCreate(input);
};

// 속성 추가
<input ref={inputRef}/>
  • 새로운 래퍼런스를 생성한 뒤 input 속성에 ref를 추가함
  • state인 input의 값이 비어있다면 inputRef값에 포커스 한 뒤 리턴함

값을 입력했을 때

새로운 값을 또 입력하기 위해서 데이터로 잘 들어간 값은 지워주기

onCreate(input);
setInput('');
  • onSubmit() 함수가 실행되었을 때 onCreate() 함수를 호출한 뒤 state를 빈 문자열로 초기화 하기

엔터키를 입력했을 때

키보드에 'enter'를 입력해도 리스트 추가하기

const onKeyDown = (e) => {
    if (e.keyCode === 13) {
      onSubmit();
}
    
<input onKeyDown={onKeyDown}/>
  • input의 키보드를 눌렀을 때 이벤트를 발생하는 onKeyDown 속성 추가하기
  • enter의 keyCode인 13번이 들어왔을 때 onCreate() 함수를 호출하기

📌최종코드

App.jsx

import { useState, useRef } from 'react';
import './App.css';
import Header from './components/Header';
import Editor from './components/Editor';
import List from './components/List';

const mokData = [
  {
    id: 0,
    isDone: false,
    content: '리액트 공부',
    date: new Date().getTime(),
  },
  {
    id: 1,
    isDone: false,
    content: '치과',
    date: new Date().getTime(),
  },
  {
    id: 2,
    isDone: false,
    content: '운동하기',
    date: new Date().getTime(),
  },
  {
    id: 3,
    isDone: false,
    content: '장보기',
    date: new Date().getTime(),
  },
];

function App() {
  const [todos, setTodos] = useState(mokData);
  const idRef = useRef('4');

  const onCreate = (content) => {
    const newTodo = {
      id: idRef.current++,
      isDone: false,
      content: content,
      date: new Date().getTime(),
    };
    setTodos([newTodo, ...todos]);
  };

  return (
    <div className='App'>
      <Header />
      <Editor onCreate={onCreate} />
      <List />
    </div>
  );
}

export default App;

Editor.jsx

import { useRef, useState } from 'react';

function Editor({ onCreate }) {
  const [input, setInput] = useState('');
  const inputRef = useRef();

  const onChange = (e) => {
    setInput(e.target.value);
  };

  const onSubmit = () => {
    if (input === '') {
      inputRef.current.focus();
      return;
    }

    onCreate(input);
    setInput('');
  };

  const onKeydonwn = (e) => {
    if (e.keyCode === 13) {
      onSubmit();
    }
  };

  return (
    <div className='Editor'>
      <input
        value={input}
        ref={inputRef}
        onChange={onChange}
        onKeyDown={onKeydonwn}
        placeholder='새로운 Todo...'
      />
      <button onClick={onSubmit}>추가</button>
    </div>
  );
}

export default Editor;

 

 

참고자료

이정환 Winterlood, '한입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지'
반응형