React入门 制作简单的todolist

【demo】使用React+Webpackt做一个简单的todolist 使用Reactk实现一个简单的todolist,实现基本的增删功能 创建项目 创建的todo主要采用node包的方式,使用webpack打包 初始化项目并创建一些基础文件 初始化项目之后,就需要安装所需要的库及其依赖。npm安装方式可以为开发环境或生产选择所安装的依赖。 安装完所需要的依赖之后,配置webpack。 webpack.config.js: var pat 阅读详情

要熟悉组件间的关系,可以通过制作todolist来做到,在此之前我已经使用Vue完成过了
vue学习笔记—搭建简单的todolist
接下来要使用React来完成


首先,我直接使用create-react-app来搭建一个简单的项目
目录如下
在这里插入图片描述
将src中除了App.js,index.js,serviceWorker.js之外的文件删除,目录改为如图
在这里插入图片描述
component下存放组件,assets下存放静态文件,这里为了方便我只用一个css文件
重新编辑index.js和App.js如下

// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import * as serviceWorker from './serviceWorker';

ReactDOM.render(<App />, document.getElementById('root'));

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();
// App.js
import React from 'react';
import ReactDOM from 'react-dom';
import Header from './component/todo/header';
import Add from './component/todo/add';
import List from './component/todo/list';

class App extends React.Component{
    render(){
    return(    
        <div>
            <Header />
            <Add />
            <List />
        </div>
    )
    }
}
export default App;

先简单地写一下三个组件的内容

// header.js
import React from 'react';

class Header extends React.Component{
    render(){    
    return(    
        <div className="header">
            <h1 className="title">todolist</h1>
        </div>
    )}
}

export default Header;
// add.js
import React from 'react';

class Add extends React.Component{
    render(){    
    return(    
        <div className="addContent">
            <p>here is add</p>
        </div>
    )}
}

export default Add;
import React from 'react';

class List extends React.Component{
    render(){    
    return(    
        <div className="contentList">
            <p>here is list</p>
        </div>
    )}
}

export default List;

在这里插入图片描述
出现这个页面说明到这一步没错,接下来我们开始正式写todolist
首先在父组件App.js中写好增删方法和todolist的内容

import React from 'react';
import Header from './component/todo/header';
import Add from './component/todo/add';
import List from './component/todo/list';
import './assets/style/whole.css'

class App extends React.Component{
    constructor(props){
        super(props);
        this.state={
            // todolist的具体内容
            contentList:[{
                id:0,
                title:'todo 1',
                completed:false
            },{
                id:1,
                title:'todo 2',
                completed:false
            }],
            // 计数,每次增加一个新内容时赋值给id然后加1
            count:2
        }
        // 为各个方法绑定this
        this.handleAdd=this.handleAdd.bind(this);
        this.handleDelete=this.handleDelete.bind(this);
        this.handleComplete=this.handleComplete.bind(this);
    }
    // 添加内容
    handleAdd(content){
        content.id=this.state.count++;
        let list=this.state.contentList;
        list.push(content);
        this.setState({
            contentList:list
        })
    }
    // 删除内容
    handleDelete(id){
        let list=this.state.contentList;
        for(let i=0;i<list.length;i++){
            if(list[i].id===id){
                list.splice(i,1);
            }
        }
        this.setState(()=>{
            return {
                contentList:list
            }
        })
    }
    // 内容完成
    handleComplete(id){
        let list=this.state.contentList;
        for(let i=0;i<list.length;i++){
            if(list[i].id==id){
                list[i].completed=!list[i].completed
            }
        }
        this.setState({
            contentList:list
        })
    }
    render(){
        return(
            <div>
                <Header />
                <Add onAddClick={this.handleAdd}/>
                <List 
                    contentList={this.state.contentList} 
                    onDeleteClick={this.handleDelete} 
                    onCompletedChange={this.handleComplete}/>
            </div>
        )
    }
}
export default App;

