react——一个todolist的demo

代码如下:
function ToDoListHeader(props) {
return <h1 className={props.className}>ToDoList</h1>
}
class CheckAll extends Component{
changeAll(event){
this.props.selectedChange('all',event.target.checked);
}
batchDel(){
this.props.batchDel();
}
render(){
if(this.props.totalLen > 0){
return <div className="ctr">
<label htmlFor="all">
<input type="checkbox" id="all" onChange={this.changeAll.bind(this)} checked={this.props.totalLen <= this.props.selectedLen}/>
{this.props.totalLen <= this.props.selectedLen ? '取消全选' :'全选'}
</label>
<span className="batchDel" onClick={this.batchDel.bind(this)}>批量删除</span>
</div>
} else {
return null;
}
}
}
class InputBox extends Component{
constructor(props){
super(props);
this.state = {
value:''
}
}
handleKeyDown(event){
if(event.keyCode === 13 && this.state.value.replace(/\s/g,'').length > 0){
this.setState({
value:''
});
this.props.addToDoList(this.state.value);
}
}
handleChange(event){
this.setState({
value:event.target.value
})
}
render(){
return (
<from className="inputBox">
<input type="text" className="input" value={this.state.value} onKeyDown={this.handleKeyDown.bind(this)} onChange={this.handleChange.bind(this)} placeholder="请输入..."/>
<CheckAll totalLen={this.props.totalLen} selectedChange={this.props.selectedChange} selectedLen={this.props.selectedLen} batchDel={this.props.batchDel}/>
</from>
)
}
}
class ToDoItem extends Component{
delItem(){
this.props.delToDoItem(this.props.index);
}
changeCheck(event){
this.props.changeCheck(this.props.index,event.target.checked);
}
render(){
return <li>
<input type="checkbox" onChange={this.changeCheck.bind(this)} checked={this.props.checked}/>
<span>{this.props.label}</span>
<span className="del" onClick={this.delItem.bind(this)}>X</span>
</li>
}
}
class ToDoList extends Component{
render(){
const listItem = Object.keys(this.props.listItems).map((key) => {
return <ToDoItem label={this.props.listItems[key]} key={key} index={key} delToDoItem={this.props.delToDoItem} changeCheck={this.props.changeCheck} checked={this.props.selectedList[key]}/>
});
return <ul className="list">{listItem}</ul>
}
}
function ListFooter(props) {
return <span className="info">一共{props.length}条</span>
}
class ToDoListBox extends Component{
constructor(props){
super(props);
this.state = {
// 列表
list:{},
// 被选中的列表项 {0:true,1:true}
selectedList:{}
}
}
// 向列表中添加条目
addToDoList(item){
this.setState((prevState) => {
// 保证列表中的key不会重复
const keys = Object.keys(prevState.list).sort();
const nextKey = keys.length > 0 ? keys[keys.length-1] * 1 + 1 : 0;
const list = Object.assign(prevState.list,{[nextKey]:item});
return {
list:list
}
})
}
// 从列表中删除条目
delToDoItem(index){
this.setState((prevSate) => {
delete prevSate.list[index];
return {
list:prevSate.list
}
});
this.selectedChange(index,false)
}
// 批量删除
batchDel(){
Object.keys(this.state.selectedList).forEach((key) => {
this.delToDoItem(key);
this.selectedChange(key,false);
})
}
selectedChange(key,checked){
// 取消全选
if(key === 'all' && !checked){
this.setState({
selectedList:{}
});
return;
}
// 全选
if(key === 'all' && checked){
const list = this.state.list;
let selectObj = {};
Object.keys(list).forEach((key) => {
selectObj[key] = true
});
this.setState({
selectedList:selectObj
});
return;
}
// 选择或取消选择某一个
this.setState((prevState) => {
if(checked && !prevState.selectedList[key]){
return {
selectedList:Object.assign(prevState.selectedList,{[key]:true})
}
}
if(!checked && prevState.selectedList[key]){
delete prevState.selectedList[key];
return {
selectedList:prevState.selectedList
}
}
})
}
render(){
const selectedLen = Object.keys(this.state.selectedList).length;
const listLen = Object.keys(this.state.list).length
return (
<div>
<InputBox
addToDoList={this.addToDoList.bind(this)} totalLen={listLen}
selectedLen={selectedLen} selectedChange={this.selectedChange.bind(this)} batchDel={this.batchDel.bind(this)}/>
<ToDoList listItems={this.state.list} delToDoItem={this.delToDoItem.bind(this)} changeCheck={this.selectedChange.bind(this)} selectedList={this.state.selectedList}/>
<ListFooter length={listLen}/>
</div>
)
}
}
class App extends Component {
render() {
return (
<div className="warp">
<logo/>
<ToDoListHeader className="header"/>
<ToDoListBox/>
</div>
);
}
}
react——一个todolist的demo的更多相关文章
- React入门——制作一个TodoList App
源码 import React, { Component, Fragment } from "react"; class TodoList extends Component { ...
- React官网首页demo(单文件实现版)
本博客实现React官网首页上展示的demo, 为了方便直接采用单文件的形式, 如果想完整集成 在自己的项目中, 可以参考React官网的安装指南, 安装Create React App. hello ...
- DRF + react 实现TodoList
在web项目构建中有很多框架可供选择,开发人员对项目的使用选择,有很多的影响因素,其中之一就是框架在定义该项目的单独任务时的复杂性. 简介 本文有如下几个部分: 准备 配置后端 配置APIs 配置前端 ...
- React笔记03——React实现TodoList
1 什么是JSX语法? 原生JS中,要向页面中挂载html标签,标签一定是被引号''包起来的:document.getElementById('root').append('<div>he ...
- 用vuejs实现一个todolist项目
用vue.js实现一个todolist项目:input输入框输入的值会呈现在下方,并且会保存在localStorage里面,而且下方的列表点击之后也会有变化: 完整代码: App.vue <te ...
- 基于angular写的一个todolist
对于新手来说,使用angularjs写一个todolist可以快速入门
- 1.类的加载机制_继承类的加载(一个小的Demo)说明
今天我们先来一个小的Demo来了解类的加载顺序. public class ClassLoaderTest { public static void main(String[] args) { Sys ...
- 第一个ajax小demo
第一个ajax小demo 文章来源:http://blog.csdn.net/magi1201/article/details/44569657
- react+redux+generation-modation脚手架添加一个todolist
当我遇到问题: 要沉着冷静. 要管理好时间. 别被bug或error搞的不高兴,要高兴,又有煅炼思维的机会了. 要思考这是为什么? 要搞清楚问题的本质. 要探究问题,探究数据的流动. TodoList ...
随机推荐
- Ubuntu 11.10 Server下搭建Maven私服
安装Nexus服务的文档可以参考官方站点:http://www.sonatype.com/books/nexus-book/reference/install-sect-install.html ...
- 学Java分布式和高架构,必懂的两大知识点!
今天小编为你们分享阿里巴巴2018年招聘应届毕业生,Java工程师的面试考题,主要分为三种 Java中获取 mysql连接的方式: 第一部分:分布式 三步变成:分布式 1.将你的整个软件视为一个系 ...
- Part 7:自定义admin站点--Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. Python及Django学习QQ群:453 ...
- python并发编程之多进程(实现)
一.multipricessing模块的介绍 python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需要用多线程,python提供了multiproce ...
- strcpy和memcpy
切记,memcpy的头文件是memory.hstrcpy和memcpy主要有以下3方面的区别.1.复制的内容不同.strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组.整型.结构体 ...
- char a[]和char *a的比较
指针和数组存在着一些本质的区别.当然,在某种情况下,比如数组作为函数的参数进行传递时,由于该数组自动退化为同类型的指针,所以在函数内部,作 为函数参数传递进来的指针与数组确实具有一定的一致性,但这只是 ...
- 有关mysql的for update以及 死锁问题
一.先说锁的概念 锁级别: 1.行级锁: InnoDB引擎(也支持表级锁,默认是行级锁),开销大,加锁慢:会出现死锁.锁定粒度最小,发生锁冲突的概率最低,并发度最高. 2.表级锁:MylSAM引擎和M ...
- Core Animation 文档翻译—附录C(KVC扩展)
前言 关于CAAnimation和CALayer类,核心动画扩展了NSKeyValueCoding协议.这个扩展为一些keys添加了默认值,扩大了封装协议,添加了为CGpoint.CGRect.C ...
- SPOJ DIVCNT2 [我也不知道是什么分类了反正是数论]
SPOJ DIVCNT2 - Counting Divisors (square) 题意:求 \[ \sum_{i=1}^n\sigma_0(i^2) \] 好棒啊! 带着平方没法做,考虑用其他函数表 ...
- POJ 3128 Leonardo's Notebook [置换群]
传送门 题意:26个大写字母的置换$B$,是否存在置换$A$满足$A^2=B$ $A^2$,就是在循环中一下子走两步 容易发现,长度$n$为奇数的循环走两步还是$n$次回到原点 $n$为偶数的话是$\ ...