技術系

React × DB 【動作編】

技術系

こんにちは。
なかにしです。

引き続きReact × DBをやっていきます。

前回は概要編でしたので、今回は動作編となります。

動作

json-serverで構築したJsonファイルを簡易DBとし、動作確認をしていきます!
今回は「DB読込」「DB更新」の2種類のボタンを用意しました。

本来のDBと同様、「DB読込」をするとデータが読み込まれ、「DB更新」をすると変更箇所がDBに保存されます。

▽DB読込
更新せずに再読み込みしている為、データが変更前に戻っています。

▽DB更新
更新ボタンを押すと、json(DB)の値が更新されています。

ファイル構成

▽DBとして「db.json」、DBの起動を楽にする為「json-server.json」を作成。
「Table.tsx」にテーブルコンポーネントを作成し、「App.tsx」でインポートして表示します。

コード

{
  "members": [
    {
      "id": "1",
      "name": "Tanaka",
      "age": "25",
      "note": "とても良い人です。"
    },
    {
      "id": "2",
      "name": "Nakanishi",
      "age": "10",
      "note": "ちょっとヤバい人です。"
    },
    {
      "id": "3",
      "name": "Okamura",
      "age": "8",
      "note": "超絶クレーマーです。"
    },
    {
      "id": "4",
      "name": "Shima",
      "age": "29",
      "note": ""
    },
    {
      "id": "5",
      "name": "Abe",
      "age": "42",
      "note": "ベテラン"
    },
    {
      "id": "6",
      "name": "Nakano",
      "age": "99",
      "note": "天才"
    },
    {
      "id": "7",
      "name": "Tanaka",
      "age": "23",
      "note": ""
    }
  ]
}
{
  "watch": true,
  "port": 3100
}
import "./App.css";
import Table from "./Table";

function App() {
  return (
    <div className="App">
      <Table />
    </div>
  );
}

export default App;
import React, { useState, useEffect } from "react";
import axios, { AxiosResponse } from "axios";
import { CSSProperties } from "react";

const Table = () => {
  // テーブルのスタイル設定
  const border: number = 1;
  const borderCollaps: CSSProperties = {
    borderCollapse: "collapse",
  };
  const thStyle: CSSProperties = {
    minWidth: "150px",
  };

  // モックサーバーのURL
  const membersUrl = "http://localhost:3100/members";

  type Member = {
    id: string;
    name: string;
    age: string;
    note?: string;
  };

  // GETでデータの取り込み、membersにセット
  const [members, setMembers] = useState<Member[]>([]);

  const reloadDB = async () => {
    const response: AxiosResponse<Member[]> = await axios.get(membersUrl);
    setMembers(response.data);
  };

  // 初回データの取り込み、第二引数に[]を指定して最初の一回のみ動作させる
  useEffect(() => {
    reloadDB();
    console.log("初期読込完了!");
  }, []);

  // 再読込の処理
  const loadDB = () => {
    reloadDB();
    alert("再読込しました。");
  };

  const changeName = (e: any, index: number) => {
    const beforeName = [...members];
    beforeName[index].name = e.target.value;
    setMembers(beforeName);
  };

  const changeAge = (e: any, index: number) => {
    const beforeAge = [...members];
    beforeAge[index].age = e.target.value;
    setMembers(beforeAge);
  };

  const changeNote = (e: any, index: number) => {
    const beforeNote = [...members];
    beforeNote[index].note = e.target.value;
    setMembers(beforeNote);
  };

  const updateDB = () => {
    console.log(members);
    for (let i = 0; i < members.length; i++) {
      const id = members[i].id;
      const json = members[i];

      axios.put(membersUrl + "/" + id, json).catch((error) => {
        console.error(error);
      });
    }
    alert("更新完了しました!");
  };

  return (
    <div>
      <button onClick={() => loadDB()}>DB読込</button>
      <button onClick={() => updateDB()}>DB更新</button>
      <table border={border} style={borderCollaps}>
        <thead>
          <tr>
            <th style={thStyle}>ID</th>
            <th style={thStyle}>Name</th>
            <th style={thStyle}>Age</th>
            <th style={thStyle}>Note</th>
          </tr>
        </thead>
        <tbody>
          {members.map((member: Member, index: number) => (
            <tr key={index}>
              <td>{member.id}</td>
              <td>
                <input
                  value={member.name}
                  onChange={(e) => changeName(e, index)}
                />
              </td>
              <td>
                <input
                  value={member.age}
                  onChange={(e) => changeAge(e, index)}
                />
              </td>
              <td>
                <input
                  value={member.note}
                  onChange={(e) => changeNote(e, index)}
                />
              </td>
            </tr>
          ))}
        </tbody>
      </table>
    </div>
  );
};

export default Table;

さいごに

いかがでしたでしょうか。

DB操作ができるようになると、何でもできる気がしてきますね。

今度はLarvel × React で何か簡易的なアプリでも作ろうかな~

今回はここまで!
Enjoy Hacking!!

参考

axiosライブラリを使ってリクエストする
React:Http通信 (axiosでモックサーバーと通信する)

コメント