因为React的数据流是从上往下的,所以我们将todolist的数据和修改(增加和删除)的方法放在父组件中,修改后再传给子组件,在子组件中触发父组件的方法
各个子组件代码如下

// header.js
import React from 'react';

class Header extends React.Component{
    render(){    
    return(    
        <div className="header">
            <h1 className="title">todolist</h1>
        </div>
    )}
}

export default Header;
// add.js
import React from 'react';
import '../../assets/style/whole.css'

class Add extends React.Component{
    constructor(props){
        super(props);
        this.state={
            // 输入框的内容
            title:''
        }
        // 为各个方法绑定this
        this.handleChange=this.handleChange.bind(this);
        this.addContent=this.addContent.bind(this);
    }
    // 将输入的内容绑定在state的title上
    handleChange(e){
        this.setState({
            title:e.target.value
        })
    }
    // 添加内容
    addContent(){
        if(this.state.title!==''){
            let content={
                title:this.state.title,
                completed:false
            }
            // 调用父组件的方法
            this.props.onAddClick(content)
            // 重置输入框内容
            this.setState({
                title:''
            })
        }
    }
    render(){
        return(    
            <div className="addContent">
                <input placeholder="请输入要添加的标题" value={this.state.title} onChange={this.handleChange}/>
                <button onClick={this.addContent}>add</button>
            </div>
        )}
}

export default Add;
// list.js
import React from 'react';
import '../../assets/style/whole.css'

class List extends React.Component{
    constructor(props){
        super(props);
        this.deleteHandle=this.deleteHandle.bind(this);
    }
    deleteHandle(id){
        // 调用父组件的方法
        this.props.onDeleteClick(id);
    }
    render(){  
        // 按列表标题的数量来渲染内容
        const element = this.props.contentList.map((c)=>{
            return(
                <li className="detailContent" key={c.id}>
                    <input type="checkbox" onChange={this.props.onCompletedChange.bind(this,c.id)}/>
                    <span className={c.completed?'haveCompleted':'notCompleted'}>{c.title}</span>
                    <button onClick={this.deleteHandle.bind(this,c.id)}>删除</button>
                </li>
            )
        })
        return(    
            <div className="contentList">
                <ul>
                    {element}
                </ul>
            </div>
        )}
}

export default List;

最后加一点css

ul {
    padding: 0px;
    margin: 0px;
    list-style: none;
}

button {
    cursor: pointer;
}

.detailContent .haveCompleted {
    text-decoration: line-through;
    color: #f00;
}

.detailContent {
    text-align: left;
    padding: 20px;
    margin: 2px;
    font-size: 20px;
    color: #fff;
    background-color: #333;
}

.detailContent span {
    margin: 0 30px;
}

.addContent {
    padding: 10px;
    width: 400px;
    border: 1px #333 solid;
}

.addContent input {
    width: 320px;
    margin-right: 10px;
    border: none;
    outline: none;
    font-size: 24px;
}

.addContent button {
    border: 1px solid #333;
    font-size: 28px;
    color: #fff;
    background-color: #333;
}

大功告成,虽然有点丑,但是完成了基本的内容

react实现todolist 使用React做一个简单的todolist小demo新建一个react项目 todolist写出todolist的基本结构用数组把数据存储起来监听输入框里面的内容,与state 里的inputValue绑定起来实现增加功能实现删除功能将li提取出来用单独作为一个组件,利用props传值修改删除功能,实现子组件通过父组件传过来的方法对父组件通信 新建一个react项目 todolist // 创建r... 阅读详情

相关推荐

qPCRtools | 神仙R包分分钟搞定你的qPCR实验结果!~

