搜索
首页web前端css教程使用 React 构建主题切换的 Todo 应用程序

Building a Todo App with Theme Toggle Using React

介绍

在本教程中,我们将使用 React 构建一个 待办事项列表 Web 应用程序。该项目有助于理解状态管理、事件处理以及在 React 中使用列表。对于想要增强 React 开发技能的初学者来说,它是完美的选择。

项目概况

待办事项列表应用程序允许用户添加、标记为已完成和删除任务。它提供了一个干净的界面来管理日常任务。该项目展示了如何使用 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:处理待办事项列表的显示和管理。
  • TodoItem.jsx:管理单个待办事项,包括将它们标记为已完成或删除它们。

代码说明

待办事项列表组件

该组件处理整个待办事项列表的状态,包括添加新任务和渲染列表。

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 id="Todo-List">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 id="TODO">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 确保待办事项列表应用程序用户友好且响应迅速。

    * {
      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;
    }
    

    这些样式确保待办事项列表简单干净,同时允许任务管理。

    安装与使用

    首先,克隆存储库并安装依赖项:

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

    应用程序将在 http://localhost:3000 开始运行。

    现场演示

    在此处查看待办事项列表的现场演示。

    结论

    Todo List 项目是练习在 React 中使用状态、列表和事件处理的好方法。它演示了如何构建一个有用的应用程序,可以使用 localStorage 跨会话保存数据。

    制作人员

    • 灵感:受到对简单有效的任务管理工具的需求的启发。

    作者

    Abhishek Gurjar 是一位充满热情的 Web 开发人员。你可以在 GitHub 上查看他的更多项目。

    以上是使用 React 构建主题切换的 Todo 应用程序的详细内容。更多信息请关注PHP中文网其他相关文章!

    声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    '订阅播客”链接应在哪里?'订阅播客”链接应在哪里?Apr 16, 2025 pm 12:04 PM

    有一段时间,iTunes是播客中的大狗,因此,如果您将“订阅播客”链接到喜欢:

    浏览器引擎多样性浏览器引擎多样性Apr 16, 2025 pm 12:02 PM

    当他们在2013年去Chrome时,我们失去了歌剧。与Edge今年早些时候也进行了同样的交易。迈克·泰勒(Mike Taylor)称这些变化为“减少

    网络共享的UX注意事项网络共享的UX注意事项Apr 16, 2025 am 11:59 AM

    从垃圾点击诱饵网站到大多数出版物的最多,共享按钮长期以来一直无处不在。然而,这些

    每周平台新闻:Apple部署网络组件,渐进的HTML渲染,自托管关键资源每周平台新闻:Apple部署网络组件,渐进的HTML渲染,自托管关键资源Apr 16, 2025 am 11:55 AM

    在本周的综述中,Apple进入Web组件,Instagram如何插入脚本以及一些思考的食物,以进行自托管关键资源。

    git Pathspecs以及如何使用它们git Pathspecs以及如何使用它们Apr 16, 2025 am 11:53 AM

    当我查看GIT命令的文档时,我注意到其中许多人都有选择。我最初以为这只是一个

    产品图像的彩色拾取器产品图像的彩色拾取器Apr 16, 2025 am 11:49 AM

    听起来有点像一个困难的问题,不是吗?我们经常没有成千上万种颜色的产品镜头,以便我们可以随身携带。我们也不是

    黑暗模式与React和Themeprovider切换黑暗模式与React和Themeprovider切换Apr 16, 2025 am 11:46 AM

    我喜欢网站具有“暗模式”选项时。黑暗模式使我更容易阅读网页,并帮助我的眼睛更放松。许多网站,包括

    带有HTML对话框元素的一些动手带有HTML对话框元素的一些动手Apr 16, 2025 am 11:33 AM

    这是我第一次查看HTML元素。我已经意识到了一段时间,但是尚未将其旋转。它很酷,

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热门文章

    R.E.P.O.能量晶体解释及其做什么(黄色晶体)
    4 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳图形设置
    4 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您听不到任何人,如何修复音频
    1 个月前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.聊天命令以及如何使用它们
    1 个月前By尊渡假赌尊渡假赌尊渡假赌

    热工具

    WebStorm Mac版

    WebStorm Mac版

    好用的JavaScript开发工具

    适用于 Eclipse 的 SAP NetWeaver 服务器适配器

    适用于 Eclipse 的 SAP NetWeaver 服务器适配器

    将Eclipse与SAP NetWeaver应用服务器集成。

    VSCode Windows 64位 下载

    VSCode Windows 64位 下载

    微软推出的免费、功能强大的一款IDE编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    Atom编辑器mac版下载

    Atom编辑器mac版下载

    最流行的的开源编辑器