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 ...
随机推荐
- String 类的选择输出
package com.day_08.strings; /* * 通过API可知/String是在Java.lang包下的类,所以不用导包 */ public class StringDemo { p ...
- JDBC (五)
1 使用dbutils进行一对多.多对多的开发 1.1 准备 mysql驱动的pom.xml <!-- https://mvnrepository.com/artifact/mysql/mysq ...
- PHP读取XML文件
xml主键被json取代,大概了解一下就OK了 简要: 加载xml文件:$xml = simplexml_load_file('sa.xml');//$xml是一个对象 读取节点:echo $xml- ...
- wer
概述 快速入门流程: 使用叮当扫码产品请遵循以下操作步骤: 1. 新建项目信息 2. 新建产品信息 3. 添加发货产品 4. 发货 5. 收货 (具体使用操作请查看详细的使用说明) 文档目的: 本文档 ...
- 编译原理-NFA构造DFA
本题摘自北邮的编译原理与技术. 首先,根据此图构造状态转换表 表中第一列第一行表示从第一个符号B通过任意个空转换能到达的节点,Ia表示由此行的状态数组({B,5,1}可以看作0状态)经过一个a可以到达 ...
- python使用上下文管理器实现sqlite3事务机制
如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制. 1.python上下文管理(with) python上下文管理(context),解决的是这样一类 ...
- Python学习一:基础语法
---恢复内容开始--- 本博客主要记录学习Python的过程(按照金角大王老师课程学习),整理所学知识,扎实基础.如有错误,望批评指正. 1.Python所擅长的领域 Python是一门解释型语言, ...
- sphinx的再创造coreseek的安装过程
CoreSeek详细安装过程:coreseek-3.2.14.tar.gz下载链接: http://pan.baidu.com/s/1o6DNesE 解压缩安装mmseg分词程序: .tar.gz c ...
- 如何将top命令输出重定向为文件
命令: # top -b -n 2 -d 3 > /tmp/top.out 解析: -b: batch 模式,可以重定向到文件中 -n:一共取2次top数据 -d:每次top数据间隔为3秒
- Springboot security cas整合方案-实践篇
承接前文Springboot security cas整合方案-原理篇,请在理解原理的情况下再查看实践篇 maven环境 <dependency> <groupId>org.s ...