1写在前面 不知道大家都是怎么完成qPCR的计算的,在不会R的时候,我是用一个祖传的Excel表进行计算的。🤣 但是,一直有个缺点,如果需要计算的量比较大时,就不方便了,去搜了一下文献,发现了一个最近发表的R包,不仅可以计算反转录的RNA体积,还可以帮助选择定量方法,简直是神仙R包,本期就介绍一下它的使用吧。🥰 感谢原作者的开发,嘿嘿,文末有引用方法。👀 2用到的包 rm(list = ls())library(tidyverse)library(ggsci)library(qPCRtools)librar

m0_72224305的博客 3986

手把手叫你做ToDoList

ToDoList案例:案例介绍 文本框里面输入内容,按下回车,就可以生成待办事项。 点击待办事项复选框,就可以把当前数据添加到已完成事项里面。 点击已完成事项复选框,就可以把当前数据添加到待办事项里面。 但是本页面内容刷新页面不会丢失。 toDoList 分析以及注意点 刷新页面不会丢失数据,因此需要用到本地存储 localStorage。 核心思路: 不管按下回车,还是点击复选框,都是把本地存储的数据加载到页面中,这样保证刷新关闭页面不会丢失数据。 存储的数据格式:var todolist =

码媛小洋的博客 8695

FPGA篮球计分器:从需求分析到模块化实现的实战指南

本文详细介绍了FPGA篮球计分器的设计与实现,涵盖需求分析、模块化设计及实战调试。重点解析了24秒精确倒计时、12分钟比赛计时、比分统计和数码管显示等核心模块的Verilog实现,提供了按键消抖、状态机设计和BCD码处理等关键技术细节,帮助开发者掌握FPGA数字系统设计方法。

sql99的博客 218

ToDoList待办事件(Vue实现)详解

组件化编程流程:(1)拆分静态组件:组件按照功能点拆分,命名不与html元素冲突。(2)实现动态组件:考虑好数据的存放位置,数据是一个组件在用(放在组件自身),还是一些组件在用(放在共同的父组件上面)。(3)实现交互:从绑定事件开始。props适用于:(1).父组件=>子组件 通信(2).子组件==>父组件通信(父组件先给子组件一个函数)使用v-model时要切记:v-model绑定的值不能使props传过来的,因为props是不可以修改的。

weixin_55355282的博客 1962

《AI应用架构师必学:企业AI能力地图构建的高级技巧》

企业AI能力地图,简单来说,是一种可视化工具,它展示了企业在AI领域所具备的各种能力及其相互关系。就如同城市地图展示城市的街道、建筑和设施一样,AI能力地图呈现了企业在数据处理、模型开发、算法应用等多个方面的能力布局。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 819

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 413

使用jQuery制作todolist

使用jQuery制作todolist HTML部分: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-

AmyGeng123的博客 644

通过声音识别鸟类

根据野生鸟类的外表来识别它是一回事。仅仅根据声音来识别同一只鸟是另一回事。除非你是一个熟练的观鸟者,通过声音识别鸟类可能相当具有挑战性德国马尔堡大学的一组数学、计算机科学和生物学研究人员设计了一种快速识别鸟类和监测当地生物多样性的方法。他们使用连接到 NVIDIA 的便携式设备拍摄的录音根据研究人员的说法是一个边缘人工智能系统,“基于分布式系统中运行的嵌入式边缘设备,能够对森林中记录的声景进行高效、连续的评估。”要了解更多信息,请参阅。

分享AI前沿科技 1680

用vue.js写案例——ToDoList待办事项 (步骤和全码解析)

首先在ToDoMain组件中声明并触发自定义事件,传递参数 6 id,接着在App组件中监听自定义事件,当自定义事件被触发时,执行对应的方法,进 行删除操作,删除任务的具体实现步骤如下。单击切换状态区域时,默认状态为all,即显示全部任务,当状态切换为active时, 显示未完成的任务,当状态切换为completed时,显示已完成的任务。② 新建并封装组件。App 组件为根组件,数据在App组件中,现在需要将App根组件中的初始数据传递 到列表区域,ToDoMain组件中。

m0_73490019的博客 2万+

