1.项目最终成品和项目目录快照如图:

2.context.js文件

// 使用context进行多级传递数据
// 1. createContext 创建一个可以多级传递的context数据
// 2. 使用 上一步创建的 conext ,提供一个 Provider 的提供器组件,把想要使用 context里面的数据的组件包起来,用来发送数据
// 3. 在需要使用 context里面的数据的后代组件里面使用 Consumer 的组件来进行数据的获取
// Consumer只能使用函数的方式返回一个jsx结构来进行数据的渲染
import { createContext } from "react"; // context里面的默认数据
const defVal = (id) => {};
const TodoContext = createContext(defVal); //defVal 作用是 约定数据的格式 export default TodoContext;

3.Todo.jsx文件

// 这是最外层的组件
import React, { Component } from "react";
import TodoAdd from "./TodoAdd";
import TodoList from "./TodoList";
import "./todo.css";
// 导入 TodoContext
import TodoContext from "./context";
const { Provider, Consumer } = TodoContext; // 父传子
// 1.自定义属性,2.在子组件里面使用props接收 // 子传父
// 1.自定义属性把一个可以修改父组件数据的方法传递给子组件
// 2.在子组件里面调用父组件传递进来方法来把数据传递回来 let id = 2; export default class Todo extends Component {
constructor(props) {
super(props);
this.state = {
list: [
{ id: 1, content: "明天要下大雨", isDone: false },
{ id: 2, content: "后天下太阳", isDone: true },
],
};
}
add(newVal) {
// 得到原来的数据
const list = this.state.list;
// 修改过后
list.push({ id: ++id, content: newVal, isDone: false });
// 把新的数据set回去
this.setState({
list,
});
}
// 用于删除的方法
remove(id) {
// 根据id得到数据对应的索引
// Array.prototype.findIndex(item=>条件), 得到满足条件的第一个元素的索引
const idx = this.state.list.findIndex((item) => item.id === id);
// 根据索引使用splice方法删除
const list = this.state.list;
list.splice(idx, 1);
this.setState({ list });
}
render() {
return (
<Provider value={this.remove.bind(this)}>
{/* <Consumer>
{(val) => {
return <div>{val.length}</div>;
}}
</Consumer> */}
<div className="todo">
<h1>TodoListDemo</h1>
{/* 用于添加的子组件 */}
<TodoAdd addFn={this.add.bind(this)} />
{/* 两个列表 */}
{/* 正在进行 */}
<TodoList
data={this.state.list.filter((item) => !item.isDone)}
title="正在进行"
/>
{/* 已经完成 */}
<TodoList
data={this.state.list.filter((item) => item.isDone)}
title="已经完成"
/>
</div>
</Provider>
);
}
}

4.TodoAdd.jsx文件

// 实现添加功能的子组件
import React, { Component } from "react";
// 受控组件和非受控组件
// 受控 -- input表单受到state的控制 export default class TodoAdd extends Component {
constructor(props) {
super(props);
console.log(this.props);
this.state = {
val: "",
};
}
onClick() {
// 修改父组件的数据 -- 子传父
this.props.addFn(this.state.val);
// 清空
this.setState({ val: "" });
}
change(e) {
// 把输入框的内容赋值给 state.val
// 得到 内容
// console.log(e.target.value);
// 赋值
this.setState({
val: e.target.value,
});
}
render() {
return (
<div className="add">
<input
type="text"
value={this.state.val}
onChange={this.change.bind(this)}
/>
<button onClick={this.onClick.bind(this)}>添加</button>
</div>
);
}
}

5.TodoList.jsx文件

// 两个列表的子组件
import React, { Component } from "react";
import TodoListItem from "./TodoListItem"; export default class TodoList extends Component {
// props 就是我们从父组件传递进来的数据
constructor(props) {
super(props);
// console.log(props); this.s
}
render() {
return (
<div className="list">
<h2>{this.props.title}</h2>
<TodoListItem data={this.props.data} />
</div>
);
}
}

6.TodoListItem.jsx文件

// 列表事件的子组件
import React, { Component } from "react";
import TodoContext from "./context";
const { Consumer } = TodoContext; export default class TodoListItem extends Component {
render() {
return (
<div>
{this.props.data.map((item) => (
<div className="item" key={item.id}>
<input type="checkbox" checked={item.isDone} />
<p>{item.content}</p>
<Consumer>
{(val) => <span onClick={() => val(item.id)}>删除</span>}
</Consumer>
{/* <Consumer>{(val) => <div>{typeof val}</div>}</Consumer> */}
</div>
))}
</div>
);
}
}

7.todo.css文件

* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.todo {
width: 600px;
box-shadow: 0 0 4px 2px #ccc, 0 0 4px 2px #ccc inset;
margin: 100px auto;
padding: 20px;
}
.add {
display: flex;
padding: 40px;
}
.add input {
width: 400px;
height: 40px;
outline: none;
border: 1px solid #ccc;
padding: 0 20px;
}
.add button {
width: 100px;
}
.list {
padding: 20px;
}
.item {
display: flex;
align-items: center;
border-bottom: 1px dashed #ccc;
}
.item p {
flex: 1;
line-height: 40px;
padding-left: 20px;
}

