
マイケル
みなさんこんにちは!
マイケルです!
マイケルです!

エレキベア
こんにちクマ〜〜

マイケル
今日は前回に引き続きReactアプリ開発!
これまで勉強してきたRedux、TypeScriptといった知識を生かしながら、
APIを使用した実践的なReactアプリを作ってみるよ!
これまで勉強してきたRedux、TypeScriptといった知識を生かしながら、
APIを使用した実践的なReactアプリを作ってみるよ!

エレキベア
ついにちゃんとしたのが開発できるクマね

マイケル
具体的には下記のように、WordPress記事をAPI経由で取得して表示する
アプリを作ります!
アプリを作ります!
↑選択したカテゴリーの記事を表示するアプリ

エレキベア
(このブログクマ・・・。)
こんなの簡単クマよ〜〜〜
こんなの簡単クマよ〜〜〜

マイケル
このブログの記事はREST APIで取得できるようになってるから使ってみたよ!
簡単そうに見えるけどこれだけでも結構手間なんだぜ・・・。
簡単そうに見えるけどこれだけでも結構手間なんだぜ・・・。

エレキベア
とりあえず早く教えるクマ

マイケル
それじゃ始めていこう!
ソースコードについてはこれまでと同様、GitHubに上げているので参考に使ってください!
ソースコードについてはこれまでと同様、GitHubに上げているので参考に使ってください!
[対象フォルダ]
masarito617/react-study – GitHub
- 06_wp-app-react-ts

エレキベア
クマ〜〜〜〜
参考書籍

マイケル
参考書籍についてはこれまでと同じく以下の2冊になります!
更に知識を深めたい方は是非読んでみてください!
更に知識を深めたい方は是非読んでみてください!
React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで (NEXT ONE)

エレキベア
一読の価値はありクマ〜〜〜(読んでない)
使用するAPI

マイケル
まず使用するAPIについてですが、JetPackが公開しているJSON API経由を使用します。
JSON APIではWordPress.com REST APIを経由して記事の情報を取得します!
JSON APIではWordPress.com REST APIを経由して記事の情報を取得します!
JSON API – Jetpack by WordPress.com

マイケル
この中で、今回使用するリクエストは以下になります!
- カテゴリ取得
- 記事データ取得
- 記事データ取得(カテゴリ指定時)
CATEGORIES – WordPress REST API
https://public-api.wordpress.com/rest/v1.1/sites/$site/categories
https://public-api.wordpress.com/rest/v1.1/sites/$site/posts/
https://public-api.wordpress.com/rest/v1.1/sites/$site/posts?category=【カテゴリースラッグ】

マイケル
$siteにはWordPressのサイトドメイン名が入ります!
今回はこのブログを使うため、elekibear.comを指定します。
今回はこのブログを使うため、elekibear.comを指定します。

エレキベア
こんなブログなので是非勉強に使ってくれクマ
全体の構成

マイケル
ざっと全体の作りについて説明します!
前回と同様、React、TypeScript環境を構築し、
下記のように大きく2つのコンポーネントに分けて作りました。
前回と同様、React、TypeScript環境を構築し、
下記のように大きく2つのコンポーネントに分けて作りました。
↑コンポーネントの分け方(Categories、ArticleList)

マイケル
Categoriesではカテゴリー一覧を取得して表示、
ArticleListでは記事一覧を取得して表示します。
また、カテゴリーが押下されたら記事を再取得するといった仕様になります。
ArticleListでは記事一覧を取得して表示します。
また、カテゴリーが押下されたら記事を再取得するといった仕様になります。

エレキベア
シンプルな構成クマ〜〜
フォルダ構成

マイケル
フォルダの構成は下記のようになっています。
こちらもReduxアーキテクチャを適用しており、前回とほとんど同じです。
こちらもReduxアーキテクチャを適用しており、前回とほとんど同じです。
↑フォルダ構成

エレキベア
index.stylとtypes.tsxは今回始めて出てきたクマね

マイケル
よく気づいたね!
その部分は前回とは少し違うから、解説しておこう!
その部分は前回とは少し違うから、解説しておこう!
前回との相違点
Stylusを使ったUI構築

マイケル
まずはindex.stylについて!
こちらはStylusというのを使ってスタイルを記述しています。
こちらはStylusというのを使ってスタイルを記述しています。

マイケル
CSSメタ言語と呼ばれるものの1つで、TypeScript等と同様
ビルド時にCSSファイルに変換されます。
Stylusを使用すると{}等を省略できたり、階層構造で記述することができるといったメリットがあります!
ビルド時にCSSファイルに変換されます。
Stylusを使用すると{}等を省略できたり、階層構造で記述することができるといったメリットがあります!