STM32/GD32以太网开发避坑指南:ZLG EPORTM模块调试实战(含YT8512H配置)

本文针对STM32/GD32平台使用ZLG EPORTM模块进行以太网开发时遇到的常见问题,提供了详细的调试实战指南。重点解析了从传统PHY驱动迁移到YT8512H芯片的核心步骤,包括软件复位延时、RMII时钟配置等关键陷阱,并分享了LWIP集成与稳定性验证的实用经验,帮助开发者高效避坑。

rice5的博客 1161

JSBSim开发手册:飞机仿真模型开发指南

JSBSim是一款开源的飞行动力学模型仿真引擎,支持多种飞行器的仿真,包括固定翼飞机、直升机、无人机等。JSBSim的设计目标是提供一个灵活、高效、精确的飞行动力学仿真环境。飞行动力学仿真:实现飞行器的动力学仿真,包括空气动力学、发动机、质量和惯性等模型。控制系统仿真:实现飞行器的控制系统仿真,包括自动驾驶仪、飞控系统等。环境仿真:模拟飞行环境,包括大气模型、风力模型等。本文详细介绍了如何使用C++进行JSBSim开发,包括系统设计、模型实现、代码优化和性能调优等方面的内容。

qq_38334677的博客 4526

JavaScript 实战 —— 实现一个简易的 TodoList(适合前端入门 / 进阶)

本文介绍了一个基于JavaScript的简易TodoList实现方案,涵盖DOM操作、事件绑定和本地存储等核心知识点。通过创建HTML结构和CSS样式,结合JavaScript实现待办事项的增删改查功能,并利用localStorage实现数据持久化。代码可直接复制到HTML文件运行,支持添加任务、勾选完成、编辑内容和删除操作。文章还提出了拓展练习建议,如添加筛选功能或优化响应式布局,适合前端初学者巩固DOM操作和数组方法的应用。整个项目完整展示了Web开发中常见的前端交互实现方式。

2503_94434664的博客 303

YOLOv8 | 代码逐行解析(二) | 从yaml文件到模型定义(代码逐行注释,小白必看)

本文给大家带来的是YOLOv8项目的解读,之前给大家分析了YOLOv8的项目文件分析,这一篇文章给大家带来的是模型训练从我们的yaml文件定义到模型的定义部分的讲解,我们一般只知道如何去训练模型,和配置yaml文件,但是对于yaml文件是如何输入到模型里,模型如何将yaml文件解析出来的确是不知道的,本文的内容接上一篇的代码逐行解析(一) 项目目录分析,本文对于小白来说非常友好,非常推荐大家进行阅读,深度的了解模型的工作原理已经流程,下面我们从yaml文件来讲解。

Snu77的博客 1万+

React 入门 做一个简单todolist

React 入门笔记 做一个简单todolist 文章目录React 入门笔记 做一个简单todolist安装react精简代码下面进行代码修改 第一步,看文档,不多说 安装react 环境准备: 安装node ,去官网下载安装,安装完自带npm包管理工具 根据官网教程,create react app npx create-react-app my-app cd my-app npm s...

逆水行舟,不进则退 4035

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

初探react,用react实现一个todoList功能

初探react,用react实现一个todoList功前言一、react基础1. react简介2. 开发环境搭建3. 工程目录文件简介4. react中最基础的JSX语法二、使用react编写TodoList功能1. 页面构思2. React中的响应式设计思想和事件绑定3. 实现TodoList新增删除功能(1)新增功能(2)删除功能三、对TodoList功能进行进阶操作1. JSX语法细节补充(1)自动转义(2)光标聚焦2. 拆分组件与组件之间的传值3. TodoLi

moandaylab 4110

React + Antd实现简单的todolist

工作中使用vue居多,今天使用 react 来实现一个简易版的 todolist,顺便熟悉一下antd。 项目地址 1. 使用create-react-app创建项目 npx create-react-app antd-todolist 复制代码2. 安装antd并配置按需加载和less 安装antd yarn add antd 复制代码2.引入 react-app-rewired 并修改 ...

