React 待办事项列表案例

例:在文本框中输入内容回车后,内容出现在未完成中;点击未完成中的选择框,其内容出现在已完成中,反之亦然;点击删除按钮会删除

新建一个todoList .js文件:

import React from 'react';
import '../assets/css/todoList.css'

class todoList extends React.Component {
    constructor(props) {
        super(props);
        this.state = { 
            list:[
                {
                    title:"PHP",
                    isck:false
                },
                {
                    title:"React",
                    isck:true
                }
            ]
        };
    }
    //回车事件
    keyEnter=(e)=>{
        if(e.which===13){
            let ele=e.target;
            let listinfo={
                title:ele.value,
                isck:false
            }
            let newlist=this.state.list;
            newlist.push(listinfo);
            this.setState({
                list:newlist
            });
            ele.value=""
        }
    }
    //监听事件 
    changeBox=(index)=>{
        let data=this.state.list;
        data[index].isck=!data[index].isck;
        this.setState({
            list:data
        });
    }
    //删除事件
    deleteData=(index)=>{
        let data=this.state.list;
        data.splice(index,1);
        this.setState({
            list:data
        });
    }
    render() {
        return (
            <div className="block">
                <div className="title">
                    <div className="titleleft"><h2>ToDoList</h2></div>
                    <div className="titleright">
                        <input type="text" onKeyPress={this.keyEnter}/>
                    </div>
                </div>
                <hr/>
                <div>
                    <ul>
                        <h3>未完成</h3>
                        {
                            this.state.list.map((v,k)=>{
                                if(!v.isck){
                                    return (
                                        <div key={k}>
                                            <li><input type="checkbox" checked={v.isck} onChange={this.changeBox.bind(this,k)}/>{v.title}--------<button onClick={this.deleteData.bind(this,k)}>删除</button></li>
                                        </div>
                                    )
                                }
                                return ""
                            })
                        }
                        <h3>已完成</h3>
                        {
                            this.state.list.map((v,k)=>{
                                if(v.isck){
                                    return (
                                        <div key={k}>
                                            <li><input type="checkbox" checked={v.isck} onChange={this.changeBox.bind(this,k)}/>{v.title}--------<button onClick={this.deleteData.bind(this,k)}>删除</button></li>
                                        </div>
                                    )
                                }
                                return ""
                            })
                        }
                    </ul>
                </div>
            </div>
        );
    }
}
export default todoList;

CSS样式:

.block{
    width: 600px;
    min-height: 200px;
    margin: 0 auto;
    border: 1px solid silver;
}
.title{
    display: flex;
    flex-direction: row;
    background-color: black;
    box-sizing: border-box;
    padding: 10px 15px;
}
.titleleft{
    color: white;
    flex: 0.5;
}
.titleright{
    flex: 2;
    color: white;
    padding: 20px 15px;
}
.titleright>input{
    width: 250px;
    height: 30px;
    border: 1px solid white;
    outline: none;
    border-radius: 10px;
    padding-left: 10px;
    font-size: 20px;
}

如图所示:
在这里插入图片描述
写入缓存,保持页面统一:
react 封装自定义模块优化代码性能(意思就是将某个功能封装为一个模块在任何组件里面都可以被使用)

  • 封装的模块

新建一个Storage文件夹,在该文件夹下新建一个名为Storage.js的文件,写入:

let storage={
    setStorage(key,value){
        localStorage.setItem(key,JSON.stringify(value));
    },
    getStorage(key){
        return JSON.parse(localStorage.getItem(key));
    },
    removeStorage(key){
        localStorage.removeItem(key);
    }
}
export default storage;
  • 在todolist.js中引用

(1)导入模块

import storage from '../Storage/Storage'

(2)添加写入的缓存
在回车事件中写入:

storage.setStorage("lists",newlist);

在监听、删除事件中写入:

storage.setStorage("lists",data);

其中的newlist,data均为获取时自定义的名字

(3)在react生命周期函数中加载缓存

//页面加载就会触发  渲染完成
componentDidMount(){
     //读取缓存
     let data=storage.getStorage("lists");
     //第一次刷新的时候,data不存在,给list赋值以后,map无法遍历,因此在这里需判断data是否存在
     if(data){
         this.setState({
             list:data
         });
     }
}

如图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值