nextjs 实现TodoList网页应用案例

news2024/10/1 2:01:56

参考:
https://nextjs.org/

Next.js 是用于网络的一种 React 框架。一些世界上最大的公司在使用它,它能够借助 React 组件的力量让您创建高质量的网络应用程序。

1、创建项目:

另外注意:pages与app路由存在冲突,如果有app文件夹删除,比如这里创建的就用src下面app文件夹,整体删除,不然构建项目会报错

npx create-next-app@latest todolist
cd todolist

在这里插入图片描述
在这里插入图片描述

2、创建组件、页面
在这里插入图片描述

pages目录下创建index.js

import { useState, useEffect } from 'react'
import TodoForm from '../components/TodoForm'
import TodoList from '../components/TodoList'

export default function Home() {
  const [todos, setTodos] = useState([])

  useEffect(() => {
    const storedTodos = JSON.parse(localStorage.getItem('todos') || '[]')
    setTodos(storedTodos)
  }, [])

  useEffect(() => {
    localStorage.setItem('todos', JSON.stringify(todos))
  }, [todos])

  const addTodo = (text) => {
    setTodos([{ text, completed: false }, ...todos])
  }

  const toggleTodo = (index) => {
    const newTodos = [...todos]
    newTodos[index].completed = !newTodos[index].completed
    setTodos(newTodos)
  }

  const deleteTodo = (index) => {
    const newTodos = todos.filter((_, i) => i !== index)
    setTodos(newTodos)
  }

  return (
    <div className="container">
      <h1>TodoList</h1>
      <TodoForm addTodo={addTodo} />
      <TodoList todos={todos} toggleTodo={toggleTodo} deleteTodo={deleteTodo} />
    </div>
  )
}

pages目录下创建_app.js

import '../styles/globals.css'

function MyApp({ Component, pageProps }) {
  return <Component {...pageProps} />
}

export default MyApp

在components目录下创建TodoForm.js

import { useState } from 'react'

export default function TodoForm({ addTodo }) {
    const [value, setValue] = useState('')
  
    const handleSubmit = (e) => {
      e.preventDefault()
      if (!value) return
      addTodo(value)
      setValue('')
    }
  
    return (
      <form onSubmit={handleSubmit} className="todo-form">
        <input
          type="text"
          value={value}
          onChange={(e) => setValue(e.target.value)}
          placeholder="Add a todo"
        />
        <button type="submit">Add</button>
      </form>
    )
  }

在components目录下创建TodoList.js:

export default function TodoList({ todos, toggleTodo, deleteTodo }) {
    return (
      <ul className="todo-list">
        {todos.map((todo, index) => (
          <li key={index} className={`todo-item ${todo.completed ? 'completed' : ''}`}>
            <input
              type="checkbox"
              checked={todo.completed}
              onChange={() => toggleTodo(index)}
            />
            <span>{todo.text}</span>
            <button onClick={() => deleteTodo(index)}>Delete</button>
          </li>
        ))}
      </ul>
    )
  }

在styles目录下的globals.css中添加样式

body {
  font-family: Arial, sans-serif;
  max-width: 500px;
  margin: 0 auto;
  padding: 20px;
}

h1 {
  text-align: center;
}

.todo-form {
  display: flex;
  margin-bottom: 20px;
}

.todo-form input {
  flex-grow: 1;
  padding: 10px;
  font-size: 16px;
  border: 1px solid #ddd;
  border-radius: 4px 0 0 4px;
}

.todo-form button {
  padding: 10px 20px;
  font-size: 16px;
  background-color: #4CAF50;
  color: white;
  border: none;
  border-radius: 0 4px 4px 0;
  cursor: pointer;
}

.todo-list {
  list-style-type: none;
  padding: 0;
}

.todo-item {
  display: flex;
  align-items: center;
  padding: 10px;
  background-color: #f9f9f9;
  border: 1px solid #ddd;
  margin-bottom: 10px;
  border-radius: 4px;
}

