React之todo-list

基于React的一个简单Todo-list

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

源码地址:

一、已经完成的功能

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

2、完成状态可以切换

3、当前选项可以删除

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

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

6、刷新状态不变

二、待完成(新增路由)

三、目录结构

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 onAddSubmit={this.onAddSubmit} />
// 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

时间: 2024-10-12 03:04:49

React之todo-list的相关文章

【Todo】React入门-Todo制作学习

http://www.oschina.net/news/75530/9-things-every-reactjs-beginner-should-know react.js入门学习 但是我直接看的这个: http://www.reqianduan.com/2297.html 先在文中的github页面下载了包 https://github.com/YikaJ/react-todos 解压后,把package.json拷贝到代码目录. 然后运行 npm install 安装依赖库. 安装好之后,把

React半科普文

React半科普文 什么是React getting started 文件分离 Server端编译 定义一个组件 使用property 组件嵌套 组件更新 Virtual DOM react native 什么是React 以下是官方定义,反正我是没看懂.google了下,大家都称之“前端UI开发框架”,勉强这么叫着吧.可以看下这篇文章对react的介绍,本文更多的是覆盖react的入门实践. A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES 本

[React] Preventing extra re-rendering with function component by using React.memo and useCallback

Got the idea form this lesson. Not sure whether it is the ncessary, no othere better way to handle it. Have a TodoList component, every time types in NewTodo input fields, will trigger the re-rendering for all components. import React, { useState, us

react-redux 的 todomvc

下文有项目文件下载 在项目目录中执行 npm install 安装依赖,install  start 启动项目,网页会自动打开 index.js import React from 'react'import { render } from 'react-dom'import { createStore } from 'redux'import { Provider } from 'react-redux'import App from './containers/App'import todo

【知乎】前端现在怎么这么多人?(2017-2019)

顾轶灵  2017-02-19?如果你在知乎关注了「前端开发」这个话题,那么你三天两头就会看到类似这样的问题: 我转专业零基础学前端,多久能实习?何时才能找到工作?去 BAT 要学习到什么程度?本人 xx 岁女生,在学校的时候写代码就不行,适合做前端吗?以后会不会太累?我自学前端几个月了,xx 官网也模仿过了,HTML/CSS都没啥问题了,但是 JS 学不进去怎么办?我培训了几个月出来,发现前端工作怎么这么难找?简历不造假连面试机会都没有怎么办?现在前端市场是不是已经饱和了?xx 网上每个前端的

[Redux] React Todo List Example (Toggling a Todo)

/** * A reducer for a single todo * @param state * @param action * @returns {*} */ const todo = ( state, action ) => { switch ( action.type ) { case 'ADD_TODO': return { id: action.id, text: action.text, completed: false }; case 'TOGGLE_TODO': if ( s

[Redux] React Todo List Example (Adding a Todo)

Learn how to create a React todo list application using the reducers we wrote before. /** * A reducer for a single todo * @param state * @param action * @returns {*} */ const todo = ( state, action ) => { switch ( action.type ) { case 'ADD_TODO': ret

react+redux官方实例TODO从最简单的入门(3)-- 删

上一篇文章我们实现了增删改查中<增>这个功能 那么这一篇我们将实现第二个功能,删! 首先增加一个状态: actions中增加对应的约定 到reducer里面设置执行的函数(这里todo.id当然是等于action.id,所以返回false) 然后给子组件,增加这个方法 现在删除这个功能也实现了,这个不好演示,写到这一步,自己试一下就能完成了.

react+redux官方实例TODO从最简单的入门(2)-- 增

虽然官网的TodoList的例子写的很详细,但是都是一步到位,就是给你一个action,好家伙,全部都写好了,给你一个reducer,所有功能也是都写好了,但是我们这些小白怎么可能一下就消化那么多,那我们就来拆解,一步一步实现,试想我们开发程序也是一个一个功能区域实现,那么我们第一步就是先把整体结构构思出来,然后先把头部做出来,这样看是不是简单很多! 从官网下载的mode,然后配置什么的,我也不会弄,把里面的东西全删了,然后自己一个一个写,不然学一个react还要学配置环境,时间又没多少了,大致

[Todo] Nodejs学习及Spider实验(包括php入门学习、React入门学习)

/Users/baidu/Documents/Data/Interview/Web-Server开发 深入浅出Node.js-f46c http://blog.csdn.net/u012273376/article/details/52736906 利用nodejs做爬虫 http://www.runoob.com/nodejs/nodejs-callback.html nodejs学习之路 http://www.runoob.com/php/php-tutorial.html php学习之路