Javascript (React_基本的なこと02)

■別ファイルのリストから参照。
基本的なことの続きとして、Reactのウェブサイトのチュートリアルを読み進めながら、適当にコード作成している。今回は、filterの機能と別ファイルのリストから画像参照しているところ。

ウェブサイトのサンプルから下のものを作成。
テキストボックスにLocation名を入れてFilterボタンを押すと、該当する画像のみピックアップする。Nextボタンで画像の切替えができる。

下のようなImgData.jsファイルを作り、SceneImgListというリストの中にそれぞれの画像の名前(name)、撮影場所(SnapLoc)、参照ファイル(url)を入れている。


下のApp.jsファイルでImgData.jsを読み込んで使用。NextボタンにhandleNext, FilterボタンにhandleFilterを設定。useStateを使って対象となる画像を絞り込み。
リストの要素を変数sceneに入れて、それぞれの要素(scene.nameなど)をhtml構文の中で使用。

App.jsコード

import { useState } from 'react';
import { SceneImgList } from './ImgData.js';

export default function Snaps() {
    const [index, setIndex] = useState(0);
    const [filteredList, setFilteredList] = useState(SceneImgList);
    const [inputText, setInputText] = useState("");

    function handleNext() {
        if (filteredList.length === 0) return;
        if (index + 1 === filteredList.length) {
            setIndex(0);
        } else {
            setIndex(index + 1);
        }
    }

    function handleFilter() {
        const newList = SceneImgList.filter(item => item.SnapLoc === inputText);
        setFilteredList(newList);
        setIndex(0);
    }

    let scene = filteredList[index];

    return (
        <>
            <p>
                <input
                    type="text"
                    placeholder="Locationを入力"
                    value={inputText}
                    onChange={(e) => setInputText(e.target.value)}
                    style={{ display: "block", marginBottom: "8px" }}
                />
                <button onClick={handleFilter}>
                    Filter
                </button>
            </p>

            <button onClick={handleNext}>
                Next
            </button>

            {scene ? (
                <div style={scene.theme}>
                    <h2>
                        <i>{scene.name}</i>
                        <br /> Location: {scene.SnapLoc}
                    </h2>
                    <h3>
                        ({index + 1} of {filteredList.length})
                    </h3>
                    <img src={scene.url} />
                </div>
            ) : (
                <p>No image</p>
            )}
        </>
    );
}