↑CSSに変換される
↑Stylusの記法

マイケル
上記のように&-で繋げると、親階層のクラス名に付け加える形で変換されます。
(category、category-border、category-itemなど)
(category、category-border、category-itemなど)

エレキベア
中々コンパクトに書けるクマね

マイケル
CSSメタ言語には他にもSASS、Lessといったものがあったり、
MaterialUI、TailwindCSSといったCSSライブラリを使用する方法もあります!
こちらも興味ある方は調べてみてください!
MaterialUI、TailwindCSSといったCSSライブラリを使用する方法もあります!
こちらも興味ある方は調べてみてください!
型定義ファイル

マイケル
そしてもう一つ、types.d.tsxについて!
こちらはTypeScriptの型定義をまとめたファイルになります!
こちらはTypeScriptの型定義をまとめたファイルになります!
↑型定義をまとめたファイル

マイケル
拡張子には.dを付けるのが作法になり、型情報のルートには
declare(アンビエント宣言)を付与する必要があります。
declare(アンビエント宣言)を付与する必要があります。

エレキベア
型の情報はばらばらにせずにここにまとめるクマね
環境構築

マイケル
それでは環境を作っていきます!
まずは必要なパッケージをインストールします!
まずは必要なパッケージをインストールします!
↑必要パッケージのインストール

マイケル
Stylus関連のパッケージが増えていますが、
基本的には前回と同じものになります。
基本的には前回と同じものになります。

エレキベア
大分インストールするパッケージも増えてきたクマね〜〜

マイケル
インストールしたら、
・tsconfig.jsonとwebpack.config.jsの作成
・package.json への build、startコマンド追加
を行いましょう!
・tsconfig.jsonとwebpack.config.jsの作成
・package.json への build、startコマンド追加
を行いましょう!
↑webpack.config.jsの作成(Stylus関連の記述も有り)
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "src/js",
"jsx": "react"
},
"include": [
"src/ts/**/*"
]
}
↑tsconfig.jsonの作成
{
"name": "04_todo-app_react-ts",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"start": "webpack serve"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@types/react-dom": "^17.0.9",
"ts-loader": "^9.2.3",
"typescript": "^4.3.5",
"webpack": "^5.44.0",
"webpack-cli": "^4.7.2",
"webpack-dev-server": "^3.11.2"
},
"dependencies": {
"react": "^17.0.2",
"react-dom": "^17.0.2"
}
}
↑build、startコマンドの追加

エレキベア
環境構築完了クマ〜〜〜
実装内容の解説

マイケル
環境が出来たらコードを書いていきましょう!
ソースコード全体

マイケル
とはいったものの、ページの都合上になるのですが
全てのコードを載せた後に要点を解説する流れで進めようと思います・・・。
全てのコードを載せた後に要点を解説する流れで進めようと思います・・・。

マイケル
実際に開発する流れとしては
・取得する仮データを用意してモックを作成
・APIからの取得処理を実装
といった流れになると思うので、ぜひ自身で作ってみてから比べてみてください!
・取得する仮データを用意してモックを作成
・APIからの取得処理を実装
といった流れになると思うので、ぜひ自身で作ってみてから比べてみてください!

エレキベア
めんどくさいから見るクマ〜〜〜
↑画面イメージ
[GitHub]
masarito617/react-study – GitHub
- 06_wp-app-react-ts
↑フォルダ構成

マイケル
まず大元の部分は下記になります。
index.tsxでReducerとStoreの登録、App.tsxでルーティング処理を行なっています。
index.tsxでReducerとStoreの登録、App.tsxでルーティング処理を行なっています。
Components

マイケル
Componentsはどちらもレンダリング時にAPIから情報を取得し、
取得出来たら表示するといった処理になっています。
取得出来たら表示するといった処理になっています。
Actions

マイケル
Actionsは前回と同じようにActionTypesを指定して、それに対応する処理を記述しています。
またthunkを使って非同期でJSONを取得する処理も入っています。
またthunkを使って非同期でJSONを取得する処理も入っています。
Reducers

マイケル
そして最後にReducers!
こちらは取得したJSONをStateに変換する処理も含めています。
こちらは取得したJSONをStateに変換する処理も含めています。

マイケル
以上が全体のコードになりますが、
基本的にはArticleListもCategoriesも同じような構造になっていたかと思います!
基本的にはArticleListもCategoriesも同じような構造になっていたかと思います!

