coinId
값을, 'Chart.tsx' 파일로 props 통해 보내주기.- Coin.tsx
<Routes>
<Route path="chart" element={<Chart coinId={coinId!} />} />
- Chart.tsx
interface ChartProps {
coinId: string;
}
function Chart({ coinId }: ChartProps) {
interface
를 만들어줌coinId
를 가지고 있으니, API 에 request 를 보내서 가격을 가져올 수 있다.-api.ts
export function fetchCoinHistory(coinId: string) {
return fetch(
`https://ohlcv-api.nomadcoders.workers.dev/?coinId=${coinId}`
).then(respons => respons.json());
}
- Chart.tsx
import { fetchCoinHistory } from "../api";
interface IHistorical {
time_open: string;
time_close: number;
open: number;
high: number;
low: number;
close: string;
volume: number;
market_cap: number;
}
const { isLoading, data } = useQuery<IHistorical[]>(
["ohlcv", coinId],
() => fetchCoinHistory(coinId),
{
refetchInterval: 10000,
}
);
npm install --save react-apexcharts apexcharts
import ApexChart from "react-apexcharts";
ApexChart
로 import 함)return <div> {isLoading ? "Loading Chart ..." : <ApexChart />}
<ApexChart />
컴포넌트 안에 props 를 사용해 원하는 차트로 만들어줄 수 있다.<ApexChart
type="line"
series={[
{
name: "Price",
data: data?.map(price => parseFloat(price.close)) ?? [],
// → close 데이터가 string이기 때문에 parseFloat를 통해 형 변환
},
]}
options={{
theme: { mode: isDark ? "dark" : "light" },
chart: {
height: 300,
width: 500,
toolbar: { show: false },
background: "transparent",
},
grid: {
show: false,
},
yaxis: {
show: false,
xaxis: {
axisBorder: { show: false },
axisTicks: { show: false },
labels: {
show: false,
},
type: "datetime",
categories: data?.map(price =>
new Date(price.time_close * 1000).toISOString() <<<----
),
},
stroke: {
curve: "smooth",
width: 4,
},
fill: {
type: "gradient",
gradient: {
gradientToColors: ["#0be881"],
stops: [0, 100],
},
},
colors: ["#0fbcf9"],
tooltip: {
y: {
formatter: value => `$${value.toFixed(2)}`,
},
},
그럼 이렇게 깔끔띠한 차트가 완성 ,, ~
useQuery<PriceData>(
["tickers", "coinId"],
() => fetchCoinTickers(coinId),
{
refetchInterval: 5000, <<<----
}
);
npm i react-helmet
npm i --save-dev @types/react-helmet
- Coin.tsx
import { Helmet } from "react-helmet";
<Helmet>
{/* react-helmet 사용 */}
<title>
{state?.name ? state.name : loading ? "Loading..." : infoData?.name}
</title>
</Helmet>
코인 이름이 head로 가게되는 걸 볼수 있다 :)