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>
    );
  }
}

 

转载于:https://www.cnblogs.com/QxQstar/p/7536916.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的React TodoList组件,包含添加、删除和完成任务的功能,以及任务分组的功能: ```jsx import React, { useState } from "react"; const TodoList = () => { const [inputValue, setInputValue] = useState(""); const [todos, setTodos] = useState([]); const [completedTodos, setCompletedTodos] = useState([]); const [activeTab, setActiveTab] = useState("all"); const handleInputChange = (e) => setInputValue(e.target.value); const handleAddTodo = () => { if (inputValue.trim()) { setTodos([...todos, { id: Date.now(), text: inputValue }]); setInputValue(""); } }; const handleDeleteTodo = (id) => { setTodos(todos.filter((todo) => todo.id !== id)); setCompletedTodos(completedTodos.filter((todo) => todo.id !== id)); }; const handleCompleteTodo = (id) => { const todo = todos.find((todo) => todo.id === id); setTodos(todos.filter((todo) => todo.id !== id)); setCompletedTodos([...completedTodos, todo]); }; const handleTabClick = (tab) => setActiveTab(tab); const getVisibleTodos = () => { switch (activeTab) { case "completed": return completedTodos; case "active": return todos; default: return [...completedTodos, ...todos]; } }; const visibleTodos = getVisibleTodos(); return ( <div> <input value={inputValue} onChange={handleInputChange} /> <button onClick={handleAddTodo}>Add</button> <ul> {visibleTodos.map((todo) => ( <li key={todo.id}> <span style={{ textDecoration: todo.completed ? "line-through" : "" }} onClick={() => todo.completed ? null : handleCompleteTodo(todo.id) } > {todo.text} </span> <button onClick={() => handleDeleteTodo(todo.id)}>X</button> </li> ))} </ul> <div> <button onClick={() => handleTabClick("all")}>All</button> <button onClick={() => handleTabClick("active")}>Active</button> <button onClick={() => handleTabClick("completed")}>Completed</button> </div> </div> ); }; export default TodoList; ``` 这个组件包含一个输入框和添加按钮,用于添加新的任务。任务列表分为两个部分:未完成的任务和已完成的任务。任务可以被删除或标记为已完成。还有三个按钮,用于切换任务列表的显示模式:显示所有任务、只显示未完成的任务、只显示已完成的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值