エレキベア
多すぎてよくわからないクマ〜〜・・・

マイケル
それじゃ次は、前回と異なる部分に注目しながら
要所要所を見ていこう!
要所要所を見ていこう!
複数のReducer

マイケル
今回は2つのReducerを使うため、index.tsxでcombineReducersをインポートしています。
下記のように記述することでReducerをまとめてStoreを作成することができます。
下記のように記述することでReducerをまとめてStoreを作成することができます。
↑combineReducersを使ったStoreの作成
ルーティング

マイケル
そして次はページのルーティング!
カテゴリーが押下されたら「category/:slug」というURLでルーティングするようにしています。
カテゴリーが押下されたら「category/:slug」というURLでルーティングするようにしています。

エレキベア
「:slug」の部分をコンポーネントに渡しているクマね

マイケル
ルーティングにも様々な方法がありますが、今回は下記のように、
・index.tsx内でBrowserRouterタグで囲む。
・App.tsx内でSwitchタグで分岐させる
といった方法を使いました。
・index.tsx内でBrowserRouterタグで囲む。
・App.tsx内でSwitchタグで分岐させる
といった方法を使いました。
↑BrowserRouterタグで囲む
↑Switchタグで分岐させる

マイケル
Componentsでは、押下されたカテゴリースラッグを含めたURLを
history.push()に渡すことで遷移しています。
historyを取得しているuseHistory()はReactHooksの1つになります!
history.push()に渡すことで遷移しています。
historyを取得しているuseHistory()はReactHooksの1つになります!
↑カテゴリーを押下したら遷移する

エレキベア
ReactHooksも懐かしいクマね〜〜
非同期処理

マイケル
最後に非同期でAPIからJSONを取得している部分を解説します!
流れとしてはまず、コンポーネントがレンダリングされた時にfetchアクションを実行します。
流れとしてはまず、コンポーネントがレンダリングされた時にfetchアクションを実行します。
↑fetchPostDataアクションの実行

マイケル
useEffectはレンダリング時に実行されるReactHooksで、第2引数で渡した要素が変更された際にも再描画されるという便利Hooksです!

エレキベア
またもやReactHooksクマね〜〜〜

マイケル
Action内ではAPIへのリクエスト開始時にStateを初期化して、
取得したJSONデータを返却するといった処理になっています。
取得したJSONデータを返却するといった処理になっています。
↑JSONデータの取得

マイケル
最後にReducer内でJSONデータをState要素に変換して格納しています。
このような処理はTypeScriptで型定義してあると変数名などの間違いも起こりにくく、恩恵を感じやすいポイントだと思います。
このような処理はTypeScriptで型定義してあると変数名などの間違いも起こりにくく、恩恵を感じやすいポイントだと思います。
↑JSONデータをStateに格納

マイケル
以上が非同期処理の流れになります。
ArticleListの例を載せましたが、Categoriesも同じような処理になっています。
ArticleListの例を載せましたが、Categoriesも同じような処理になっています。

エレキベア
これで大体処理の内容が分かったクマ〜〜〜
おわりに

マイケル
そんなこんなでアプリを作ってみましたがどうだったでしょうか?

エレキベア
前回と比べたら量も多かったクマが、
1つ1つ見ていけば大体理解できたクマ〜〜〜
1つ1つ見ていけば大体理解できたクマ〜〜〜

マイケル
これでReactアプリ開発シリーズは一旦終了です!!
最後まで見てくれた方はおつかれさまでした!
気が向いたらNext.jsやReactNativeも触って記事にしてみようかなとも思っていますがするか分かりません・・・。
最後まで見てくれた方はおつかれさまでした!
気が向いたらNext.jsやReactNativeも触って記事にしてみようかなとも思っていますがするか分かりません・・・。

エレキベア
長いシリーズおつかれクマ
フロントエンド開発も中々楽しいクマね
フロントエンド開発も中々楽しいクマね

マイケル
みんなReactReact言うから触りたくもなるよね・・・(ボソッ)
どうせならAPI開発も勉強してWebサービスを作ったり、
ソシャゲ開発にも生かしてみたいね!
どうせならAPI開発も勉強してWebサービスを作ったり、
ソシャゲ開発にも生かしてみたいね!

エレキベア
よいこのみんなは流行りばかりに流されちゃダメクマよ

マイケル
それでは今日はこの辺で!
アデュー!!
アデュー!!

エレキベア
クマ〜〜〜〜
【React.js】第三回 Reactでアプリ開発! 〜APIを使用した実践的なアプリを開発するぜ編〜 〜完〜












