ホームページ ウェブフロントエンド CSSチュートリアル React を使用してテーマ切り替えを使用して Todo アプリを構築する

React を使用してテーマ切り替えを使用して Todo アプリを構築する

Sep 10, 2024 pm 10:33 PM

Building a Todo App with Theme Toggle Using React

導入

このチュートリアルでは、React を使用して Todo リスト Web アプリケーション を構築します。このプロジェクトは、React での状態管理、イベント処理、リストの操作を理解するのに役立ちます。 React 開発のスキルを強化したい初心者に最適です。

プロジェクト概要

Todo リスト アプリケーションを使用すると、ユーザーはタスクを追加したり、完了済みとしてマークしたり、削除したりできます。日常のタスクを管理するためのクリーンなインターフェイスを提供します。このプロジェクトでは、React を使用してシンプルでありながら動的なアプリケーションの状態を管理する方法を紹介します。

特徴

  • 新しいタスクの追加: ユーザーはリストにタスクを追加できます。
  • 完了としてマーク: ユーザーはタスクを完了としてマークできます。
  • タスクの削除: ユーザーはリストからタスクを削除できます。
  • ローカル ストレージ: localStorage を使用して、ページがリロードされてもタスクを保持します。

使用されている技術

  • React: ユーザー インターフェイスの構築とコンポーネントの状態の管理用。
  • CSS: アプリケーションのスタイルを設定します。
  • JavaScript: コアロジックと機能用。

プロジェクトの構造

プロジェクトの構造は、典型的な React プロジェクトのレイアウトに従います。

├── public
├── src
│   ├── components
│   │   ├── TodoList.jsx
│   │   ├── TodoItem.jsx
│   ├── App.jsx
│   ├── App.css
│   ├── index.js
│   └── index.css
├── package.json
└── README.md

主要コンポーネント

  • TodoList.jsx: Todo リストの表示と管理を処理します。
  • TodoItem.jsx: 個々の Todo アイテムを管理します (完了済みとしてマークするか削除するなど)。

コードの説明

TodoList コンポーネント

このコンポーネントは、新しいタスクの追加やリストのレンダリングなど、todo リスト全体の状態を処理します。

import { useState, useEffect } from "react";
import TodoItem from "./TodoItem";

const TodoList = () => {
  const [task, setTask] = useState("");
  const [tasks, setTasks] = useState([]);

  useEffect(() => {
    const savedTasks = JSON.parse(localStorage.getItem("tasks")) || [];
    setTasks(savedTasks);
  }, []);

  useEffect(() => {
    localStorage.setItem("tasks", JSON.stringify(tasks));
  }, [tasks]);

  const addTask = () => {
    if (task.trim()) {
      setTasks([...tasks, { text: task, completed: false }]);
      setTask("");
    }
  };

  const toggleCompletion = (index) => {
    const newTasks = tasks.map((t, i) =>
      i === index ? { ...t, completed: !t.completed } : t
    );
    setTasks(newTasks);
  };

  const deleteTask = (index) => {
    const newTasks = tasks.filter((_, i) => i !== index);
    setTasks(newTasks);
  };

  return (
    <div classname="todo-list">
      <h1>Todo List</h1>
      <input type="text" value="{task}" onchange="{(e)"> setTask(e.target.value)}
        placeholder="Add a new task"
      />
      <button onclick="{addTask}">Add Task</button>
      <ul>
        {tasks.map((t, index) => (
          <todoitem key="{index}" task="{t}" index="{index}" togglecompletion="{toggleCompletion}" deletetask="{deleteTask}"></todoitem>
        ))}
      </ul>
    </div>
  );
};

export default TodoList;

TodoItem コンポーネント

TodoItem コンポーネントは、各タスクの表示と、タスクを完了としてマークするか削除するオプションを管理します。

