react学习之 todolist制作, es6最新写法
2018-01-24 14:23
513 查看
文件结构在todolist文件夹内,划分为三个组件。主组件为todoIndex.js;另外两个为子组件;(react初始化的脚手架为create-react-app,在此基础上进行开发的)
主组件代码如下:
子组件(list列表项和删除按钮)代码如下:
子组件(输入框和保存按钮)代码如下:
最终实现的效果如下:
不足之处:输入任务保存时,我做的是随机生成0或者1,分别代表已完成和未完成的任务,在任务总计时数量是对的,已完成在点击保存按钮时并没有及时更新数量,删除一项任务时,已完成任务数量就会统计出来。这点小bug,后续再研究。。。
主组件代码如下:
import React, {Component} from 'react'; import ListItem from "./listItem"; import Dialog from "./dialog"; const container = { margin: "20px auto", width: "80%", paddingBottom: "20px", height: "auto", backgroundColor: "#d4d4d4" }; const title = { textAlign: "center", color: "#000", fontSize: "30px" }; const list = { width: "100%", fontSize: "20px", color: "#f1f1f1", textAlign: "left", margin:"0", padding:"10px 30px" }; const totalNumber = { listStyle:"none", textAlign:"left", padding:"0 20px", width:"60%", color:"#ff8302", display:"flex", justifyContent:"space-between" }; export default class ToDoList extends Component { constructor(props) { super(props); //初始任务状态 this.state = { list: [{ id: 0, name: "吃饭", status: 0 }, { id: 1, name: "睡觉", status: 0 }, { id: 2, name: "打豆豆", status: 0 }], finished: 0 }; } //将新任务添加到数组 addTask(newItem) { let allTask = this.state.list; allTask.push(newItem); this.setState({ list: allTask }) } //更新已完成任务数量 updateFinished(todoItem) { let sum = 0; this.state.list.forEach((item) => { if (item.id === todoItem.id) { item.status = todoItem.status } if (item.status === 1) { sum++ } }); this.setState({ finished: sum }) } //更新所有任务列表总数 updateTotal(todoItem) { let obj = [], sum = 0; this.state.list.forEach((item) => { if (item.id !== todoItem.id) { obj.push(item); if (item.status === 1) { sum++ } } }); this.setState({ list: obj, finished: sum }) } render() { return ( <div style={container}> <h1 style={title}>To Do List</h1> <ul style={list}> {this.state.list.map((item, index) => <ListItem item={item} finishedChange={this.updateFinished.bind(this)} totalChange={this.updateTotal.bind(this)} key={index} /> )} <li style={totalNumber}> <span> 已完成:{this.state.finished} </span> <span> 总计:{this.state.list.length} </span> </li> </ul> <Dialog addNewTask={this.addTask.bind(this)} nums={this.state.list.length}/> </div> ) } }
子组件(list列表项和删除按钮)代码如下:
import React, {Component} from 'react'; const deleteButton = { cursor:"pointer", color:"#f6f6f6", fontSize:"16px" }; export default class ListItem extends Component { constructor(props) { super(props); this.handleFinished = this.handleFinished.bind(this); this.handleDelete = this.handleDelete.bind(this) } handleFinished() { let status = this.props.item.status; status = (status === 0 ? 0 : 1); let obj = { id: this.props.item.id, name: this.props.item.name, status: status }; this.props.finishedChange(obj) } handleDelete() { this.props.totalChange(this.props.item) } render() { const item = this.props.item; const unFinish = { width:"70%", color: "#1b00ea", listStyle:"none", display:"flex", justifyContent:"space-around" }; const finish = { width:"70%", color: "#090563", listStyle:"none", textDecoration: "line-through", display:"flex", justifyContent:"space-around", }; let itemStyle = item.status === 0 ? unFinish : finish; return ( <li key={item.id} style={itemStyle}> <span onChange={this.handleFinished} id={item.id}> {item.id} </span> <span style={{color: item.status === 0 ? "#1804ff" : "red"}}> {item.name} </span> <span onClick={this.handleDelete} style={deleteButton}> Delete </span> </li> ) } }
子组件(输入框和保存按钮)代码如下:
import React, {Component} from 'react'; const taskStyle = { textAlign:"center", fontSize:"24px", }; const ipt = { width:"50%", height:"30px", textIndent:"10px" }; const btn = { width:"100px", height:"30px" }; export default class Dialog extends Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this) } handleClick() { let len = this.props.nums; let newId = len > 0 ? len : 0; let value = this.refs.myText.value; if (value !== "") { let obj = { id: newId, name: value, status: Math.floor(Math.random()*2) }; this.refs.myText.value = ""; this.props.addNewTask(obj) } } render() { return ( <div style={taskStyle}> <div> <h5>Add Your Task</h5> <input type="text" ref="myText" placeholder="i want to do ..." style={ipt}/> </div> <div> <input type="button" value="Save Task" onClick={this.handleClick} style={btn} /> </div> </div> ) } }
最终实现的效果如下:
不足之处:输入任务保存时,我做的是随机生成0或者1,分别代表已完成和未完成的任务,在任务总计时数量是对的,已完成在点击保存按钮时并没有及时更新数量,删除一项任务时,已完成任务数量就会统计出来。这点小bug,后续再研究。。。
相关文章推荐
- 【转载】React入门-Todolist制作学习
- React ES6与ES5写法的区别
- React Native 之 State 的ES5 与ES6 写法区别
- React中ES5与ES6写法的区别总结
- 跟我学习javascript的最新标准ES6
- 前端学习资料,vue angular react webpack es6应有尽有
- React-Native学习之制作RN版的微博app(一)
- ES6下React组件的写法示例代码
- React学习之ES6学习Day1
- React入门最好的学习实例-TodoList
- ECMAScript 6 学习系列课程 (ES6 对象的最新用法)
- React的ES5与ES6写法对比
- 跟我学习javascript的最新标准ES6
- react-native ES5与ES6写法对照表
- react-native最新的ES6基于页面跳转和传值
- React使用ES6和ES5写法对比
- React/React Native 的ES5 ES6写法对照
- react学习(ES5和ES6两种写法的对比)
- 最新的react0.14支持ES6开发环境配置方案
- 如何将react/react native中的ES5写法转化成ES6?