一、项目功能概述

示例网址:http://www.todolist.cn/



功能:

  1. 输入待做事项,回车,把任务添加到 【正在进行】
  2. 【正在进行】 任务,勾选之后,变成已【经完成事项】
  3. 【已完成事务】,勾选之后,变回 【正在进行 】
  4. 最后的删除按钮点之后删除事务

二、项目实现

2.1简单的添加、删除功能

【TodoList2 .js】

import React,{Component} from 'react';
import './css/todolist.css'; class TodoList2 extends Component{
constructor(props){
super(props); this.state={
msg:'待做事项列表',
list:[]
}
} //此处用第2种方法ref获取节点值复习一下之前知识;(正常用e.target.value获取)
handlelist=()=>{
let templist=this.state.list; //获取state里的内容,定义为一个临时列表
templist.push(this.refs.list.value); //把input里的值推到临时列表,返回:一个下标值
this.refs.list.value=''; //添加完成后清除输入框里的内容
this.setState({
list:templist //让列表值等于刚才的临时列表
})
} //删除列表函数
dellist=(key)=>{
let templist=this.state.list;
templist.splice(key,1); // splice方法向/从数组中添加/删除项目,然后返回被删除的项目
this.setState({
list:templist
})
} render(){
return(
<div>
<h1>{this.state.msg}</h1>
<input ref='list' /><button onClick={this.handlelist}>添加</button>
<hr/> <h2>待做事项</h2>
<ol className="list">
{
// 此处map(function(value,key){})如果这样写不加箭头,指向就是document当前文档。加了才指向当前函数
//此处button onclick里写法意思是:把当前函数的当前li的key绑定到dellist函数上去,方法调用
this.state.list.map((value,key)=>{
return(<li key={key}>{value} <button onClick={this.dellist.bind(this,key)}>删除</button></li>)
})
}
</ol>
</div>
)
}
}
export default TodoList2;

【App.js】

import React from 'react';
import './App.css';
import Demo from './components/toDoList2' function App() {
return (
<div className="App">
<Demo />
</div>
);
}
export default App;

【components/css/todolist.css】

.list{
padding-left:440px;
padding-top:80px;
color: blueviolet;
width:200px;
}

效果:在input输入文本后点添加,会自动在待做事项显示;点删除,会删除对应事项;

2.2完整实现

【todolistOk.js】

import React, { Component } from 'react';

class TodoList extends Component {
constructor(props){
super(props); this.state={
msg:'todolist:',
list:[
{title:'录制ionic',checked:true},
{title:'录制nodejs',checked:false},
{title:'录制egg.js',checked:true},
{title:'录制vue',checked:false}
]
}
}
//0.把input值添加到state的list里
addList=(e)=>{
if(e.keyCode==13){ //如果按下的是回车键则执行以下代码
let tempList=this.state.list; //获取state的默认列表为临时列表
let title=e.target.value; //把input输入的值赋值给临时title,此处也可用ref来传值:this.ref.ref_value.value
tempList.push({title:title,checked:false}) //把临时title推到templist临时列表时,checked默认为false
this.setState({ //把临时列表正式加入的state的列表
list:tempList
});
e.target.value=''; //添加成功后清除input为空
}
} //checkbox处理函数注意传过来的key值源自.bind(this,key)
handleCheck=(key)=>{
let tempList=this.state.list;
tempList[key].checked=!tempList[key].checked; //把对应的表的checked的值取反,即:是false变true,是true变false;
this.setState({
list:tempList
})
} //删除事项函数
dellist=(key)=>{
let tempList=this.state.list;
tempList.splice(key,1)
this.setState({
list:tempList
})
} render() {
return (
<div>
{this.state.msg}<input onKeyUp={this.addList} /><br/>
<hr/>
<h2>待办事项:</h2>
<ul>{
this.state.list.map((value,key)=>{
if(value.checked==false){ //!value.checked 也可写成这个
return(
<li key={key}>
<input type='checkbox' checked={value.checked} onChange={this.handleCheck.bind(this,key)} />
{value.title}--
<button onClick={this.dellist.bind(this,key)}>删除</button>
</li>
)
}
})
}</ul><br/> <hr/>
<h2>已完成事项:</h2>
<ul>{
this.state.list.map((value,key)=>{
if(value.checked==true){ //value.checked 也可写成这个
return(
<li key={key}>
<input type='checkbox' checked={value.checked} onChange={this.handleCheck.bind(this,key)} />
{value.title}--
<button onClick={this.dellist.bind(this,key)}>删除</button>
</li>
)
}
})
}</ul><br/>
</div>
);
}
}
export default TodoList;

【App.js】

