博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React之todo-list
阅读量:4349 次
发布时间:2019-06-07

本文共 2512 字,大约阅读时间需要 8 分钟。

基于React的一个简单Todo-list

先赌为快:,感觉还不错点一下star  -_- ~

一、已经完成的功能

1、新增选项(默认未完成)

2、完成状态可以切换

3、当前选项可以删除

4、全部选项选中状态切换

5、全部个数,完成个数,未完成个数实时读取

6、刷新状态不变

7、双击可以编辑(有个坑:双击编辑内input的keyUp Enter保存会连带触发blur失去焦点保存。已解决:通过设置一个可以保存的状态控制)

二、待完成(新增路由)

三、目录结构

3.1、主要逻辑只涉及:Todo(父组件),TodoAdd(输入框子组件一),TodoList(选项列表子组件二)

3.2、父子组件通过props(可以是自定义属性、对象、回调函数)通信,每个组件都有自己的state,可以通过setState改变当前的state。

例如:新增的时候,父组件是如何知道新增了一个什么内容呢?如下:

// Todo.jsx内        //1 传递给子组件的回调函数,只要有心得内容传递过来,就更新当前的:list。list只要更新,通过props传递给TodoList的data就会更新,DOM就会新增一个选项列表    onAddSubmit(addTitle) {        console.log("增加了:" + addTitle)        let addItem = {            title: addTitle,            isFinished: false        }        this.state.list.unshift(addItem)        this.setState({ list: this.state.list })        this._saveToSession()    }// 通过props传递给子组件(等待使用)
// TodoAdd.jsx// 2、點擊enter鍵:有值就確認增加    _onKeyUpEnter(e) {        if (e.keyCode == 13) {            this.confirmAddItem()        }    }    // 3、失去焦點:有值就確認增加    _onBlurEnter(e) {        this.confirmAddItem()    }    // 4、確認增加,调用父组件的回调函数,传递参数    confirmAddItem() {        if (this.state.title) {            this.props.onAddSubmit(this.state.title) //把新增的内容通过props传进来的回调函数告诉父组件Todo,有新的内容来了            // 置空當前            this.setState({                title: ""            })        }    }

其他:上面这个简单的父子组件的通信过程和es6模块化通信非常类似,只是react做了优化,比如上面的使用es6来模拟如下,只是做了通信模拟:

// Todo.js  父模块import TodoAdd from "./TodoAdd"import TodoList from "./TodoList"class Todo {    constructor() {        this.list = []        this.TodoAdd = new TodoAdd({            // 父模块给子模块的回调            resetList: (content) => {                if (content) {                    this._updateList(content)                }            }        })        this.TodoList = new TodoList({            list: this.list,        })    }    _updateList(content) {        this.list.push(content)        // 调用子模块的方法更新内部列表        this.TodoList && this.TodoList._getNewList(this.list)    }}module.exports = Todo
// TodoAdd.js 新增子模块class TodoAdd {    constructor({        resetList,    }) {        this.resetList = resetList    }    _onSubmit(str) {        if (str) {            // 1、告诉父模块新增了            this.resetList(str)        }    }}module.exports = TodoAdd
// TodoList.js 列表子模块class TodoList {    constructor({        list,    }) {        this.list = []        this._getNewList(list)    }    // 3、监听父模块是否要更新    _getNewList(newList) {        this.list = newList        // 其他操作    }}module.exports = TodoList

 

转载于:https://www.cnblogs.com/-walker/p/9277078.html

你可能感兴趣的文章
20180925-4 单元测试
查看>>
mysql的数据存储
查看>>
[转载] Activiti Tenant Id 字段释疑
查看>>
[Java 8] (8) Lambda表达式对递归的优化(上) - 使用尾递归 .
查看>>
SQL Server-聚焦移除Bookmark Lookup、RID Lookup、Key Lookup提高SQL查询性能
查看>>
最小权限的挑战
查看>>
jquery 视觉特效(水平滚动图片)
查看>>
SVG笔记
查看>>
go web framework gin group api 设计
查看>>
linux下使用dd命令写入镜像文件到u盘
查看>>
001---进程
查看>>
视频人脸检测——OpenCV版(三)
查看>>
php获取来访者在搜索引擎搜索某个关键词,进入网站
查看>>
物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息
查看>>
2018-2019-1 20165234 20165236 实验二 固件程序设计
查看>>
IDEA的GUI连接数据库写入SQL语句的问题总结
查看>>
Xpath在选择器中正确,在代码中返回的是空列表问题
查看>>
leecode第一百九十八题(打家劫舍)
查看>>
【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)
查看>>
07-3. 数素数 (20)
查看>>