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

2. AddDiary

by 갱생angel 2024. 1. 29.

일기장을 리스트에 새로 추가

※addDiary 함수 추가

※map 함수를 이용해서 생성되는 일기 블록 나타냄

  -map(): 반복되는 컴포넌트를 렌더링

※useRef 훅으로 일기 key 값 설정

  -useRef : DOM에 접근하기 위해 사용

 

component

  -Input.JSX

  -Button.JSX

  -Textarea.JSX

  -DiaryWrite.JSX

  -DiaryBlock.JSX

module

  -Diary.JSX

css

  -Diary.css

 

coponent - <DiaryWrite.JSX> : addDiary 프롭을 추가해서 Diary.JSX로  입력값 전달

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

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

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

  const submitDiary = event => {
    event.preventDefault()
    addDiary(diaryInput.title, diaryInput.content) //Diary.JSX로 입력값 전달
    setDiaryInput({
      title: '',
      content: ''
    })
  }

  return (
    <div className="writeDiv">
      <h1 className="writeMain">Today Diary</h1>
      <form>
        <div>
          <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

 

coponent - <DiaryBlock.JSX> 

import React from 'react'
import '../css/Diary.css'

function DiaryBlock({title, content, id}) { //title, content, key 추가
  return (
    <div className="blockDiv" key={id}>
      <h4>{title}</h4>
      <p>
        ---------------------------------------------------------------------------------------------
      </p>
      <h4>{content}</h4>
    </div>
  )
}

export default DiaryBlock

 

module - <Diary.JSX> : addDiary 함수 추가, map 함수를 이용해서 생성되는 일기 블록 나타냄

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

function Diary() {
  const [diary, setDiary] = useState(JSON.parse(localStorage.getItem('Diary')) || [])
  //일기장 리스트(배열)을 생성, localStorage에 값이 있으면 새로고침할 때 값을 가져옴

  const diaryKey = useRef(0) //key 값을 0으로 초기화

  const addDiary = (title, content) => { //일기장 추가 함수
    const newDiary = { //일기에 삽입할 입력값을 지정
      title,
      content,
      id: diaryKey.current
    }
    diaryKey.current += 1 //key 값을 1씩 증가
    setDiary([newDiary, ...diary])
  }

  useEffect(() => { //localStorage에 일기를 추가
    localStorage.setItem('Diary', JSON.stringify(diary))
  })

  return (
    <div>
      <div>
        <DiaryWrite addDiary={addDiary} />
      </div>
      <div>
        {diary.map(diaryDate => { //map 함수를 이용해서 일기 블록 나타냄
          return (
            <DiaryBlock
              key={diaryDate.id}
              title={diaryDate.title}
              content={diaryDate.content}
            />
          )
        })}
      </div>
    </div>
  )
}

export default Diary

 

일기를 작성하면 일기 리스트가 추가, 새로고침해도 일기 그대로 유지

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

6. 모달 창 구현  (0) 2024.02.10
5. 카테고리, 작성 날짜  (0) 2024.01.31
4. EditDiary  (0) 2024.01.29
3. DeleteDiary, diaryKey 값 유지  (0) 2024.01.29
1. Diary Input, Block  (0) 2024.01.28