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 ...
随机推荐
- ECLIPS-S测井系统下的仪器挂接 [TCC模块]
1. 环境 HPUX版本:11.23 Complete Image ECLIPS版本:Rel 5.1i 2. 效果图 3. 用途 为以后在此系统中挂接新仪器打下坚实的基础. 4. 参考资料 ECLIP ...
- JDOJ-P1260 VIJOS-P1083 小白逛公园
首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec Memor ...
- 豹哥嵌入式讲堂:ARM知识概要杂辑(2)- 第一款Cortex-M处理器
1.天生荣耀:ARM Cortex-M处理器由来 ARM公司自2004年推出ARMv7内核架构时,摒弃了以往"ARM+数字"这种处理器命名方法(ARM11之前的处理器统称经典处理器 ...
- echo 0000
一个奇怪的问题,正常状态下如果sql插入失败,则输出0000,代码如下: $stmt=$db->prepare("insert into message(user,title,cont ...
- 基于 HTML5 WebGL 的 3D SCADA 主站系统
这个例子的初衷是模拟服务器与客户端的通信,我把整个需求简化变成了今天的这个例子.3D 的模拟一般需要鹰眼来辅助的,这样找产品以及整个空间的概括会比较明确,在这个例子中我也加了,这篇文章就算是我对这次项 ...
- lodash源码分析之baseFindIndex中的运算符优先级
我悟出权力本来就是不讲理的--蟑螂就是海米:也悟出要造反,内心必须强大到足以承受任何后果才行. --北岛<城门开> 本文为读 lodash 源码的第十篇,后续文章会更新到这个仓库中,欢迎 ...
- 如何在eclipse中配置反编译工具JadClipse
Q:为什么有必要在开发环境中配置反编译工具呢? A: 当运行引用了第三方jar包项目时,突然报出了jar包中的某个类的某一行出现异常.我们想看一下这个class文件的代码时,经常出现了如下图所示的场 ...
- React-Native 系列视频失效补链及一些碎碎念
最近很多朋友联系我要视频链接,说失效了,这边补一下链接,时间问题就不一篇一篇修改了: 链接:https://pan.baidu.com/s/1mj5Cak4 密码:wiq2 注:视频还是建议参考,因为 ...
- Python随笔,day1
#python中不存在单个字符的运算,只有字符串函数 >>> s="www.google.com" >>> s 'www.google.com' ...
- nodejs建立websocket通信
依赖模块 nodejs-websocket 服务端 const ws = require('nodejs-websocket'); console.log('开始建立连接...'); const se ...