import React from 'react';
import './App.css';
import Demo from './components/todolistOk' function App() {
return (
<div className="App">
<Demo />
</div>
);
}
export default App;

效果:(功能详情见头部:一、功能概述)(具体样式区别写css即可)

2.3实现Todolist数据本地缓存(生命周期函数)

2.3.0 local storage本地缓存函数

【local storage使用详见】:https://blog.csdn.net/u010132177/article/details/103029716

写入缓存写法:

localStorage.setItem('todolist',JSON.stringify(tempList)); //把表转化为string转化为字符串存入名为todolist的列表

2.3.1生命周期函数:componentDidMount()

【概念】函数名固定,只要页面加载,就会执行此函数内的内容;

页面加载就读取缓存写法:

 //3.生命周期函数componentDidMount()  页面加载就会触发
componentDidMount(){
var todolist=JSON.parse(localStorage.getItem('todolist')); //json.parse转化成对象(获取缓存的数据- 字符串格式)
if(todolist){
this.setState({
list:todolist
})
}
}

详细代码成品:

【todolistOk.js】

功能:

  • 实现页面刷新之后数据也不丢失
  • 具体实现:把数据存入localstorage里,页面加载时直接读取localstorage.
import React, { Component } from 'react';
import { stringify } from 'querystring'; class TodoList extends Component {
constructor(props){
super(props); this.state={
msg:'todolist:',
list:[
/* {title:'录制ionic',checked:true},
{title:'录制nodejs',checked:false},
{title:'录制egg.js',checked:true},
{title:'录制vue',checked:false}
*/
]
}
} //0.把input值添加到state的list里
addList=(e)=>{
if(e.keyCode==13){ //如果按下的是回车键则执行以下代码
let tempList=this.state.list; //获取state的默认列表为临时列表
let title=e.target.value; //把input输入的值赋值给临时title,此处也可用ref来传值:this.ref.ref_value.value
tempList.push({title:title,checked:false}) //把临时title推到templist临时列表时,checked默认为false
this.setState({ //把临时列表正式加入的state的列表
list:tempList
});
e.target.value=''; //添加成功后清除input为空
localStorage.setItem('todolist',JSON.stringify(tempList)); //把表转化为string转化为字符串存入名为todolist的列表
}
} //1. checkbox处理函数注意传过来的key值源自.bind(this,key)
handleCheck=(key)=>{
let tempList=this.state.list;
tempList[key].checked=!tempList[key].checked; //把对应的表的checked的值取反,即:是false变true,是true变false;
this.setState({
list:tempList
})
localStorage.setItem('todolist',JSON.stringify(tempList)); //把表转化为string转化为字符串存入名为todolist的列表
} //2. 删除事项函数
dellist=(key)=>{
let tempList=this.state.list;
tempList.splice(key,1)
this.setState({
list:tempList
})
localStorage.setItem('todolist',JSON.stringify(tempList)); //把表转化为string转化为字符串存入名为todolist的列表
} //3.生命周期函数componentDidMount() 页面加载就会触发
componentDidMount(){
var todolist=JSON.parse(localStorage.getItem('todolist')); //json.parse转化成对象(获取缓存的数据- 字符串格式)
if(todolist){
this.setState({
list:todolist
})
}
} render() {
return (
<div>
{this.state.msg}<input onKeyUp={this.addList} /><br/>
<hr/>
<h2>待办事项:</h2>
<ul>{
this.state.list.map((value,key)=>{
if(value.checked==false){
return(
<li key={key}>
<input type='checkbox' checked={value.checked} onChange={this.handleCheck.bind(this,key)} />
{value.title}--
<button onClick={this.dellist.bind(this,key)}>删除</button>
</li>
)
}
})
}</ul><br/> <hr/>
<h2>已完成事项:</h2>
<ul>{
this.state.list.map((value,key)=>{
if(value.checked==true){
return(
<li key={key}>
<input type='checkbox' checked={value.checked} onChange={this.handleCheck.bind(this,key)} />
{value.title}--
<button onClick={this.dellist.bind(this,key)}>删除</button>
</li>
)
}
})
}</ul><br/>
</div>
);
}
}
export default TodoList;

【App.js】不变

