728x90
반응형
fetch() 사용 방법
fetch(url, options)
.then((response) => console.log("response:", response))
.catch((error) => console.log("error:", error));
- 첫 번째 인자로 API의 url, 두 번째 인자로 옵션 객체를 받고 옵션(options) 객체에는 HTTP 방식(method), HTTP 요청 헤더(headers), HTTP 요청 전문(body) 등을 설정해줄 수 있다. 응답 객체(response) 객체로부터는 HTTP 요청 상태(status), HTTP 응답 헤더(headers), HTTP 응답 전문(body) 등을 읽어올 수 있다.
- Promise 타입의 객체를 반환한다. API 호출이 성공했을 경우(then)에는 응답(response) 객체를 resolve하고 실패했을 경우(catch)에는 예외(error) 객체를 reject한다.
fecth() 예제
GET
import { useParams } from "react-router-dom";
import Word from "./Word";
import { useState, useEffect } from "react";
export default function Day() {
const day = useParams().day;
const [words, setWords] = useState([]);
useEffect(() => {
fetch(`http://localhost:3000/words?day=${day}`)
.then((res) => {
return res.json();
})
.then((data) => {
setWords(data);
});
}, [day]);
return (
<>
<h2>Day {day}</h2>
<table>
<tbody>
{words.map((word) => (
<Word word={word} key={word.id} />
))}
</tbody>
</table>
</>
);
}
PUT & DELETE
import { useState } from "react";
export default function Word(props) {
const [word, setWord] = useState(props.word);
const [isShow, setIsShow] = useState(false);
const [isDone, setIsDone] = useState(word.isDone);
function toggleShow() {
setIsShow(!isShow);
}
function toggleDone() {
fetch(`http://localhost:3000/words/${word.id}`, {
method: "PUT",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
...word,
isDone: !isDone,
}),
}).then((res) => {
if (res.ok) {
setIsDone(!isDone);
}
});
}
function del() {
if (window.confirm("삭제 하시겠습니까?")) {
fetch(`http://localhost:3000/words/${word.id}`, {
method: "DELETE",
}).then((res) => {
if (res.ok) {
setWord({ id: 0 });
}
});
}
}
if (word.id === 0) {
return null;
}
return (
<tr className={isDone ? "off" : ""}>
<td>
<input type="checkbox" checked={isDone} onChange={toggleDone} />
</td>
<td>{word.eng}</td>
<td>{isShow && word.kor}</td>
<td>
<button onClick={toggleShow}>뜻 {isShow ? "숨기기" : "보기"}</button>
<button onClick={del} className="btn_del">
삭제
</button>
</td>
</tr>
);
}
POST
import useFetch from "../hooks/useFetch";
import { useRef } from "react";
import { useNavigate } from "react-router-dom";
export default function CreateWord() {
const days = useFetch("http://localhost:3000/days");
const history = useNavigate();
const engRef = useRef(null);
const korRef = useRef(null);
const dayRef = useRef(null);
function onSubmit(e) {
e.preventDefault();
fetch("http://localhost:3000/words", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
day: dayRef.current.value,
eng: engRef.current.value,
kor: korRef.current.value,
isDone: false,
}),
}).then((res) => {
if (res.ok) {
alert("생성이 완료 되었습니다");
history(`/day/${dayRef.current.value}`);
}
});
}
return (
<form onSubmit={onSubmit}>
<div className="input_area">
<label>Eng</label>
<input type="text" placeholder="computer" ref={engRef} />
</div>
<div className="input_area">
<label>Kor</label>
<input type="text" placeholder="컴퓨터" ref={korRef} />
</div>
<div className="input_area">
<label>Day</label>
<select ref={dayRef}>
{days.map((day) => (
<option key={day.id} value={day.day}>
{day.day}
</option>
))}
</select>
</div>
<button>저장</button>
</form>
);
}
728x90
반응형
'Frontend > React' 카테고리의 다른 글
[React] Typescript 컴포넌트 타입 종류 (0) | 2024.07.21 |
---|---|
[React] Redux 상태 관리 라이브러리 (1) | 2024.07.03 |
[React] useEffect를 사용하여 mount/unmount/update시 작업 설정하기 (0) | 2024.06.22 |
[React] json-server (0) | 2024.06.21 |
[React] 라우터 구현(react-router-dom) (0) | 2024.06.21 |