
이제 드디어 끝이 보입니다. task 입력까지 했으니 이번 시간에는 firestore에서 데이터를 가져오도록 하겠습니다. 그냥 가져오면 심심하니 onSnapshot을 사용하여 실시간으로 데이터를 가져오도록 하겠습니다. 또한, 완료 버튼을 클릭하면 해당 task는 화면에서 지우는 작업까지 해보도록 하겠습니다.
- task를 입력하면 실시간으로 데이터를 화면에 출력한다.
- 완료 버튼을 클릭하면 실시간으로 화면에서 지운다.
이번에도 코드 복잡성을 방지하기 위해 todo list는 따로 컴포넌트를 만들어 관리하도록 하겠습니다.
import React, { useEffect, useState } from "react";
// FIREBASE
import { fireStoreJob } from "../initFirebase";
import {
collection,
query,
where,
orderBy,
onSnapshot,
updateDoc,
doc,
} from "firebase/firestore";
// INTERFACE
import { UserInterface } from "../interfaces/user.interface";
import { TodoInterface } from "../interfaces/todo.interface";
// CSS
import { TodoListWrap,StyledTableCell } from "../styles/todoList.styled";
import Paper from "@mui/material/Paper";
import Table from "@mui/material/Table";
import TableBody from "@mui/material/TableBody";
import TableCell from "@mui/material/TableCell";
import TableContainer from "@mui/material/TableContainer";
import TableHead from "@mui/material/TableHead";
import TableRow from "@mui/material/TableRow";
import Checkbox from "@mui/material/Checkbox";
type TodoListType = {
userInfo: UserInterface;
};
export const TodoList = ({ userInfo }: TodoListType) => {
const firestore_path = "tasks";
const [list, setList] = useState<TodoInterface[]>([]);
// NOTE - 1
useEffect(() => {
const q = query(
collection(fireStoreJob, firestore_path),
where("uid", "==", userInfo.uid),
where("status", "==", "READY"),
orderBy("date_created", "desc")
);
const unsubscribe = onSnapshot(q, (querySnapshot) => {
const arr = querySnapshot.docs.map((doc) => {
return {
id: doc.id,
...doc.data(),
};
});
// @ts-ignore
setList(arr);
});
return () => {
unsubscribe();
};
}, []);
// NOTE - 2
const onClick = async (e: any) => {
const doc_id = e.target.id;
const ref = doc(fireStoreJob, firestore_path, doc_id);
await updateDoc(ref, {
status: "DONE",
});
};
return (
<TodoListWrap>
<Paper sx={{ width: "100%", overflow: "hidden" }}>
<TableContainer>
<Table stickyHeader={true}>
<TableHead>
<TableRow>
<StyledTableCell>Task</StyledTableCell>
<StyledTableCell>Dead Line</StyledTableCell>
<StyledTableCell>Done</StyledTableCell>
</TableRow>
</TableHead>
<TableBody>
{list.map((data) => {
return (
<TableRow key={data.id} id={data.id}>
<TableCell>{data.task}</TableCell>
<TableCell>{data.date}</TableCell>
<TableCell>
<Checkbox onClick={onClick} id={data.id} />
</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</TableContainer>
</Paper>
</TodoListWrap>
);
};
💡 NOTE -1
메인 화면에 접속하면 유저가 작성한 task를 가져옵니다.
이때 유저별로 status == 'READY' 인 데이터를 최신 순으로 가져 옵니다.

저번 포스팅에서 작성한 task가 출력된 것을 볼 수 있습니다.
📌 Firebase 공식문서 - Cloud Firestore로 실시간 업데이트 받기

onSnapshot을 사용했기 때문에 변화가 감지될 때마다 새로운 데이터를 출력하고 있는 것을 볼 수 있습니다.
할 일을 입력했으니 완료 처리도 해보도록 하겠습니다.
💡 NOTE -2
체크 박스를 클릭하면 해당 데이터를 찾아status = 'DONE'으로 업데이트하고 화면에는 출력하지 않도록 하겠습니다.


status 가 DONE으로 바뀐 걸 확인할 수 있습니다.
React와 Firebase를 통해 간단한 Todo List 만들기 프로젝트가 끝났습니다. 다음에도 간단하게 만들 수 있는 프로그램으로 찾아오겠습니다.