八、React实战:可交互待办事务表(表单使用、数据的本地缓存local srtorage、生命同期函数(页面加载就会执行函数名固定为componentDidMount()))的更多相关文章

  1. 【页面加载】【九九乘法表】【document.write的功能_】【<script>直接显示数组】【声明新变量】

    1.页面加载时向body加载文本.弹出框 <body>        <script>            document.write("<h1>Ja ...

  2. thinkPHP5.0使用form表单提交数据和删除文章,不用TP的提示页面,使用弹出提示信息

    form表单提交数据和删除文章时,TP的默认信息提示页面的看起来不是很好看,想要实现弹窗提示怎么做呢? 前端:可以使用前端的一个知识--iframe,iframe元素会创建包含另外一个文档的内联框架: ...

  3. react 如何处理页面加载时无法将获取缓存信息存入全局变量中

    最近在做一个权限功能时,发现在读取用户公司ID进行列表查询 时,无法钭读取到缓存中的数据存入页面全局变量中进行加载查询 将问题代码整理出来 将信息存入缓存: let menuList = Helper ...

  4. 转: web 页面加载速度优化实战-100% 的飞跃提升

    前言 一个网站的加载速度有多重要? 反正我相信之前来 博主网站 的人至少有 50% 在加载完成前关闭了本站. 为啥捏? 看图 首页完整加载时间 8.18s,看来能进来看博主网站的人都是真爱呀,哈哈. ...

  5. Android简易实战教程--第二十六话《网络图片查看器在本地缓存》

    本篇接第二十五话  点击打开链接   http://blog.csdn.net/qq_32059827/article/details/52389856 上一篇已经把王略中的图片获取到了.生活中有这么 ...

  6. jquery实现表单验证与页面加载之后执行渲染

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 第一百八十六节,jQuery,验证表单插件,Ajax 表单插件,验证和提交表单

    jQuery,验证表单插件,Ajax 表单插件,验证和提交表单 HTML <form id="reg" method="post" action=&quo ...

  8. React 16 加载性能优化指南

    关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已经成为了一个老生常谈的问题. 但随着 React 16 和 Webpack 4.0 的发布,很多过去的优化手段 ...

  9. JAVAEE——BOS物流项目09:业务受理需求分析、创建表、实现自动分单、数据表格编辑功能使用方法和工作单快速录入

    1 学习计划 1.业务受理需求分析 n 业务通知单 n 工单 n 工作单 2.创建业务受理环节的数据表 n 业务通知单 n 工单 n 工作单 3.实现业务受理自动分单 n 在CRM服务端扩展方法根据手 ...

随机推荐

  1. JSP数据交互二

    1.JSP内置对象:JSP内置对象是 Web 容器创建的一组对象,不用通过手动new就可以使用2.JSP9大内置对象:      对象名称 类型 request (请求对象)  javax.servl ...

  2. SQL注入个人理解及思路(包括payload和绕过的一些方式)

    首先本文主要是把我对SQL注入的一些坑和最早学习SQL注入的时候的一些不理解的地方做一个梳理. (本文仅为个人的一点皮毛理解,如有错误还望指出,转载请说明出处,大佬勿喷=.=) 什么是SQL注入呢? ...

  3. django的404,500错误自定义页面的配置

    django404,500错误自定义页面: 1.设置settings文件 DEBUG = False ALLOWED_HOSTS = ['127.0.0.1', 'localhost']或者ALLOW ...

  4. java web开发_购物车功能实现

    java web开发_购物车功能实现 之前没有接触过购物车的东东,也不知道购物车应该怎么做,所以在查询了很多资料,总结一下购物车的功能实现. 查询的资料,找到三种方法: 1.用cookie实现购物车: ...

  5. 梯度下降法的python代码实现(多元线性回归)

    梯度下降法的python代码实现(多元线性回归最小化损失函数) 1.梯度下降法主要用来最小化损失函数,是一种比较常用的最优化方法,其具体包含了以下两种不同的方式:批量梯度下降法(沿着梯度变化最快的方向 ...

  6. extract()和extact_first()的区别

    extract()和extact_first()都是提取Selector的data部分.但现在你要先知道什么是Selector. Selector是选择器的意思.具体定义我不知道,但通过下面的例子,你 ...

  7. 强制找回GitLab管理员账户密码的方法

    为了开发运维工具,我们采用自行搭建的GitLab来管理所有代码.悲催的是最近忘记了管理员账户的密码,而且没有邮件服务器,因此无法接收密码找回的邮件,导致无法新建用户或者项目,这样一来,岂不就成为了一个 ...

  8. CentOS configuration uses the SFTP server

    SFTP,即 SSH 文件传输协议( SSH File Transfer Protocol ),或者说是安全文件传输协议( Secure File Transfer Protocol ).SFTP 是 ...

  9. python isinstance()判断数据类型

    举例: d = (1,2,3) print(isinstance(d,int)) #False print(isinstance(d,tuple)) #True print(isinstance(d, ...

  10. U盘启动盘空间变小

    Windows下管理员身份运行cmd,调用diskpart,约5秒进入程序 磁盘管理中新建卷. 建议使用Rufus制作U盘启动盘.