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网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类, ...
随机推荐
- Undelivered Mail Returned to Sender
电子邮件是使用电子邮件地址application@sample.com从Application发送的. 出于业务原因我们无法在此应用程序中更新/删除无效的外部电子邮件地址,因此响应出站电子邮件会生成许 ...
- Go_day02
Go基础语法 流程控制 一共有三种:顺序结构,选择结构,循环结构 if语句 /* if与else if的区别: 1:if无论是否满足条件都会向下执行,直到程序结束,else if 满足一个条件就会停止 ...
- flask动态csv接口——编码问题
@xxx_blueprint.route("/file", methods=["GET"]) def group_trend(): def generate() ...
- Python中的startswith()函数用法
函数:startswith() 作用:判断字符串是否以指定字符或子字符串开头 一.函数说明语法:string.startswith(str, beg=0,end=len(string)) ...
- IOS开发基础之核心动画 基础动画、关键帧、组动画案例
// // ViewController.m // 30-核心动画 // // #import "ViewController.h" @interface ViewControll ...
- 整合Swagger2
整合Swagger2 1.Swagger介绍 前后端分离开发模式中,api文档是最好的沟通方式. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web ...
- ARP欺骗工具-arpspoof
arpspoof arpspoof是dsniff下的一个ARP欺骗工具 大概原理: 两台主机HostA 和 HostB想要进行通信的流程,那么主机A将需要知道自己的ip,mac 以及主机B的ip, m ...
- 使用RPA有什么好处
通过本章学习,您将了解到: 什么是RPA RPA能为我们做些什么 使用RPA有什么好处 RPA的体系结构是什么 应用RPA是否需要深入了解这项技术 RPA的未来趋势怎么样 什么是RPA? RPA即Ro ...
- linux 镜像备份
linux 镜像备份 使用linux虚拟机的方法 优点 镜像大小比较小 缺点 速度可能比较慢 方法 1.打开虚拟机 我用的ubuntu,读卡器连接电脑虚拟机,ubuntu一般会自动挂载 df -h # ...
- 【单元测试】Junit 4(八)--junit4 内置Rule
1.0 Rules Rules允许非常灵活地添加或重新定义一个测试类中每个测试方法的行为.测试人员可以重复使用或扩展下面提供的Rules之一,或编写自己的Rules. 1.1 TestName ...