[React #27] ToDo List - Create

반응형

📌임시 데이터 생성

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) : 기초부터 실전까지'
반응형