본문 바로가기
개인 공부/게시판

5. 카테고리, 작성 날짜

by 갱생angel 2024. 1. 31.

카테고리 별로 일기 표시, 작성한 날짜와 시간을 표시

※select, option 태그로 카테고리를 분류 (미분류, 일상, 공부, 여행, 게임)

※일기 작성 시 입력 칸 비어있고, 카테고리가 지정되어있지(미분류) 않을 시 경고문 출력

※각 일기마다 name(value)를 지정해서 카테고리를 분류

※일기를 작성한 날짜를 표시

※각 카테고리 버튼을 클릭 시 각 카테고리에 속한 일기만 보여줌

 

component

  -Input.JSX

  -Button.JSX

  -Textarea.JSX

  -DiaryWrite.JSX

  -DiaryBlock.JSX

  -Category.JSX

  -CategoryButton.JSX

module

  -Diary.JSX

css

  -Diary.css

  -Category.css

 

component - <Category.JSX> : select, option 태그로 카테고리를 분류

import React from 'react'

function Category({value, onChange}) {
  return (
    <div>
      <select className="categorySelect" value={value} onChange={onChange}>
        <option value="none">--------</option>
        <option value="routine">일상</option>
        <option value="study">공부</option>
        <option value="travel">여행</option>
        <option value="game">게임</option>
      </select>
    </div>
  )
}

export default Category

카테고리를 5가지(미분류, 일상, 공부, 여행, 게임)로 분류

 

component - <DiaryWrite.JSX> : 입력 칸 여부 확인, 각 일기마다 name(value) 지정

import React, {useState} from 'react'
import '../css/Diary.css'
import Input from './Input'
import Textarea from './Textarea'
import Button from './Button'
import Category from './Category'

function DiaryWrite({addDiary, categoryValue, changeCategory}) {
  const [diaryInput, setDiaryInput] = useState({
    title: '',
    content: ''
  })

  const changeInput = event => {
    setDiaryInput({
      ...diaryInput,
      [event.target.name]: event.target.value
    })
  }

  const submitDiary = event => {
    event.preventDefault()
    if ( //입력이 되어있지 안흘 경우 경고문 표시
      diaryInput.title === (null || undefined || '') ||
      diaryInput.content === (null || undefined || '')
    ) {
      alert('제대로 입력해주세요.')
    } else {
      addDiary(diaryInput.title, diaryInput.content)
      setDiaryInput({
        title: '',
        content: ''
      })
    }
  }

  return (
    <div className="writeDiv">
      <h1 className="writeMain">Today Diary</h1>
      <form>
        <div> //일기 작성 시 각각 name(value)을 지정해 줌
          <label>카테고리</label>
          <Category value={categoryValue} onChange={changeCategory} />
        </div>
        <div className="writeTitleDiv">
          <label>제목</label>
          <Input
            className={'writeTitleInput'}
            type={'text'}
            name={'title'}
            value={diaryInput.title}
            onChange={changeInput}
          />
        </div>
        <div className="writeContentDiv">
          <label>내용</label>
          <Textarea
            className={'writeContentTextarea'}
            name={'content'}
            value={diaryInput.content}
            onChange={changeInput}
          />
        </div>
        <Button
          className={'submitButton'}
          type={'submit'}
          name={'저장'}
          onClick={submitDiary}
        />
      </form>
    </div>
  )
}

export default DiaryWrite

각 일기마다 name 값을 지정

 

component - <DiaryBlock.JSX> : 작성 날짜 props 지정

import React, {useState} from 'react'
import '../css/Diary.css'
import Button from './Button'
import Textarea from './Textarea'

function DiaryBlock({title, content, id, name, date, deleteDiary, editDiary}) {
  const [editBool, setEditBool] = useState(true)
  const [editValue, setEditValue] = useState(content)

  const changeEditValue = event => {
    setEditValue(event.target.value)
  }

  const handleDelete = () => {
    deleteDiary(id)
  }

  const handleEdit = () => {
    if (editBool === true) {
      setEditBool(false)
    } else {
      setEditBool(true)
      editDiary(id, editValue)
    }
  }

  return (
    <div className="blockDiv" key={id} name={name}>
      <div className="blockTitleDiv">
        <h3 className="blockTitle">{title}</h3>
        <Button className={'deleteButton'} onClick={handleDelete} name={'삭제'} />
        <Button
          className={'editButton'}
          onClick={handleEdit}
          name={editBool ? '수정' : '적용'}
        />
      </div>
      <div className="blockDateDiv">
        <p>{date}</p> //작성 날짜 props 지정
      </div>
      <p>
        ---------------------------------------------------------------------------------------------
      </p>
      {editBool ? (
        <p>{content}</p>
      ) : (
        <Textarea
          className={'writeContentTextarea'}
          value={editValue}
          onChange={changeEditValue}
        />
      )}
    </div>
  )
}

export default DiaryBlock

작성한 연도, 월, 일, 시간 표시

 

component - <CategoryButton.JSX> : 각 카테고리 버튼을 클릭 시 각 카테고리에 속한 일기만 보여줌

import React from 'react'
import '../css/Category.css'
import Button from '../component/Button'

