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 ...
随机推荐
- 自己写的日志框架--linkinLog4j--框架可配置+提性能
OK,上一篇博客我们已经实现了日志框架的基本的功能,但是还有一个最大的问题就是日志输出地不能重定向,然后一些输出也不可控.那现在我们来实现一个比较完整的日志框架. 设计思路如下: 1,定义一堆常量Li ...
- maven核心概念--插件和目标
maven的核心概念有很多,我们这里先来看Plugins和Goals. 在上一篇博客中,我们用两种类型的命令行参数运行了Maven. 第一条命令,create.这是一条单个的插件目标,Archetyp ...
- js中键盘按键对应的键值
js键盘键值 keycode 8 = BackSpace BackSpace keycode 9 = Tab Tab keycode 12 = Clear keycode 1 ...
- hibernate_xml映射exception
错误原因:在通过hibernate指示生成两个表之间的外键关系之后,一个表中引用的外键不在另一个表的参考范围里面. 解决:使之满足参考完整性 org.hibernate.TransientObject ...
- java URL和URLConnection
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 安卓和IOS兼容问题
点击穿透 click延迟 scroll元素临界的bug android screen.w/h 不准 rem不准 scroll时动画失效 animate回调 最小字号限制 不同机型全屏自适应 andro ...
- MySQL权限详解
MySQL权限级别介绍 MySQL权限级别 全局性的管理权限,作用于整个MySQL实例级别 数据库级别的权限,作用于某个指定的数据库上或者所有的数据库上 数据库对象级别的权限,作用于指定的数据库对象上 ...
- oracle光标的使用
以下plsql程序用的scott用户的dept,emp表. 1.光标的使用: --查询并打印员工的姓名名和薪水 /* 光标属性: %found %notfound */ set serveroutpu ...
- SpringMVC源码情操陶冶-InterceptorsBeanDefinitionParser拦截器解析器
解析mvc:interceptors节点 观察下InterceptorsBeanDefinitionParser的源码备注 /** * {@link org.springframework.beans ...
- 51NOD 1584 加权约数和 [莫比乌斯反演 转化 Trick]
1584 加权约数和 题意:求\(\sum_{i=1}^{N} \sum_{j=1}^{N} {\max(i,j)\cdot \sigma(i\cdot j)}\) 多组数据\(n \le 10^6, ...