.todo-item.completed {
  text-decoration: line-through;
  opacity: 0.6;
}

.todo-item input[type="checkbox"] {
  margin-right: 10px;
}

.todo-item button {
  margin-left: auto;
  background-color: #f44336;
  color: white;
  border: none;
  padding: 5px 10px;
  border-radius: 4px;
  cursor: pointer;
}

2、运行

测试

npm run dev

在这里插入图片描述
在这里插入图片描述

构建部署

npm run build

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1979449.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UniApp手机滑块验证组件代码生成器

DIY可视化实现UniApp手机滑块验证组件&#xff0c;支持自定义背景图片、成功提示、错误提示、划动提示等。 手机滑块验证组件是一种广泛应用于手机应用、网页等场景的用户验证机制&#xff0c;其主要目的是通过用户的滑动操作来验证用户的真实性和操作意图&#xff0c;从而增强…

双目视觉标定的一般方法

1 双目立体相机 双目立体相机是由两个单目相机根据 特定的参数组合而成&#xff0c;工作时可将左右两相机捕捉到的二维图像信息转换到三维立体空间 中&#xff0c;进而通过系列转换变为所需要的三维空间坐标信息。 2 一般过程 双目立体相机标定步骤一般有以下几个步骤&#…

RabbitMQ应用场景及特性

RabbitMQ是一款开源的消息队列中间件&#xff0c;拥有非常好用的管理控制面板&#xff0c;类似使用navicat一样&#xff0c;简便的操纵数据库。 应用场景 一、流量削峰 在一些并发量较高的场景下&#xff0c;比如秒杀活动&#xff0c;抢票等&#xff0c;同一时间访问量急剧增…

C#数据类型 全局变量 类型转换方法(汇总)

1、C#和S7-1200PLC S7.NET通信 C#和S7-1200PLC S7.NET通信-CSDN博客文章浏览阅读98次。一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客这篇博客作为C#的基础系列&#xff0c;和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先…

【AI绘画】FLUX:这款新的人工智能图像生成器非常善于创造人手

FLUX.1 是 Stable Diffusion 的公开重量级继承者&#xff0c;可将文本转化为图像。 FLUX.1 dev 生成图像&#xff1a;“A beautiful queen of the universe holding up her hands, face in the background.”。 就在7月下旬&#xff0c;人工智能初创公司黑森林实验室&#xff…

从零入门CV图像竞赛(2024全球Deepfake攻防挑战赛)

从零入门CV图像竞赛&#xff08;2024全球Deepfake攻防挑战赛&#xff09; Deepfake是什么&#xff1f; Deepfake是一种利用深度学习技术&#xff0c;特别是生成对抗网络&#xff08;GANs&#xff09;来实现视频、音频等多媒体内容的伪造技术。这项技术可以实现对视频中人物的…

【2】Swift Dynamic Island开发

文章目录 先新建一个实时活动组件熟悉下实时活动的代码UI代码解析 灵动岛&#xff08;Dynamic Island&#xff09;和实时活动&#xff08;Live Activities&#xff09;是 iPhone 为了便于用户在退出APP时&#xff0c;仍然能随时关注进行中的活动、高频操作的组件。其中: 灵动岛…

快速体验LLaMA-Factory 私有化部署和高效微调Llama3模型(曙光超算互联网平台异构加速卡DCU)

序言 本文以 LLaMA-Factory 为例&#xff0c;在超算互联网平台SCNet上使用异构加速卡AI 显存64GB PCIE&#xff0c;私有化部署Llama3模型&#xff0c;并对 Llama3-8B-Instruct 模型进行 LoRA 微调、推理和合并。 快速体验基础版本&#xff0c;请参考另一篇博客&#xff1a;快…

栈和队列的区别

简介 栈和队列从定义上来讲&#xff0c;只有一个不同&#xff0c;就是栈是先进后出的&#xff0c;而队列是先进先出的&#xff0c;两者不的不同如下所图所示: 栈和队列的实现 从实现上来说&#xff0c;栈和队列都可以用数组或者链表实现&#xff0c;不过从实现难度和时空复杂…