const TodoItem = ({ task, index, toggleCompletion, deleteTask }) => {
  return (
    
  • toggleCompletion(index)}>{task.text}
  • ); }; export default TodoItem;

    このコンポーネントでは、親 TodoList から props を受け取り、タスクの完了の切り替えやタスクの削除などのアクションを処理します。

    アプリコンポーネント

    App.jsx はアプリケーションのルートとして機能し、TodoList コンポーネントをレンダリングします。

    import  { useState } from "react";
    import "./App.css";
    import TodoList from './components/TodoList';
    import sun from "./assets/images/icon-sun.svg";
    import moon from "./assets/images/icon-moon.svg";
    
    const App = () => {
      const [isLightTheme, setIsLightTheme] = useState(false);
    
      const toggleTheme = () => {
        setIsLightTheme(!isLightTheme);
      };
    
      return (
        <div classname="{isLightTheme" :>
          <div classname="app">
            <div classname="header">
              <div classname="title">
                <h1>TODO</h1>
              </div>
              <div classname="mode" onclick="{toggleTheme}">
                <img src="%7BisLightTheme" moon : sun alt="React を使用してテーマ切り替えを使用して Todo アプリを構築する">
              </div>
            </div>
            <todo></todo>
            <div classname="footer">
            <p>Made with ❤️ by Abhishek Gurjar</p>
          </div>
          </div>
    
        </div>
      );
    };
    
    export default App;
    
    

    CSS スタイル

    CSS により、ToDo リスト アプリケーションがユーザーフレンドリーで応答性が高いことが保証されます。

    * {
      box-sizing: border-box;
    }
    body {
      margin: 0;
      padding: 0;
      font-family: Josefin Sans, sans-serif;
    }
    
    .app {
      width: 100%;
      height: 100vh;
      background-color: #161722;
      color: white;
      background-image: url(./assets//images/bg-desktop-dark.jpg);
      background-repeat: no-repeat;
      background-size: contain;
      background-position-x: center;
      background-position-y: top;
      display: flex;
      align-items: center;
      justify-content: flex-start;
      flex-direction: column;
    }
    .header {
      width: 350px;
      margin-top: 20px;
      display: flex;
      align-items: center;
      justify-content: space-between;
    }
    .title h1 {
      font-size: 30px;
      letter-spacing: 7px;
    }
    .mode {
      display: flex;
      align-items: center;
      justify-content: center;
    }
    .mode img {
      width: 22px;
    }
    
    .todo {
      width: 350px;
      flex-direction: column;
      display: flex;
      align-items: center;
      justify-content: flex-start;
    }
    .input-box {
      border-bottom: 1px solid white;
      display: flex;
      align-items: center;
      justify-content: center;
      background-color: #25273c;
      width: 100%;
      gap: 10px;
      padding: 8px;
      border-radius: 10px;
    }
    .check-circle {
      width: 12px;
      height: 12px;
      border-radius: 50%;
      border: 1px solid white;
      display: flex;
      align-items: center;
      justify-content: center;
      background-image: linear-gradient(to right,hsl(230, 50%, 20%) , hsl(280, 46%, 28%));
    }
    
    .input-task {
      width: 90%;
      border: none;
      color: white;
      background-color: #25273c;
    }
    .input-task:focus {
      outline: none;
    }
    .todo-list {
    
      margin-top: 20px;
      width: 350px;
      background-color: #25273c;
    }
    .todo-box {
    
      margin-inline: 15px;
      margin-block: 10px;
      width: 100%;
      display: flex;
      align-items: center;
      justify-content: flex-start;
      gap: 15px;
    }
    .todo-box .cross{
    width: 14px;
    }
    .details {
      margin-bottom: 40px;
    border-bottom: 1px solid white;
      width: 350px;
      display: flex;
      align-items: center;
      justify-content: space-evenly;
      background-color: #25273c;
      font-size: 12px;
      padding: 12px;
      border-bottom-right-radius: 7px;
      border-bottom-left-radius: 7px;
    }
    
    .details .clickBtn{
      cursor: pointer;
    
    }
    .details .clickBtn:hover{
    color: #3074fd;
    
    }
    
    
    /* //light Theme  */
    
    
    .light-theme .app {
      background-color: #fff;
      color: #000;
      background-image: url(./assets//images/bg-desktop-light.jpg);
    }
    
    .light-theme .header {
    color: white;
    }
    
    .light-theme .input-box{
      background-color: white;
      color: black;
      border-bottom: 1px solid black;
    }
    .light-theme input{
      background-color: white;
      color: black;
    }
    .light-theme .check-circle{
      border:1px solid black;
    
    }
    .light-theme  .todo-list{
      background-color: white;
      color: black;
    }
    .light-theme .details{
      border-bottom: 1px solid black;
      background-color: white;
      color: black;
    }
    
    .footer{
     margin: 40px;
    }
    

    このスタイルにより、タスク管理を可能にしながら、ToDo リストがシンプルかつクリーンになります。

    インストールと使用方法

    まず、リポジトリのクローンを作成し、依存関係をインストールします。

    git clone https://github.com/abhishekgurjar-in/todo_list.git
    cd todo-list
    npm install
    npm start
    

    アプリケーションは http://localhost:3000 で実行を開始します。

    ライブデモ

    ここで Todo リストのライブデモをチェックしてください。

    結論

    Todo List プロジェクトは、React で状態、リスト、イベント処理を操作する練習をするのに最適な方法です。 localStorage を使用してセッション間でデータを保持できる便利なアプリケーションを構築する方法を示します。

    クレジット

    • インスピレーション: シンプルで効果的なタスク管理ツールの必要性からインスピレーションを得ました。

    著者

    Abhishek Gurjar は、情熱的な Web 開発者です。 GitHub で彼のプロジェクトをさらにチェックできます。

    以上がReact を使用してテーマ切り替えを使用して Todo アプリを構築するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    Video Face Swap

    Video Face Swap

    完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    「レンダリングブロッキングCSS」とは何ですか? 「レンダリングブロッキングCSS」とは何ですか? Jun 24, 2025 am 12:42 AM

    ブラウザは、特にインポートされたスタイルシート、ヘッダーのインラインCSS、および最適化されていないメディアクエリスタイルを使用して、ブラウザがインラインおよび外部CSSをデフォルトで主要なリソースとして表示するため、ページレンダリングをブロックします。 1.重要なCSSを抽出し、HTMLに埋め込みます。 2。JavaScriptを介して非クリティカルなCSSの読み込みを遅らせる。 3.メディア属性を使用して、印刷スタイルなどのロードを最適化します。 4.リクエストを減らすためにCSSを圧縮およびマージします。ツールを使用してキーCSSを抽出し、REL = "Preload"非同期負荷を組み合わせ、過度の分割と複雑なスクリプト制御を避けるためにメディア遅延荷重を合理的に使用することをお勧めします。

    Autoprefixerとは何ですか?それはどのように機能しますか? Autoprefixerとは何ですか?それはどのように機能しますか? Jul 02, 2025 am 01:15 AM

    Autoprefixerは、ターゲットブラウザスコープに基づいてCSS属性にベンダープレフィックスを自動的に追加するツールです。 1.エラーで接頭辞を手動で維持する問題を解決します。 2. PostCSSプラグインフォーム、CSSを解析し、プレフィックスする必要がある属性を分析し、構成に従ってコードを生成する属性を分析します。 3.使用手順には、プラグインのインストール、ブラウザーリストの設定、ビルドプロセスでそれらを有効にすることが含まれます。 4。メモには、接頭辞を手動で追加しない、構成の更新を保持すること、すべての属性ではなくプレフィックスを維持することが含まれ、プリ​​プロセッサでそれらを使用することをお勧めします。

    conic-gradient()関数とは何ですか? conic-gradient()関数とは何ですか? Jul 01, 2025 am 01:16 AM

    TheConic-Gradient()functionsscreateScular勾配の勾配は、測定されていることを確認してください

    粘着性ヘッダーまたはフッターを作成するためのCSSチュートリアル 粘着性ヘッダーまたはフッターを作成するためのCSSチュートリアル Jul 02, 2025 am 01:04 AM

    to CreateStickyheadersandfooterswithcss、使用ポジション:Stickyforheaderswithtopvalueandz-index、ParentContainersdon’trestrictit.1.forstickyheaders:Setposition:Sticky、Top:0、Z-Index、およびBackgroundColor.2

    CSSカスタムプロパティの範囲は何ですか? CSSカスタムプロパティの範囲は何ですか? Jun 25, 2025 am 12:16 AM

    CSSカスタムプロパティの範囲は宣言のコンテキストに依存します。通常、グローバル変数は次のように定義されます。一方、ローカル変数は、スタイルのコンポーネント化と分離のために特定のセレクター内で定義されます。たとえば、.cardクラスで定義されている変数は、クラスとその子供に一致する要素でのみ使用できます。ベストプラクティスには以下が含まれます。1。使用:ルートトピック色などのグローバル変数を定義する。 2。コンポーネント内のローカル変数を定義して、カプセル化を実装します。 3.同じ変数を繰り返し宣言しないでください。 4.セレクターの特異性によって引き起こされる可能性のあるカバレッジの問題に注意してください。さらに、CSS変数はケースに敏感であり、エラーを回避するために使用する前に定義する必要があります。変数が未定義の場合、または参照が失敗した場合、フォールバック値またはデフォルト値の初期が使用されます。デバッグは、ブラウザ開発者を介して実行できます

    CSSグリッドのFRユニットとは何ですか? CSSグリッドのFRユニットとは何ですか? Jun 22, 2025 am 12:46 AM

    ThefrunitinCSSGriddistributesavailablespaceproportionally.1.Itworksbydividingspacebasedonthesumoffrvalues,e.g.,1fr2frgivesone-thirdandtwo-thirds.2.Itenablesflexiblelayouts,avoidsmanualcalculations,andsupportsresponsivedesign.3.Commonusesincludeequal-

    モバイルファーストデザインに焦点を当てたCSSチュートリアル モバイルファーストデザインに焦点を当てたCSSチュートリアル Jul 02, 2025 am 12:52 AM

    Mobile-firstcsssdesignRequiresTtingtheviewportatatag、使用、stylumsmallscreensup、optimingTouchTargets.first.second、cecond、em、orreminsteadofpixelseders.ths.thsthird、writebasethirdird、addtocontrolscaling.second、addtocontrolscaling.second

    本質的にレスポンシブなグリッドレイアウトを作成する方法は? 本質的にレスポンシブなグリッドレイアウトを作成する方法は? Jul 02, 2025 am 01:19 AM

    本質的な応答性のあるグリッドレイアウトを作成するために、COREメソッドはCSSGridのRepeat(auto-fit、minmax())モードを使用することです。 1.グリッドテンプレートコラムの設定:繰り返し(Auto-Fit、MinMax(200PX、1FR))繰り返して、ブラウザが列の数を自動的に調整し、各列の最小幅と最大幅を制限します。 2。ギャップを使用してグリッド間隔を制御します。 3.コンテナは、幅などの相対ユニットに設定する必要があります。100%、およびボックスサイズを使用してください。幅の計算エラーを回避し、マージンで中央に配置する必要があります。 4.オプションで、行の高さとコンテンツのアライメントを設定して、行などの視覚的な一貫性を向上させます

    See all articles