react之todoList基础小项目
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基础小项目的更多相关文章
- java基础小项目练习之1----3天做出飞机大战
Shoot射击游戏第一天一. 关键问题(理论):1. 简述FlyingObject.Enemy.Award.Airplane.Bee.Bullet.Hero之间的继承与实现关系2. 简述Hero类构造 ...
- 基于vue 、vue-router 、firebase的todolist小项目
第一次写博客,都不知道改怎么写的好. 本着一颗学习的心,也希望一段时间后再回来在看看自己写的代码,会不会让自己有种不忍直视的念头 *-* 还是先上图吧~ 这是首页,主要是展示所有的列表页面,可以通过输 ...
- Native VS React Native VS 微信小程序
随着React Native和 微信小程序的出现,Native一家独大的局面出现裂痕,很多小公司使用已经正在着手微信小程序和React Native了,我公司就已经走上React Native之路.那 ...
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- 老王Python培训视频教程(价值500元)【基础进阶项目篇 – 完整版】
老王Python培训视频教程(价值500元)[基础进阶项目篇 – 完整版] 教学大纲python基础篇1-25课时1.虚拟机安装ubuntu开发环境,第一个程序:hello python! (配置开发 ...
- MOGRE学习笔记(3)--MOGRE小项目练习
学习OGRE有一段时间了,领导为了检测学习效果,根据已有C++项目,弄一个类似的用c#语言编写的小项目. 配置:win7,DirectX2009,vs2010. 项目要求: 1.有Ogre窗口(尺寸1 ...
- Java小项目--坦克大战(version1.0)
Java小项目--坦克大战<TankWar1.0> 这个小项目主要是练习j2se的基础内容和面向对象的思想.项目实现了基本的简单功能,我方一辆坦克,用上下左右键控制移动方向,按F键为发射炮 ...
- 一个 Vue & Node 的全栈小项目
约学 - 可以寻找一起自习的小伙伴的Web APP 一个基于 Vue & Node 的移动端全栈小项目 在线演示(请使用移动端查看效果) 源码地址: https://github.com/G- ...
- Sudoku 小项目
Sudoku 小项目 - 软工第二次作业 Part 1 · 项目相关 Github 地址: https://github.com/TheSkyFucker/Sudoku 项目的更多信息以及所有开发文档 ...
- python网页爬虫小项目开发
这是我最近接的一个小项目,花了是整整四天多时间. 任务是将http://www.examcoo.com/index/detail/mid/7网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类, ...
随机推荐
- NDVI批量处理排除值-3000
代码如下: import arcpy from arcpy import env from arcpy.sa import * import sys reload(sys) sys.setdefaul ...
- https加密过程!!! 这才是差不多非常详细的https双方获取共用的秘钥过程!!!!!
前言 先说看了一天各种博客让我恶心的地方,恶心死了,发现每个人说的第一次发送的内容,数字证书里面包含啥,都有各种不一样!到了最后忽然想起来直接搜着报文就行了. 比如这个博客LS/SSL 协议详解 (9 ...
- sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)
小志志和小峰峰的日常 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小志志和小峰峰特别喜欢一起讨论一些很好玩的问题. ...
- Why WebRTC|“浅入深出”的工作原理详解
前言 近几年实时音视频通信应用呈现出了大爆发的趋势.在这些实时通信技术的背后,有一项不得不提的技术--WebRTC. 今年 1 月,WebRTC 被 W3C 和 IETF 发布为正式标准.据调研机构 ...
- CF1037H Security题解
根据字典序的定义,位置大的大于长度长的,长度长的大于长度短的. 所以我们贪心,先追求长度长的,再追求后面的位置大的,再追求前面的位置大的. 我们要一个能遍历子串的结构,就选 SAM 得了. 还有个限制 ...
- GUI编程--1
GUI编程--1 GUI是什么 (Graphical User Interface),即用户图形界面编程. 怎么玩 平时怎么运用 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 1.简介 ...
- IP代理的使用 IP代理爬取视频
IP代理的使用 IP代理的分类 透明代理:目标网址知道你使用了代理并且知道你的源IP地址 匿名代理:匿名程序比较低 也就是网站知道你使用代理 但是查不出来源IP地址 高匿代理:网站不知道你使用了代理 ...
- day3 函数的定义和调用,练习编写简单的程序(记录2)
一.值传递.指针传递.引用传递 值传递: 在值传递中,函数的形参是由实参的副本初始化的,也就是说,函数内部操作的是实参的一个拷贝.值传递适用于传递简单数据类型(如整数.浮点数.字符等)以及小型结构体等 ...
- 集合-HashMap 源码详细分析(JDK1.8)
1. 概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值 ...
- [Web Server]Tomcat调优之工作原理、线程池/连接池
1 Tomcat 概述 Tomcat隶属于Apache基金会,是开源的轻量级Web应用服务器,使用非常广泛. 1.0 Tomcat 容器与原理 1.0.1 Tomcat组件构成 注意,如图所示,阴影部 ...