WEB前端16-Vuex状态管理模式

Vue2-Vuex基础 1.Vuex基本概念 在复杂的前端应用程序中&#xff0c;状态管理变得至关重要。Vuex 是 Vue.js 官方提供的状态管理模式和库&#xff0c;它能帮助我们更好地管理应用程序的状态并实现组件间的通信。本文将介绍 Vuex 的基本概念、核心概念和实际应用。 什么是 Vue…

Vue3炫酷的界面

Vanta.js - Animated 3D Backgrounds For Your Website3D & WebGL Background Animations For Your Websitehttps://www.vantajs.com/?effectbirds需要的安装包 npm install three npm install three0.13.4.0npm install vue3.2.37#Vanta JS 依赖 npm install vanta np…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)

1. 函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为&#xff0c;使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。 #include<iostream> u…

传知代码-半监督学习与数据增强(论文复现)

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 本文复现论文 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence[1] 提出的半监督学习方法。 半监督学习&#xff08;Semi-supervised Learning&#xff09;是一种机器学习…

使用Python库开发Markdown编辑器并将内容导出为图片

简介 在本文中&#xff0c;我们将探索如何使用Python的wxPython库开发一个Markdown编辑器应用程序。这个应用程序不仅能浏览和编辑Markdown文件&#xff0c;还可以将编辑的内容导出为PNG图片。 C:\pythoncode\new\markdowneditor.py 完整代码 import wx import markdown2 im…

前端实现下载word(多个word下载)-- docxtemplater

文章目录 &#x1f50e;什么是docxtemplater&#xff1f;&#x1f47b;docxtemplater语法&#x1f47b;普通插值for循环选择图片&#xff08;&#x1f330;代码&#xff09; &#x1f47b;实现下载&#x1f47b;安装依赖&#x1f330;完整代码关键逻辑解释 &#x1f47b;实现多…

CSP-J 复赛 模拟题 解析版

根据解析写代码1&#xff1a; #include <bits/stdc.h> using namespace std; long long a[101010]; long long b[101010]; int main(){bool flag0;long long t;cin>>t;while(t--){long long n,k;cin>>n>>k;for(int i1;i<n;i){cin>>a[i]>…

kickstart自动安装脚本

1、准备阶段 #开启图形 init 5 ​ #安装带GUI的服务器包组 yum -y groupinstall "Server with GUI" ​ #在xshell做需要加X ssh -Xl root 172.25.254.128 ​ #开启图形 gedit ​ 2、kickstart [rootpxe ~]# cat /root/anaconda-ks.cfg #此文件是在系统安装好后…

大数据Flink(一百零九):阿里云Flink的基本名称概念

文章目录 阿里云Flink的基本名称概念 一、层次结构 二、​​​​​​​​​​​​​​概念说明 1、工作空间&#xff08;Workspace&#xff09; 2、项目空间&#xff08;Namespace&#xff09; 3、资源&#xff08;Resource&#xff09; 4、草稿&#xff08;Draft&#…

将本地微服务发布到docker镜像二:

上一篇文章我们介绍了如何将一个简单的springboot服务发布到docker镜像中&#xff0c;这一篇我们将介绍如何将一个复杂的微服务&#xff08;关联mysql、redis&#xff09;发布到docker镜像。 我们将使用以下两种不同的方式来实现此功能。 redis、mysql、springboot微服务分开…

linux的自动检测的脚本:用于检测应用程序状态的linux脚本

目录 一、要求 1、需求内容 2、分析 二、脚本介绍 1、脚本代码 2、脚本解释 &#xff08;1&#xff09;脚本结构 &#xff08;2&#xff09;应用程序和服务列表 &#xff08;3&#xff09;日志文件路径 &#xff08;4&#xff09;测试 URL 列表 &#xff08;5&#…