react之todoList基础小项目的更多相关文章

  1. java基础小项目练习之1----3天做出飞机大战

    Shoot射击游戏第一天一. 关键问题(理论):1. 简述FlyingObject.Enemy.Award.Airplane.Bee.Bullet.Hero之间的继承与实现关系2. 简述Hero类构造 ...

  2. 基于vue 、vue-router 、firebase的todolist小项目

    第一次写博客,都不知道改怎么写的好. 本着一颗学习的心,也希望一段时间后再回来在看看自己写的代码,会不会让自己有种不忍直视的念头 *-* 还是先上图吧~ 这是首页,主要是展示所有的列表页面,可以通过输 ...

  3. Native VS React Native VS 微信小程序

    随着React Native和 微信小程序的出现,Native一家独大的局面出现裂痕,很多小公司使用已经正在着手微信小程序和React Native了,我公司就已经走上React Native之路.那 ...

  4. 小项目特供 贪吃蛇游戏(基于C语言)

    C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...

  5. 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】

    老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...

  6. MOGRE学习笔记(3)--MOGRE小项目练习

    学习OGRE有一段时间了,领导为了检测学习效果,根据已有C++项目,弄一个类似的用c#语言编写的小项目. 配置:win7,DirectX2009,vs2010. 项目要求: 1.有Ogre窗口(尺寸1 ...

  7. Java小项目--坦克大战(version1.0)

    Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...

  8. 一个 Vue & Node 的全栈小项目

    约学 - 可以寻找一起自习的小伙伴的Web APP 一个基于 Vue & Node 的移动端全栈小项目 在线演示(请使用移动端查看效果) 源码地址: https://github.com/G- ...

  9. Sudoku 小项目

    Sudoku 小项目 - 软工第二次作业 Part 1 · 项目相关 Github 地址: https://github.com/TheSkyFucker/Sudoku 项目的更多信息以及所有开发文档 ...

  10. python网页爬虫小项目开发

    这是我最近接的一个小项目,花了是整整四天多时间. 任务是将http://www.examcoo.com/index/detail/mid/7网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类, ...

随机推荐

  1. TensorFlow 的 Graph 模式转换

    定义 TensorFlow 图形并将其保存到磁盘上. 使用 TensorFlow 的 tf.Graph() 和 tf.Session() 函数来定义和运行 TensorFlow 图形,并使用 tf.t ...

  2. Pytorch基础复习

    项目推进中期,重新到头来学Pytorch.five落泪了.(╬▔皿▔)凸 笑死,憋不住了,边更边学. 整篇博客整体采用总分总形式.首先将介绍内容(加黑部分)之间关系进行概括,后拆解,最后以图总结. 全 ...

  3. 全网最详细中英文ChatGPT接口文档(一)开始使用ChatGPT——导言

    目录 Introduction 导言 Overview 概述 Key concepts 关键概念 Prompts and completions 提示和完成 Tokens 标记/符号 Models 模 ...

  4. Jira使用浅谈篇二

    本篇参考:https://university.atlassian.com/student/collection/850385/path/1083901 本篇接上文,上文已经对项目设置了一个基础的配置 ...

  5. Stanford CS 144, Lab 0: networking warmup 实验

    Stanford CS 144, Lab 0: networking warmup Finish Stanford CS144 lab0 and pass the test. 2023/03/29 - ...

  6. GKCTF X DASCTF应急挑战杯-Maple_root-Writeup

    GKCTF X DASCTF应急挑战杯-Maple_root-Writeup 参赛队员: b4tteRy, x0r, f1oat 最终成绩:2285 最终排名:27 总结 经过最近几次类线下的演练,感 ...

  7. ICMP隐蔽隧道攻击分析与检测(三)

    • ICMP隧道攻击工具特征分析 一.原理 由于ICMP报文自身可以携带数据,而且ICMP报文是由系统内核处理的,不占用任何端口,因此具有很高的隐蔽性. 通过改变操作系统默认填充的Data,替换成自己 ...

  8. 《HelloTester》第4期

    1.前言 终于到了谈面试的部分了! 我在这也说明一下,有同学说之前简历篇的时候一直在说项目的介绍,而面试官真正关心的是技术啊?我在这做个解释,因为我写的这些文章主要针对的是软件测试的同学,所以其他职位 ...

  9. 【Note】(坑)一些组合恒等式的实际意义理解(和待填坑的组合数学知识)

    目录 排列组合 恒等式 (1) \(C_n^m=C_n^{n-m}\) (2) \(A_n^m+mA_n^{m-1}=A_{n+1}^m\) (3) \(C_n^{m-1}+C_n^{m}=C_{n+ ...

  10. 一文吃透Arthas常用命令!

    Arthas 常用命令 简介 Arthas 是Alibaba开源的Java诊断工具,动态跟踪Java代码:实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JVM相关问题排查工作 .支持JDK ...