ポケモン図鑑を作ってみる[LWC]
概要

LWCでポケモン図鑑を作成します。
PokéAPIを使用しています。
APIを使用するために「CSP 信頼済みサイト」の設定が必要です。

ソースコード
PokemonPicLwc.html
<template>
<lightning-card>
<div class="slds-grid slds-einstein-header slds-card__header">
<header class="slds-media slds-media_center slds-has-flexi-truncate">
<div class="slds-grid slds-grid_vertical-align-center slds-size_3-of-4 slds-medium-size_2-of-3">
<h1 class="slds-truncate" title="ポケモン図鑑(初代)">
<span class="slds-text-heading_large">ポケモン図鑑(初代)</span>
</h1>
</div>
<div class="slds-einstein-header__figure slds-size_1-of-4 slds-medium-size_1-of-3"></div>
</header>
</div>
<div class="slds-align_absolute-center">
<div class="slds-m-top_large">
<header class="slds-align_absolute-center">
<span class="slds-text-heading_medium">図鑑番号:
<input type="number" class="slds-input input-number slds-p-right_none" min="1" max="151" value="1" onchange={inputChage}/></span>
<lightning-button variant="brand" label="検索する" onclick={startApp} class="slds-m-left_medium slds-text-heading_medium slds-p-around_xx-small"></lightning-button>
</header>
<main class="slds-m-top_large">
<section class="pokemon-container" lwc:dom="manual">
</section>
</main>
</div>
</div>
</lightning-card>
</template>
PokemonPicLwc.js
import { LightningElement } from 'lwc';
export default class PokemonPicLwc extends LightningElement {
baseUrl = 'https://pokeapi.co/api/v2/pokemon/';
speciesUrl = 'https://pokeapi.co/api/v2/pokemon-species/';
pokemon;
pokeNumber = 1;
pokeSpecies;
// 図鑑番号の取得
inputChage(event){
this.pokeNumber = event.target.value;
}
// PokéAPIからポケモンの情報を取得する
requestPokeInfo() {
fetch(this.baseUrl + this.pokeNumber).then(response => response.json())
.then(data => {
this.pokemon = data;
console.log(data);
return fetch(this.speciesUrl + this.pokeNumber);
})
.then(response => response.json())
.then(data => {
this.pokeSpecies = data;
})
.catch(err => console.log(err));
}
// 取得したポケモンの情報を整理してHTML要素を設定する
createCard () {
const pokeName = this.pokeSpecies.names.find((v) => v.language.name == "ja").name;
const pokeType = this.pokeSpecies.genera.find((v) => v.language.name == "ja");
let num = ( '000' + this.pokeSpecies.id).slice( -3 );
const flavorText = this.pokeSpecies.flavor_text_entries.filter(function(v) {
return (v.language.name == "ja") && (v.version.name == "x");
})
let card = `
<div class="slds-grid">
<div class="slds-col slds-size_2-of-5">
<img src="${this.pokemon.sprites.versions['generation-i']['red-blue'].front_default}" class="pokemon-img"/>
<p class="slds-text-heading_medium slds-align_absolute-center">No.${num}</p>
</div>
<div class="slds-col slds-size_3-of-5">
<p class="slds-text-heading_medium slds-m-around_medium">${pokeName}</p>
<p class="slds-text-heading_medium slds-m-around_medium">${pokeType.genus}</p>
<p class="slds-text-heading_medium slds-m-around_medium">たかさ<span class="slds-m-left_large">${this.pokemon.height / 10}m</span></p>
<p class="slds-text-heading_medium slds-m-around_medium">おもさ<span class="slds-m-left_large">${this.pokemon.weight / 10}kg</span></p>
</div>
</div>
<hr class="slds-m-vertical_x-small">
<p class="slds-text-heading_medium slds-text-align_left">${flavorText[0]['flavor_text']}</p>`;
return card;
}
startApp() {
// PokéAPIからポケモン情報を取得する
this.requestPokeInfo();
// 取得したポケモンの情報を整理して要素を追加する
setTimeout(function () {
const container = this.template.querySelector('.pokemon-container');
container.innerHTML = this.createCard();
container.classList.add('slds-box');
container.classList.add('slds-m-bottom_medium');
container.classList.add('box-size');
}.bind(this), 1000);
}
}
PokemonPicLwc.css
p {
font-family: 'DotGothic16', sans-serif;
}
.col_center {
max-width: 600px;
}
.pokemon-img {
width: 200px;
}
.box-size {
width: 400px;
height: 300px;
}
.slds-input.input-number {
width: 70px;
}
.slds-button.slds-button_brand {
vertical-align: initial;
}
PokemonPicLwc.js-meta.xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>54.0</apiVersion>
<isExposed>true</isExposed>
<description>ポケモン図鑑LWC</description>
<targets>
<target>lightning__RecordPage</target>
<target>lightning__AppPage</target>
<target>lightning__HomePage</target>
</targets>
</LightningComponentBundle>