weixin_34092455的博客 1175

React入门实战实例——ToDoList实现

摘要: 最近学习了一小段时间的React,对一些React开发组件的基础有了一点认识,跟着教学视频,自己实现了一个ToDoList组件的功能,今天把做这个组件的过程记录一下,加深学习印象,给同样的前端入门者做一个参考。 一、实例展示和功能介绍 1.1 实例展示 视频1.1 1.2 功能介绍 添加待办事项,按enter键确定,同时清空输入框; 通过checkbox是否...

CherishTheYouth的博客 2962

React入门(todoList实例)

ReactJS是由Facebook在2013年5月推出的一款JS前端开源框架,推出时主打特点是函数式编程风格。目前,ReactJS是世界上使用人数最多的前端框架,它拥有全球最健全的文档和社区体系。 对react我也是初学者,有错误的地方敬请指出 JSX简介 JSX就是Javascript和XML结合的一种格式。React发明了JSX,可以方便的利用HTML语法来创建虚拟DOM,当遇到<,JS...

chashao__的博客 427

21、react 制作一个 todoList 组件

上一篇博文我们说了 react 脚手架创建并使用一个组件,OK,那么重点来喽,每个框架学习的必做案例,todoList 功能。

“跟他人学,和自己比” 1500

在React项目中使用mobx实现简单的todolist功能

最终效果: 目录结构 ├── index.jsx //入口文件 ├── Count.jsx //显示页面内容的组件 ├── Button.jsx //按钮组件 ├── store.js //创建一个store,用来集中管理state dispatch action ├── reducer.js //业务逻辑层,对数据进行操作,并返回新的state ├── connect.js //将redux和展示组件做关联,将redux中的属性和方法挂载到组件里 index.js 入口文件: import Reac

蒲公英芽的博客 1075

React入门 - 04(从编写一个简单的 TodoList 说起)

React入门 - 04(从编写一个简单的 TodoList 说起)

千里之行,始于足下! 1082

react-redux 优化简单的todolist

react-redux 优化简单的todolist 为了更好的上手redux我们之前坐个redux实现的redux,那么可能很容易的感受到其中的繁琐,为了解决开发的繁琐,达到快速开发的目的,我们一般会使用react-redux插件,它可以简化Redux流程 我这里只是简单展示一个使用方法,更多内容可以查阅官方文档 安装:npm install --save react-redux 安装官方文档都......

pz1021的博客 1488

React实现Todolist

一个todolist基本的功能点包括: 点击复选框标记完成或者未完成,且相应的文字出现删除线 从列表中移除item 添加item 首先它是由todolist title 、todolist、和addtodo三部分组成。由于todolist title 和addtodo比较简单,在这里只将todolist拆分成组件。 创建一个ListItem组件。含有一个render方法 class List...

csdn_zsdf的博客 9883

React入门:开发一个简单的TodoList应用

准备工作 安装nodejs和npm,设置淘宝镜像等,自行百度。 使用react脚手架来搭建应用 npx craet-react-app appName 执行完得到以下目录结构: 在安装目录下执行npm start,会在浏览器打开localhost:3000: 开始编写 先在src下新建一个TodoItem文件: import React,{Component} from 'react'; ...

wxm1780936497的博客 426

React实现todolist效果

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-U...

Honey_tianming的博客 734

【前端demo】使用ReactJS实现一个TodoList

文章目录最终效果图项目源码目录结构源码课程笔记 最终效果图 项目源码 目录结构 源码 TodoList.js import React, { Component, Fragment } from 'react'; import TodoItem from './TodoItem' import './style.css' //定义一个React组件 class TodoList extends Component { constructor(props) { super(props)

sinat_38368658的博客 601
上一篇: react学习笔记(六)列表渲染
下一篇: LeetCode 16 最接近的三数之和 JavaScript实现
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值