【JS】映画情報を非同期処理で取得するWebアプリを実装
成果物
サイト:
https://kaiyoshida57.github.io/js_app_ajax/
Github:
https://github.com/kaiyoshida57/js_app_ajax
きっかけ
JavaScriptにおける新しいの非同期処理の学習をしようと思いました。
そこで、TMDB(https://www.themoviedb.org/)という映画情報サイトで無料で公開されているAPIを利用し(要登録)、「上映中」・「人気」・「高評価」などの条件で映画リストを非同期で表示させる事を目標にしました。
手順
- まずはTMDBでアカウント登録し(必要項目には英語入力)、APIキーを受け取ります。
- https://www.themoviedb.org/account/signup
※申請してすぐに発行されるので、待ったりする必要はありませんでした。
1
TMDBのサイトには、親切にもガイダンスがあるので、それを見ながら取得したいAPIのURLを参照します。
使い方やAPI:
https://developers.themoviedb.org/3/getting-started/introduction
例えば、「上映中の映画」を取得したいなら、このページにて、
https://developers.themoviedb.org/3/movies/get-now-playing
このようなURLの使用を示してくれます。
https://api.themoviedb.org/3/movie/now_playing?api_key=<<api_key>>&language=en-US&page=1
2
そのURLを、fetchメソッドを使い、responseオブジェクトをjson形式で受け取ります。
const url = `https://api.themoviedb.org/3/movie/${dir}?api_key=xxx&language=ja&page=1`; const json = await fetch(url) .then((response) => { console.log('これは非同期処理成功!'); return response.json(); }).catch(error => { console.error('これは非同期処理失敗!', error); return null; });
3
jsonの中のresultsキーの中に、配列として格納されているので、それを一つ一つ処理するようにします。
json.results.map((movie) => {
4
そこからは、「上映中」ボタンのdata属性の中に入れた値(上映中ならnow_playing)に応じてURLを取得し、サムネイル画像やタイトルを入れたHTMLタグを返すように、DOM操作の処理を記述していきます。
let listContent = ` <li class="card isFade"> <a href="https://www.themoviedb.org/movie/${movie.id}" target="_blank" rel="noopener"> <p class="mvTitle">${movie.title}</p> <img src="${mvImgSrc}" class="mvImg"> </a> </li> `;
詳しくは、GithubのJSにコメント付きで記述してあるので、ご参照ください。
終わりに
JavaScriptにおける非同期処理(APIに絡めた処理)は、使いたいデータを含むURLがありさえすれば、それをfetchで取得し、async/awaitを使うことにより簡単に使用することが出来ました。
参考にさせていただいたサイト
非同期処理
qiita.com
TMDBでのAPI処理
chocolat5.com
JavaScriptでTMDB APIを使ったMovieアプリを作ろう! | セルフノート
【フロントエンド】備忘録2022/3 HTML,VSCodeなど。
img要素には、width,heightに値を指定してレイアウトシフトを防ぐ
・img要素にwidth,heightに値を指定することでレイアウトシフト(読み込み時に大きさ指定がないと画面がズレる。)を防ぐのが良い。
・さらに、loading="lazy"も指定すれば読み込みを遅らせることで負荷を下げられる。また、背景画像へのlazy適用には、ライブラリも有効だが、imgタグに変えてposition:absoluteで設置するのも良いかも。
・また上記のうち、flexbox内のimg要素には、object-fit:containを指定し、画面が縮んだ時に縦横比が変わらないようにするといい。
srcset属性とpicture+souceタグについて
・srcsetは、サイズ違いの画像として分ける時だけ使う。
・picture+sourceタグは、違う画像として分ける時だけ使う。
parashuto.com
srcsetは、2022年2月に私も試したところ、以下の記事のようにブラウザにより作用しなかった。
igawa.co
・IEもそろそろ切れるので、ますます積極的に使うべきだと思いました。
・個人的にsrcsetはちょっと書き方がややこしいですが、pictureの方は分かりやすいので、読み込み負荷を下げるためにも使いたいです。
【WordPress】WP_queryでカスタム投稿タイプのループにPICKUP投稿を表示する方法
要件
・WP_queryでカスタム投稿タイプのループ
・その中に特定の投稿だけAdvanced Custom Fields(ACF)値により、先頭に固定表示させ、他は日付順で並べる。
・カスタム投稿名 information
手順
・ACFをチェックボックスにし、keyを「information_pickup」、値を「pickup」と「not」と分けた上で、
次のコードで出力させる。
・日付順の投稿6件のうち、ACFにチェックされているものがあればそれらが優先的に先頭に固定される。
<?php $args = array( // ACFの値を優先させ、それ以外は日付順に並べる 'posts_per_page' => 6, "post_type" => "information", 'meta_query' => array( 'relation' => 'OR', array( 'key' => 'information_pickup', 'value' => 'pickup', 'compare' => 'LIKE' ), array( 'key' => 'information_pickup', 'value' => 'not', 'compare' => 'LIKE' ) ), 'orderby' => array( 'meta_value' => 'DESC', 'date' => 'DESC' ) ); ?>
要点
・relation => OR にて、その下2つの配列に、2つのACF値をそれぞれ指定して絞り込ませる。
・さらにその下のorderbyでも、dateとmeta_valueの複数の条件を設定させる必要がある。
【フロントエンド】備忘録:JavaScriptの非同期処理の簡単まとめ
Promise
Async()とAwait()
- promiseをより直感的にした記述。
- async宣言した関数は、promiseオブジェクトを返す。
- awaitは、promise返却する関数の非同期処理が終わるのを待つ記述。awaitで受けられるのは、promiseのインスタンス。awaitはasync関数の中である必要がある。
Fetch関数
- サーバ側から、データを取得する。
fetch("リクエスト先のURL"); .then((response) => { return response.json();
- responseオブジェクトには、サーバから返されたデータが格納されている。
- 上記コードのように、json()形式で扱うことが多い。
参考にさせて頂いたページ。
【図解】1から学ぶ JavaScript の 非同期処理 - Qiita
【フロントエンド】備忘録 21/10/17
【フロントエンド】備忘録 HTML,JSなど。
data-ナンデモ属性とは:
<タグ名 data-ナンデモ="img1.jpg">
のように、data- の後に自由に命名した属性を入れることが出来る。(HTML5から実装)
・JavaScriptで取得するときは、
const = 取得した要素.dataset.ナンデモ部分につけた名前
【フロントエンド】役に立ったページその2、Web豆知識
役に立ったページ
・知っておくと便利なHTML5の機能、要素や属性のまとめ
「mapタグ」、「markタグ」、「datalist要素」など、どれも知っておいて損は良いと思えるタグや機能などでした。
coliss.com
・【CSS】mix-blend-mode
>CSS3のプロパティ。これはDOMエレメントを重ねた時の見え方を指定するCSSプロパティ。
最近までこのプロパティは知らなかったのですが、Photoshopでいうオーバーレイなどを実現でき、画像や色を重ねて表現する時にとっても便利と感じました。
【CSS】ボタンのhoverでのアニメーション
【JavaScript】JSのメディアクエリ
豆知識
その他備忘録
tableタグのコーディングにて、
・trにはstyle当てない。
・flexもあまり使わない
・paddingで余白を取る。