详解React中的todo-list

基于React的一个简单Todo-list

先赌为快:在线DEMO,感觉还不错点一下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 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

以上所述是小编给大家介绍的React中的todo-list ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • react+redux的升级版todoList的实现

    又是很久不写博客了,最近在用蚂蚁金服的ant-design-pro写毕设,写着写着写不下去了,很多东西都不理解,不得不说大神写出来的东西都是需要花学习成本的,或者底子好,对于React新手来说就有点难了.所以就老老实实的认真看了下Redux到底如何使用,在这里推荐一下自己最近在看的书,写的算是比较详细的:<深入React技术栈>.废话不多说,今天就分享下自己如何使用redux来实现一个todoList的,希望对想要用redux的你会有所帮助. (为什么叫升级版呢?因为之前写过一个没有用redu

  • 用React实现一个完整的TodoList的示例代码

    前言:算起来已经有一个多月没有写博客了,近来懈怠了不少,也不知道要写些什么,最近学了一段时间的React,一直都在看些理论性的知识,总觉得应该写个什么来练练手,所以还是拿个简单的todoList来举个例子吧! 一. 首先根据效果图讲一下要实现的功能吧 todoList最终效果图 (1)可以添加任务: (2)已完成任务以及未完成任务的颜色区分开: (3)进行添加任务,修改任务状态,以及删除任务时,下面的任务完成数目和任务总数要进行变化: 以上就是要实现的功能. 二. 接下来该如何设计呢? (1)任

  • 详解React中共享组件逻辑的三种方式

    废话少说,这三种方式分别是:render props.高阶组件和自定义Hook.下面依次演示 假设有一个TimeOnPage组件专门用来记录用户在当前页面停留时间,像这样: const TimeOnPage = () => { const [second, setSecond] = useState(0); useEffect(() => { setTimeout(() => { setSecond(second + 1); }, 1000); }, [second]); return

  • 详解React中key的作用

    要了解React中key的作用,可以从key的取值入手,key的取值可以分为三种,不定值.索引值.确定且唯一值 在下面的代码中,key的取值是不定值(Math.random()) 问题: 点击按钮的时候,span的颜色会变成红色吗? import React, { useState } from 'react'; function App() { const [initMap, setInitMap] = useState([1,2,3,4]); const handleClick = () =

  • 详解React中的不可变值

    什么是不可变值 函数式编程是指程序里面的函数和表达式都能像数学中的函数一样,给定了输入值,输出是确定的.比如 let a = 1; let b = a + 1; => a = 1 b = 2; 变量b出现,虽然使用了变量a的值,但是没有修改a的值. 再看我们熟悉的react中的代码,假如初始化了this.state = { count: 1 } componentDidMount() { const newState = { ...state, count: 2 }; // { count: 2

  • 详解React中Props的浅对比

    上一周去面试的时候,面试官我PureComponent里是如何对比props的,概念已经牢记脑中,脱口而出就是浅对比,接着面试官问我是如何浅对比的,结果我就没回答上来. 趁着周末,再来看看源码里是如何实现的. 类组件的Props对比 类组件是否需要更新需要实现shouldComponentUpdate方法,通常讲的是如果继承的是PureComponent则会有一个默认浅对比的实现. // ReactBaseClasses.js function ComponentDummy() {} Compo

  • 详解React中的this指向

    打算记流水账一般细数一下 React 中的 this 指向问题,具体流程按事件三要素:起因,经过,结果.哈哈哈哈哈! 起因: 众所周知,React 的设计是响应式的,使用者无需操纵 DOM,操纵数据,页面就会渲染更新. 数据一变就更新,是更新所有的 DOM 吗?当然不是,哪些变了就重新渲染哪些.那就要对数据变化前后的 DOM 进行比较.直接对比真实 DOM 吗?这样性能会很低,React 比较的是虚拟 DOM,虚拟 DOM 也是对象,只不过相较真实 DOM而言,少了很多属性,更"轻".

  • 详解React中的todo-list

    基于React的一个简单Todo-list 先赌为快:在线DEMO,感觉还不错点一下star  -_- ~ 源码地址: 一.已经完成的功能 1.新增选项(默认未完成) 2.完成状态可以切换 3.当前选项可以删除 4.全部选项选中状态切换 5.全部个数,完成个数,未完成个数实时读取 6.刷新状态不变 7.双击可以编辑(有个坑:双击编辑内input的keyUp Enter保存会连带触发blur失去焦点保存.已解决:通过设置一个可以保存的状态控制) 二.待完成(新增路由) 三.目录结构 3.1.主要逻

  • 详解React中合并单元格的正确写法

    用表格进行页面布局,页面布局在各种浏览器的的兼容性, 都非常好, 而在react中使用表格布局, 合并单元格的写法比较特殊, 博主查了很久才找到正确的写法, 在这里分享一下 效果图 源码 react组件文件 import React, { Component } from 'react'; import './App.css'; class App extends Component { render() { return ( <div className="App"> &

  • 详解React中组件之间通信的方式

    一.是什么 我们将组件间通信可以拆分为两个词: 组件 通信 回顾Vue系列的文章,组件是vue中最强大的功能之一,同样组件化是React的核心思想 相比vue,React的组件更加灵活和多样,按照不同的方式可以分成很多类型的组件 而通信指的是发送者通过某种媒体以某种格式来传递信息到收信者以达到某个目的,广义上,任何信息的交通都是通信 组件间通信即指组件通过某种方式来传递信息以达到某个目的 二.如何通信 组件传递的方式有很多种,根据传送者和接收者可以分为如下: 父组件向子组件传递 子组件向父组件传

  • 详解react中的state的简写方式

    前言 什么是state 我们都说React是一个状态机,体现是什么地方呢,就是体现在state上,通过与用户的交互,实现不同的状态,然后去渲染UI,这样就让用户的数据和界面保持一致了.state是组件的私有属性. 在React中,更新组件的state,结果就会重新渲染用户界面(不需要操作DOM),一句话就是说,用户的界面会随着状态的改变而改变. PS: state 只能在本组件中去初始化,并且 state 只能被本组件去修改和仿问,不能被外部仿问和修改,所以也可以说,state 是组件私有的.

  • 详解React中Fragment的简单使用

    目录 react 中的 Fragment 标签渲染 Fragment 标签 Fragment 标签和 <></> 区别 react 中的 Fragment 今天说的这一小节超级简单,但是呢,不说还不行,因为在实际开发项目当中你会确确实实的发现有这样一个使用场景,很多人都会写,所以说尽管不影响我们的实际开发,但别人确实会这样操作,为了能更好的看清项目代码,稍微提一嘴吧. 标签渲染 Fragment 标签的使用啊超级简单,就 <Fragment></Fragment&

随机推荐