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网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类, ...
随机推荐
- C知识点
1.变量在内存中所占存储空间的首地址,称为该变量的地址:而变量在存储空间中存放的数据,即变量的值. C语言中,指针就是变量的地址.一个变量的值是另一个变量的地址,且变量类型相同,则称该变量为指针变量. ...
- 搬运工 - Appium Python API 中文版
Appium_Python_Api文档 1.contextscontexts(self): Returns the contexts within the current session. 返回当前会 ...
- 《MySQL是怎样运行的》第八章小结
- 国内免费好用的chatgpt在线应用程序
我们很高兴向大家介绍我们的全新AI微信小程序:AI文案助手,这是一款功能强大的智能助手,可以为您提供多种实用功能. 首先,我们的AI微信小程序拥有一款聊天机器人,能够与您进行自然对话,并为您提供所需的 ...
- windows2003 的安装以及安装时遇到的问题
windows2003 的安装以及安装时遇到的问题 简介:Windows Server 2003是微软于2003年3月28日发布的基于Windows XP/NT5.1开发的服务器操作系统,并在同年4月 ...
- 坚叔:让科幻片的概念变成产品丨编程挑战赛 x 嘉宾分享
前言 本文基于资深创业者@坚叔在「RTE 2022 创新编程挑战赛」宣讲活动中分享内容二次整理. 嘉宾简介:陈坚(坚叔),国内二次元 AR/VR 资深创业者,国内第一批空间虚拟数字化从业人员,获得政府 ...
- 【读书笔记】组合计数中的行列式方法 专题4 Routings: the Lindstrm–Gessel–Viennot lemma
书用的是Handbook of Enumerative Combinatorics (Miklos Bona) 目录 专题4-Routings: the Lindstrm–Gessel–Viennot ...
- 在echaerts中渲染50万条数据的优化方案
背景:项目需求中要在页面上渲染大约50万条左右的波形数据图表 那么如何解决渲染中的卡顿呢? 肯定是要从服务端和前端一起优化这是毋庸置疑的. 1.服务端: 服务端耗时最多的一定是在数据库的筛选数据的行为 ...
- MyBatis各个版本下载 以及 Apache Maven 安装
推荐下面两篇文章:实测有效! MyBatis下载和环境搭建 Maven详细安装教程
- 微信小程序登录页左上角的home图标如何隐藏?wx.hideHomeButton()不生效?
在做微信小程序时,我们一般都会在app.js中去判断当前用户是否已经登录,如果已经登录,会直接跳转到小程序的首页.如果未登录那么直接跳转登录页. 此时我们需要把首页首页作为微信小程序的pages列表中 ...