
今日は、もりけん塾のJavaScript課題12 を終えて学んだことをアウトプットしていきます。
こんにちは。Webコーダーのはるです。
現在、所属している「もりけん塾」でハンズオン課題 に取り組み、レビューをいただいています。
今日は、課題12 についてアウトプットをしていきます。
(前回までのアウトプットは、こちらです。)
●課題12で学んだこと
・要素を削除する
・fetch()とjson()を一緒に書く
【もりけん塾】JavaScript課題12で学んだこと まとめ
今回、取り組んだ課題はこちらです。

「APIにリクエストをする→配列データを取得して、リストを表示する」というところまでは課題11でやりました。⏬

(もりけん先生のJavaScriptハンズオン課題より)
クリックしたらリクエストする
この仕様を実装するために、addEventListnerを学習しました。
target.addEventListener(イベントの種類,関数,[options])
今回使用したイベントの種類は、’click’ です。
targetがクリックされた時に、指定した関数(イベントハンドラーとよばれる)が発動します。
下記のように関数名を指定して、外側で関数を別に定義することもできるし、
target.addEventListener('click',modalOpen,[options])
function modalOpen {
// 処理
}
第二引数に直接、無名関数を書くこともできる。以下はアロー関数の例。
target.addEventListener('click',() => {
//処理
},[options])
要素を削除する
今回は、htmlにボタン要素を作成して、それをクリックしたらイベントが発動する実装をしました。
イベントが発動した後は、ボタン要素を削除する仕様にしたかったので、remove()メソッドを使用しました。
Element.remove() は所属するツリーから要素を削除します。
PRコード
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="reset.css" type="text/css">
<link rel="stylesheet" href="style.css" type="text/css">
<script src="index.js" defer></script>
<title>TerraceTechフロントエンドエンジニア養成所</title>
</head>
<body>
<div id="js-contents">
<ul id="js-lists"></ul>
</div>
<button id="js-button">Click!</button>
</body>
</html>
const button = document.getElementById("js-button");
const div = document.getElementById("js-contents");
const ul = document.getElementById("js-lists");
function addLoading() {
const img = document.createElement("img");
img.src = "loading-circle.gif";
img.id = "js-loading"
div.appendChild(img);
};
function removeLoading() {
const img = document.getElementById("js-loading");
div.removeChild(img);
};
async function fetchData() {
try {
const responseApi = await fetch("https://myjson.dit.upm.es/api/bins/7ctn");
const json = await responseApi.json();
return json.data;
} catch (e) {
throw new Error(e);
}
}
async function fetchListData() {
addLoading();
try {
const data = await fetchData();
if (data.length === 0) {
throw new Error("データが空です");
}
return data;
} catch (e) {
createErrorMessage(e);
} finally {
removeLoading();
}
};
function createErrorMessage(e) {
const li = document.createElement("li");
li.textContent = `エラー内容:${e.message}`;
ul.appendChild(li);
console.error(e.message);
};
async function addList() {
const fragment = document.createDocumentFragment();
const values = await fetchListData();
if (values) {
values.forEach((value) => {
const li = document.createElement("li");
const anchor = document.createElement("a");
const img = document.createElement("img");
anchor.textContent = value.text;
anchor.href = `/${value.to}`;
img.src = value.img;
img.alt = value.alt;
li.appendChild(anchor).insertAdjacentElement("afterbegin", img);
fragment.appendChild(li);
});
ul.appendChild(fragment);
}
};
button.addEventListener('click', () => {
addList();
button.remove();
});
レビュー:fetch()とjson()をまとめて書く
やすさん(yasu_front)にレビューいただきました!ありがとうございます!
async function fetchData() {
try {
const responseApi = await fetch("https://myjson.dit.upm.es/api/bins/7ctn");
const json = await responseApi.json();
return json.data;
} catch (e) {
throw new Error(e);
}
}
このコードのfetch()とjson()を一緒にまとめて書けると教えていただきました。
async function fetchData() {
try {
const json = await (await fetch("https://myjson.dit.upm.es/api/bins/7ctn")).json();
return json.data;
} catch (e) {
throw new Error(e);
}
}
1行でシンプルに書くことができました!
//
学習に使用している本は、もりけん先生推奨の”JavaScript本格入門”です。
あとがき
お忙しい時間を割いて課題を確認してくださったやすさん(yasu_front)・たかさん(taka02090603)ありがとうございました!!
私の修正後のコードはこちらです
今日は以上です。
//
【もりけん塾で勉強しています】
もりけん先生(@terrace_tec)のHPはこちら


