fetchでデータを取得し、ランキングを作成する
前提
以前作成した下記の環境からスタートします。
親
src > app.tsx
import React, { FC } from "react";
const App: FC = () => {
return <h1>Hello World</h1>;
};
export default App;
子
componentフォルダ > content.tsx
※このコンポーネントにデータを流すので、後で使う
import React, { FC } from "react";
export const Content: FC = () => {
return <h1>Hello Hello</h1>;
};
ここまでで確認①
yarn start
:(npx webpack serve --config webpack.config.js
)でブラウザにアクセスするとHello World
が表示されていたらOK!
dummyDataの作成
APIを使ってデータが流れてくる想定でjson-server
を使用し、ダミーデータを作成します。
yarn add -D json-server
コマンドを実行
mockフォルダ > dummyData.json
dummyData.json
{
"ranking": [
{ "word": "テスト", "count": 10 },
{ "word": "テスト1", "count": 5 },
{ "word": "テスト2", "count": 1 }
]
}
型の作成
src > typesフォルダ > type.d.ts
export interface Ranking {
word: string;
count: number;
}
トップレベルのapp.tsxでデータ管理
app.tsx
import React, { FC, useEffect, useState } from "react";
import { Content } from "./component/content";
import { Ranking } from "./types/type";
const App: FC = () => {
const [ranking, setRanking] = useState<Ranking[]>([]);
useEffect(() => {
const fetchData = async () => {
const response = await fetch("http://localhost:3000/ranking");
const rankingData = await response.json();
setRanking(rankingData);
//今回はブラウザ上でデータが入ってきているか確認するためconsoleを記載
console.log(rankingData);
};
fetchData();
}, []);
return (
<>
<Content />
</>
);
};
export default App;
- Appコンポーネント内で
useState
を使う -
ranking
は初期値(今回はuseState<RankingData[]>([])
となっているので空配列が初期値) -
setRanking
はデータが更新した値(今回はfetchして取得したデータを入れる) -
useEffect
(副作用):関数コンポーネントのレンダリングに関係ない処理 -
useEffect
の第二引数である[]
に値を入れることで依存関係が作れる
ここまでで確認②
- ターミナルで
npx json-server --watch ./mock/dummyData.json
コマンドを実行(\{^_^}/ hi!
このマークが出ていればOK!) - 別ターミナルで
yarn start
を実行 - 今回はブラウザ上で
localhost:8111
にアクセス - 検証のコンソールでダミーデータを同じ値があることを確認
これでデータを流す準備は完了!
コンポーネントにデータを流す
app.tsx
<Content ranking={ranking}/>
-
useState
のranking
を子に流す
※content.tsx
で何も書き換えてないのでranking
でエラー出ている
content.tsx
import React, { FC } from "react";
import { RankingData } from "../types/type";
export const Content: FC<RankingData> = (props) => {
const { ranking } = props;
return (
<>
<h1>Hello Hello</h1>
<table>
<tr>
{ranking.map(({ word }) => {
return (
<tr>
<td key={word}>{word}</td>
</tr>
);
})}
</tr>
</table>
</>
);
};
- 親から流れてきた
ranking
=props
-
ranking
を分割代入で展開する -
ranking
のデータを全てテーブルに入れるためmapを使う - ダミーデータの
count
は使わないのでword
だけ - 新しい型
RankingData
を作成(下記)
tyoes > type.d.ts
export interface RankingData {
ranking: Ranking[];
}
最後に
- ターミナルで
npx json-server --watch ./mock/dummyData.json
コマンドを実行(scripts
でmock
としてまとめました。yarn mock
) - 別ターミナルで
yarn start
を実行 - ブラウザ上でlocalhost:8111にアクセス
Hello Hello
に続いてテスト、テスト1、テスト2
が表示されていればOK!
あとはコンポーネントを増やして横展開していくだけです。
参考文献