상황 1 : addDoc을 해주고 그 데이터를 바로 받아와서 navigate 할 때 써주려고 했으나 그 전 데이터가 불러와졌다.
RTK-Query endpoint에서 생성된 react-hook이 비동기라서 가장 마지막에 실행되어 원하는 순서대로 작동하지 않았다. ⇒ async. await로 해결
서버에 새 데이터를 Add해주고 바로 그 데이터를 받아서 navigate 할 때 사용하려 했으나, 그 전 데이터가 받아 와졌다.
⇒ 원인: 라이프 싸이클에 따르면 바뀐 State는 리렌더링을 해주어야 적용이 된다.
⇒ 해결: useEffect의 의존성 배열에 이용하는 데이터를 넣어주고, 일부러 state 변경을 하여 리렌더를 일으켰다. 그랬더니 최신 데이터가 받아 와지면서 제대로 된 주소로 navigate할 수 있었다.
해결 전
const [addCourse] = useAddCourseMutation();
const { data } = useGetCourseQuery();
const submitHandle = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
const newPost = {
........
};
addCourse(newPost);
navigate(`/course/${data && data[0].id}`);
};
해결 후
const [condition, setCondition] = useState(false);
const { data } = useGetCourseQuery();
const submitHandle = **async** (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
const newPost = {
........
};
**await** addCourse(newPost);
**setCondition(true);**
window.alert("게시물이 등록되었습니다");
};
useEffect(() => {
if (condition) {
navigate(`/course/${data && data[0].id}`);
setCondition(false);
}
}, [**data**]);
상황 2. 상세페이지에서 좋아요를 눌렀을 때 유저 페이지의 좋아요한 게시물 데이터로 가져와지지 않았다.
invalidateTags와 리렌더링을 다 했는데도 불구하고, 서로 다른 페이지 중 한쪽에서 업데이트 된 최신데이터가 다른 페이지에서 받아와지지 않았다.
⇒ 원인: react의 page가 다르면 다른 client이기 때문에 react-hook의 invalidateTags가 역할을 해주지 못한다. .
⇒ 해결: refetch를 해주어서 수동으로 최신 데이터를 가져와준다.
provides가 적용된 모습
getCourse: builder.query<CourseType[], void>({
async queryFn() {
try {
const courseQuery = query(
collection(dbService, "courses"),
orderBy("createdAt", "desc")
);
const querySnapshot = await getDocs(courseQuery);
let courses: any = [];
querySnapshot?.forEach((doc) => {
courses.push({ id: doc.id, ...doc.data() } as CourseType);
});
return { data: courses };
} catch (error: any) {
console.error(error.message);
return { error: error.message };
}
},
providesTags: ["Courses"],
}),
invalidate가 적용된 모습
updateLikes: builder.mutation({
async queryFn({ likes, likesID, courseId }) {
try {
await updateDoc(doc(dbService, "courses", courseId), {
likes,
likesID,
});
return { data: null };
} catch (error: any) {
console.error(error.message);
return { error: error.message };
}
},
**invalidatesTags: ["Courses"],**
}),
해결 전
const { refetch } = useGetCourseQuery();
const filterData = () => {
.........
};
useEffect(() => {
filterData();
}, [data, category, done]);
return (
<div className="flex flex-start">
<button
className="border border-black px-8 py-2 mr-3 hover:bg-black hover:text-white "
onClick={() => setCategory("MY")}
>
내 게시글
</button>
)
해결 후
const { refetch } = useGetCourseQuery();
const filterData = () => {
.......
}
useEffect(() => {
filterData();
}, [data, category, done]);
return (
<button
className="border border-black px-8 py-2 mr-3 hover:bg-black hover:text-white "
onClick={() => {
**refetch();**
setCategory("MY");
}}
>
내 게시글
</button>
)