yarn add react-query
const my_first_query = useQuery(쿼리 키, 쿼리 함수, 옵션);
https://velog.io/@jewoo/React-Query-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0
{
enabled: postData!!
}
//index.js
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
import { QueryClient, QueryClientProvider } from "react-query";
import { ReactQueryDevtools } from "react-query/devtools";
const queryClient = new QueryClient();
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<QueryClientProvider client={queryClient}>
{/* devtools */}
<ReactQueryDevtools initialIsOpen={true} />
<App />
</QueryClientProvider>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
//query.jsx
import { useQuery } from "react-query";
import axios from "axios";
export const getSleepData = async () => {
try {
const { data } = await axios.get("http://localhost:3001/sleep_times");
console.log(data);
return data;
} catch (err) {
console.log(err);
}
};
export const addSleepData = async (payload) => {
try {
const { data } = await axios.post("http://localhost:3001/sleep_times", payload);
console.log(data);
return data;
} catch (err) {
console.log(err);
}
};
export const deleteSleepData = async (payload) => {
try {
console.log(payload);
const { data } = await axios.delete(`http://localhost:3001/sleep_times/${payload}`);
console.log(data);
return data;
} catch (err) {
console.log(err);
}
};
export const updateSleepData = async (payload) => {
try {
const { data } = await axios.patch(`http://localhost:3001/sleep_times/${payload.id}`, { day: payload.day, sleep_time: payload.sleep_time });
console.log(data);
return data;
} catch (err) {
console.log(err);
}
};
//main component.jsx
import React from "react";
import styled from "styled-components";
import { useMutation, useQuery, useQueryClient } from "react-query";
import axios from "axios";
import { getSleepData, addSleepData, deleteSleepData, updateSleepData } from "../hooks/Query";
const Home = ({ sleepData }) => {
console.log(sleepData);
const day_input = React.useRef("");
const time_input = React.useRef("");
const queryClient = useQueryClient();
// 첫번째 자리 : 키값 , 두번째 : 속성, 세번째 : 옵션
// const my_first_query = useQuery(쿼리 키, 쿼리 함수, 옵션);
const sleep_query = useQuery("sleep_list", getSleepData(), {
onSuccess: (data) => {
console.log(data.data);
},
staleTime: 10000,
});
//화면 밖에 나갔다가 오면 다시 Api를 불러오는 옵션이 있다.
//fresh time을 조절해주면 된다.
// const sleep_mutation = useMutation(addSleepData);
// const { mutate: addMutateData } = useMutation(addSleepData, {
const { mutate: addMutateData } = useMutation((data) => addSleepData(data), {
onSuccess: (data) => {
console.log(data);
queryClient.setQueryData("sleep_list", (sleep_times) => {
return [...sleep_times, data];
});
//방법1
// key를 넣지 않을 경우 모든 쿼리가 무효화됩니다.
// mutation을 성공하면 수면 데이터 목록을 불러오는 useQuery를 무효화 시켜줍니다!
// post후 바로 fetch해주기 위해! usequery를 무효화 시켜서 수면 데이터 목록을 다시 불러오기~
// queryClient.invalidateQueries("sleep_list");
// day_input.current.value = "";
// time_input.current.value = "";
},
onError: (error) => {
console.log(error);
},
});
//mutate => muatation을 동작하게 해주는 함수!
const addDataHandler = () => {
if (day_input.current.value === "" || time_input.current.value === "") {
return;
}
const data = { day: day_input.current.value, sleep_time: time_input.current.value };
console.log(data);
addMutateData(data);
};
// const { mutate: updateSleep } = useMutation((data) => updateSleepData(data), {
const { mutate: updateSleep } = useMutation((data) => updateSleepData(data), {
onSuccess: () => {
queryClient.invalidateQueries("sleep_list");
day_input.current.value = "";
time_input.current.value = "";
},
onError: (error) => {
console.log(error);
},
});
const { mutate: deleteSleep } = useMutation((data) => deleteSleepData(data), {
onSuccess: () => {
queryClient.invalidateQueries("sleep_list");
},
onError: (error) => {
console.log(error);
},
});
const updateDataHandler = (dataId) => {
const data = { id: dataId, day: day_input.current.value, sleep_time: time_input.current.value };
updateSleep(data);
};
const deleteDataHandler = (dataId) => {
deleteSleep(dataId);
};
//불러오는 중에 data가 없을 것이므로 isLoading null을 해주면 console.찍을 때 에러가 안나게 될것이다.
if (sleepData.isLoading) {
return null;
}
return (
<>
Home
{sleepData.map((d) => {
console.log(d);
return (
<div key={d.id}>
<p>{d.day}</p>
<p>{d.sleep_time}</p>
<button onClick={() => updateDataHandler(d.id)}>수정하기</button>
<button onClick={() => deleteDataHandler(d.id)}>삭제하기</button>
</div>
);
})}
<input ref={day_input} />
<input ref={time_input} />
<button onClick={addDataHandler}>데이터 추가하기</button>
</>
);
};
export default Home;