function CategoryButton({
  allDivDiaryBtn,
  routineDivDiaryBtn,
  studyDivDiaryBtn,
  travelDivDiaryBtn,
  gameDivDiaryBtn
}) {
  return (
    <div className="categoryButtonDiv">
      <Button className="categoryButton" name={'전체'} onClick={allDivDiaryBtn} />
      <Button className="categoryButton" name={'일상'} onClick={routineDivDiaryBtn} />
      <Button className="categoryButton" name={'공부'} onClick={studyDivDiaryBtn} />
      <Button className="categoryButton" name={'여행'} onClick={travelDivDiaryBtn} />
      <Button className="categoryButton" name={'게임'} onClick={gameDivDiaryBtn} />
    </div>
  )
}

export default CategoryButton

카테고리 분류 버튼

 

module - <Diary.JSX>

import React, {useEffect, useRef, useState} from 'react'
import DiaryWrite from '../component/DiaryWrite'
import DiaryBlock from '../component/DiaryBlock'
import CategoryButton from '../component/CatogoryButton'

function Diary() {
  const [diary, setDiary] = useState(JSON.parse(localStorage.getItem('Diary')) || [])
  const [categoryDiary, setCategoryDiary] = useState(diary) //각 카테고리 별로 보여줄 일기 목록
  const [categoryValue, setCategoryValue] = useState('none') //카테고리 종류 기본값을 미분류로 지정

  const diaryKey = useRef(parseInt(localStorage.getItem('DiaryKey')) || 0)

  const changeCategoryValue = event => { //select 카테고리 값 지정
    setCategoryValue(event.target.value)
  }

  const addDiary = (title, content) => {
    if (categoryValue === 'none') { //카테고리를 지정하지 않았을 시 경고창 출력
      alert('카테고리를 지정해주세요.')
    } else {
      const newDiary = {
        title,
        content,
        name: categoryValue,
        id: diaryKey.current,
        date: new Date().toLocaleString() //일기 작성 날짜
      }
      diaryKey.current += 1
      setDiary([newDiary, ...diary])
      setCategoryValue('none')
    }
  }

  const deleteDiary = id => {
    const remainDiary = diary.filter(remove => remove.id !== id)
    setDiary(remainDiary)
  }

  const editDiary = (id, editContent) => {
    setDiary(diary.map(edit => (edit.id === id ? {...edit, content: editContent} : edit)))
  }

  const allDivDiaryBtn = () => { //일기 전체 보여줌
    setCategoryDiary(diary)
  }

  const routineDivDiaryBtn = () => { //일상 카테고리 일기만 보여줌
    const routineDiary = diary.filter(divide => divide.name === 'routine')
    setCategoryDiary(routineDiary)
  }

  const studyDivDiaryBtn = () => { //공부 카테고리 일기만 보여줌
    const studyDiary = diary.filter(divide => divide.name === 'study')
    setCategoryDiary(studyDiary)
  }

  const travelDivDiaryBtn = () => { //여행 카테고리 일기만 보여줌
    const travelDiary = diary.filter(divide => divide.name === 'travel')
    setCategoryDiary(travelDiary)
  }

  const gameDivDiaryBtn = () => { //게임 카테고리 일기만 보여줌
    const gameDiary = diary.filter(divide => divide.name === 'game')
    setCategoryDiary(gameDiary)
  }

  useEffect(() => {
    localStorage.setItem('Diary', JSON.stringify(diary))
    localStorage.setItem('DiaryKey', parseInt(diaryKey.current))
    setCategoryDiary(diary) //분류된 카테고리를 새로고침 없이 즉시 보여줌
  }, [diary])

  return (
    <div>
      <div>
        <DiaryWrite
          addDiary={addDiary}
          categoryValue={categoryValue}
          changeCategory={changeCategoryValue}
        />
      </div>
      <div>
        <CategoryButton
          allDivDiaryBtn={allDivDiaryBtn}
          routineDivDiaryBtn={routineDivDiaryBtn}
          studyDivDiaryBtn={studyDivDiaryBtn}
          travelDivDiaryBtn={travelDivDiaryBtn}
          gameDivDiaryBtn={gameDivDiaryBtn}
        />
        {categoryDiary.map(diaryData => {
          return (
            <DiaryBlock
              key={diaryData.id}
              name={diaryData.name}
              date={diaryData.date}
              {...diaryData}
              deleteDiary={deleteDiary}
              editDiary={editDiary}
            />
          )
        })}
      </div>
    </div>
  )
}

export default Diary

 

일기 작성 시 입력 칸 비어있고, 카테고리가 지정되어있지(미분류) 않을 시 경고문 출력

 

각 카테고리 버튼을 클릭 시 각 카테고리에 속한 일기만 보여줌

 

Category.css

.categorySelect {
  width: 400px;
  height: 30px;
}

.categoryButtonDiv {
  display: flex;
  justify-content: flex-start;
  align-items: center;
}

.categoryButton {
  margin-top: 10px;
  margin-right: 20px;
  padding: 5px 15px 5px 15px;
  background-color: white;
}

'개인 공부 > 게시판' 카테고리의 다른 글

7. 페이지 구성  (0) 2024.02.13
6. 모달 창 구현  (0) 2024.02.10
4. EditDiary  (0) 2024.01.29
3. DeleteDiary, diaryKey 값 유지  (0) 2024.01.29
2. AddDiary  (0) 2024.01.29