[React #26] ToDo List - UI 구현

    반응형

    🩷Header

    Header.jsx

    function Header() {
      return (
        <div className='Header'>
          <h3>오늘은 📅</h3>
          <h1>{new Date().toDateString()}</h1>
        </div>
      );
    }
    
    export default Header;
    • Date 객체 생성할 때 toDateString() 메서드를 호출하여 문자열로 읽기 편한 형태로 변환

    Header.css

    .Header > h1 {
      color: rgb(37, 147, 255);
    }

    🩷Editor

    Editor.jsx

    function Editor() {
      return (
        <div className='Editor'>
          <input placeholder='새로운 Todo...' />
          <button>추가</button>
        </div>
      );
    }
    
    export default Editor;

    Editor.css

    .Editor {
      display: flex;
      gap: 10px;
    }
    
    .Editor > input {
      flex: 1;
      padding: 15px;
      border: 1px solid rgb(220, 220, 220);
      border-radius: 5px;
    }
    
    .Editor > button {
      cursor: pointer;
      width: 80px;
      border: none;
      background-color: rgb(37, 147, 255);
      color: white;
      border-radius: 5px;
    }
    • flex의 속성을 1로 설정하면 부모 요소의 크기를 벗어나지 않는 선에서 최대의 길이만큼 늘어남

    🩷List

    List.jsx

    function List() {
      return (
        <div className='List'>
          <h4>ToDo List</h4>
          <input placeholder='검색어를 입력해 주세요.' />
        </div>
      );
    }
    
    export default List;

    List.css

    .List {
      display: flex;
      flex-direction: column;
      gap: 20px;
    }
    
    .List input {
      width: 100%;
      border: none;
      border-bottom: 1px solid rgb(220, 220, 220);
      padding: 15px 0px;
    }
    
    .List input:focus {
      outline: none;
      border-bottom: 1px solid rgb(37, 147, 255);
    }
    
    .List .todos_warpper {
      display: flex;
      flex-direction: column;
      gap: 20px;
    }
    • input:focus는 input창에 포커스 되었을 때 효과를 줄 수 있음

    🩷TodoItem

    TodoItem.jsx

    function TodoItem() {
      return (
        <div className='TodoItem'>
          <input type='checkbox' />
          <div className='content'>Todo</div>
          <div className='date'>Date</div>
          <button>삭제</button>
        </div>
      );
    }
    
    export default TodoItem;

    TodoItem.css

    .TodoItem {
      display: flex;
      align-items: center;
      gap: 20px;
      padding-bottom: 20px;
      border-bottom: 1px solid rgb(240, 240, 240);
    }
    
    .TodoItem > input {
      width: 20px;
    }
    
    .TodoItem .content {
      flex: 1;
    }
    
    .TodoItem .date {
      font-size: 14px;
      color: gray;
    }
    
    .TodoItem button {
      cursor: pointer;
      color: gray;
      font-size: 14px;
      border: none;
      border-radius: 5px;
      padding: 5px;
    }

     


    🩷실행화면

    실행화면

     

     

    참고자료

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

     

    반응형

    댓글