목표
- 생성 페이지 만들기
- axios.post()로 서버에 데이터 전송하기
결과 화면
1. state 변수 만들기
- src/pages/board/create/index.tsx
title(타이틀)과 content(콘텐츠) state 변수를 만들고,
Input, Textarea 컴포넌트의 onChange 속성에 state 변수를 넣어 입력할 때마다 변하는 입력값을 state 변수에 저장한다.
const BoardCreate = () => {
// state
let [title, setTitle] = useState<string>('')
let [content, setContent] = useState<string>('')
return (
<div className="board-create">
<Title children="Write content"/>
<form>
<div>
<Label htmlFor="title">Title</Label>
<Input type="text" id="title" value={title} onChange={(e) => setTitle(e.target.value)} placeholder="제목을 입력해주세요."/>
</div>
<div>
<Label htmlFor="content">Content</Label>
<Textarea name="content" id="content" value={content} onChange={(e) => setContent(e.target.value)} placeholder="내용을 입력해주세요."/>
</div>
</form>
<div className="grid-2">
<Button children="Confirm" variant="primary" onClick={formSubmit}/>
<Button children="Cancel" variant="secondary" onClick={formCancel}/>
</div>
</div>
)
}
export default BoardCreate
2. axios.post로 서버에 데이터 보내기
https://jae-study.tistory.com/80
Nest.js와 Psql을 사용해서 백앤드와 데이터베이스를 만들었다.
직접 백앤드와 데이터베이스를 만들어도 되고,
JSONPlaceholder 사이트를 통해 가짜 데이터를 받아와도 된다.
Postman을 통해서 POST로 전송한 데이터를 확인할 수 있다.
- src/pages/board/create/index.tsx
- 확인(Confirm) 버튼을 누를 때 데이터가 전송되기 때문에 formSubmit() 클릭 이벤트를 만든다.
- 빈 값을 전송하면 안되기 때문에 if문을 통해 length가 0일 때 alert 창이 나오게 만든다.
- 생성 페이지는 서버에 데이터를 전송해야 하기 때문에 post() 메서드를 사용한다.
- post() 안에 전송할 데이터의 key와 value를 작성한다. (title, content)
- 취소(Cancel) 버튼을 누르면 게시판 목록 페이지로 갈 수 있게 formCancel() 클릭 이벤트를 만든다.
import { useState } from 'react'
import { useNavigate } from 'react-router-dom'
import axios from 'axios'
import Button from '../../../components/form/Button'
import Input from '../../../components/form/Input'
import Label from '../../../components/form/Label'
import Textarea from '../../../components/form/Textarea'
import Title from '../../../components/text/Title'
import './index.scss'
const BoardCreate = () => {
// hook
const navigate = useNavigate()
// state
let [title, setTitle] = useState<string>('')
let [content, setContent] = useState<string>('')
const formSubmit = (e: React.MouseEvent<HTMLButtonElement>) => {
e.preventDefault()
if(title.length === 0) {
alert('제목을 입력해 주세요.')
} else if(content.length === 0) {
alert('내용을 입력해 주세요.')
} else {
if(window.confirm('게시글을 등록하시겠습니까?')) {
axios.post('http://localhost:3001/board', {
title: title,
content: content
})
.then(function(response) {
alert('게시글이 등록되었습니다.')
navigate('/board')
})
.catch(function(error) {
console.log(error)
})
} else {
return false
}
}
}
const formCancel = (e: React.MouseEvent<HTMLButtonElement>) => {
e.preventDefault()
if(window.confirm('게시글 작성을 취소하시겠습니까?')) {
navigate('/board')
} else {
return false
}
}
return (
<div className="board-create">
<Title children="Write content"/>
<form>
<div>
<Label htmlFor="title">Title</Label>
<Input type="text" id="title" value={title} onChange={(e) => setTitle(e.target.value)} placeholder="제목을 입력해주세요."/>
</div>
<div>
<Label htmlFor="content">Content</Label>
<Textarea name="content" id="content" value={content} onChange={(e) => setContent(e.target.value)} placeholder="내용을 입력해주세요."/>
</div>
</form>
<div className="grid-2">
<Button children="Confirm" variant="primary" onClick={formSubmit}/>
<Button children="Cancel" variant="secondary" onClick={formCancel}/>
</div>
</div>
)
}
export default BoardCreate
#4
axios.post()로 title과 content 입력값을 서버에 전송하고,
alert 창으로 밸리데이션 역할을 대신했다.
'React > 게시판 만들기(TS)' 카테고리의 다른 글
[리액트][타입스크립트] #6.1 게시판 만들기 - reduxjs/toolkit 세팅하기 (0) | 2023.07.21 |
---|---|
[리액트][타입스크립트] #5 게시판 만들기 - 수정, 삭제 페이지 (axios.patch, axios.delete) (0) | 2023.07.05 |
[리액트][타입스크립트] #3 게시판 만들기 - 상세 페이지 (axios.get) (0) | 2023.07.05 |
[리액트][타입스크립트] #2.2 게시판 만들기 - 목록 페이지네이션 (react-js-pagination) (0) | 2023.06.30 |
[리액트][타입스크립트] #2.1 게시판 만들기 - 목록 페이지 (axios.get, dayjs) (0) | 2023.06.30 |