①googleのsandboxを活用して、Reactで健康管理アプリを作成

 

 

②健康アプリ(日々、体重、血圧、体重を記録する)

 

 

③App.jsのソースコード

 

import React, { useState } from "react"; // ReactとuseStateをインポート

import "./styles.css"; // CSSファイルをインポート

import HealthForm from "./HealthForm";

import HealthList from "./HealthList";

 

function App() {

  const loadDataFromLocalStorage = () => {

    const savedData = localStorage.getItem("healthData");

    return savedData ? JSON.parse(savedData) : [];

  };

 

  const [data, setData] = useState(loadDataFromLocalStorage);

 

  const handleAddEntry = (newEntry) => {

    const updatedData = [...data, newEntry];

    setData(updatedData);

    localStorage.setItem("healthData", JSON.stringify(updatedData));

  };

 

  const handleDeleteEntry = (index) => {

    const updatedData = data.filter((_, i) => i !== index);

    setData(updatedData);

    localStorage.setItem("healthData", JSON.stringify(updatedData));

  };

 

  return (

    <div className="app-container">

      {/* 背景ぼかし用の要素 */}

      <div className="background-blur"></div>

      <div className="content">

        <h1>健康管理アプリ</h1>

        <HealthForm onAddEntry={handleAddEntry} />

        <HealthList data={data} onDeleteEntry={handleDeleteEntry} />

      </div>

    </div>

  );

}

 

export default App;

 

④HealthForm.jsのソースコード

 

import React, { useState } from "react";

 

function HealthForm({ onAddEntry }) {

  const [form, setForm] = useState({

    date: "",

    temperature: "",

    bloodPressure: "",

    weight: "",

  });

 

  const handleChange = (e) => {

    const { name, value } = e.target;

    setForm({ ...form, [name]: value });

  };

 

  const handleSubmit = (e) => {

    e.preventDefault();

    if (form.date && form.temperature && form.bloodPressure && form.weight) {

      onAddEntry(form);

      setForm({ date: "", temperature: "", bloodPressure: "", weight: "" });

    } else {

      alert("全ての項目を入力してください!");

    }

  };

 

  return (

    <form onSubmit={handleSubmit} style={{ marginBottom: "20px" }}>

      <input

        type="date"

        name="date"

        value={form.date}

        onChange={handleChange}

        required

        placeholder="日付"

      />

      <input

        type="number"

        name="temperature"

        value={form.temperature}

        onChange={handleChange}

        placeholder="体温 (℃)"

        required

      />

      <input

        type="text"

        name="bloodPressure"

        value={form.bloodPressure}

        onChange={handleChange}

        placeholder="血圧"

        required

      />

      <input

        type="number"

        name="weight"

        value={form.weight}

        onChange={handleChange}

        placeholder="体重 (kg)"

        required

      />

      <button type="submit">追加</button>

    </form>

  );

}

 

export default HealthForm;

 

⑤HealthList.jsのソースコード

 

import React from "react";

 

function HealthList({ data, onDeleteEntry }) {

  return (

    <div>

      <h2>健康データ</h2>

      <ul style={{ listStyleType: "none", padding: 0 }}>

        {data.length === 0 ? (

          <p>データがありません</p>

        ) : (

          data.map((entry, index) => (

            <li

              key={index}

              style={{

                marginBottom: "10px",

                border: "1px solid #ccc",

                padding: "10px",

                borderRadius: "5px",

              }}

            >

              <p>日付: {entry.date}</p>

              <p>体温: {entry.temperature}℃</p>

              <p>血圧: {entry.bloodPressure}</p>

              <p>体重: {entry.weight}kg</p>

              <button onClick={() => onDeleteEntry(index)}>削除</button>

            </li>

          ))

        )}

      </ul>

    </div>

  );

}

 

export default HealthList;

 

⑥index.jsのソースコード

 

import { StrictMode } from "react";

import { createRoot } from "react-dom/client";

 

import App from "./App";

 

const rootElement = document.getElementById("root");

const root = createRoot(rootElement);

 

root.render(

  <StrictMode>

    <App />

  </StrictMode>

);

 

⑦styles.css

 

body {

  margin: 0;

  font-family: Arial, sans-serif;

}

 

.app-container {

  position: relative;

  min-height: 100vh;

  overflow: hidden;

}

 

/* 背景ぼかし用のスタイル */

.background-blur {

  position: absolute;

  top: 0;

  left: 0;

  width: 100%;

  height: 100%;

  background: url("/pic.webp") no-repeat center center fixed;

  background-size: cover;

  filter: blur(3px); /* 背景のみぼかす */

  z-index: -1; /* 背景をコンテンツの後ろに配置 */

}

 

.content {

  position: relative;

  z-index: 1; /* コンテンツを背景より前に配置 */

  padding: 20px;

  color: #333;

  backdrop-filter: none; /* フォームやテキストの背景ぼかしを無効化 */

}