返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何使用React实现一个完整的TodoList
  • 538
分享到

如何使用React实现一个完整的TodoList

2024-04-02 19:04:59 538人浏览 八月长安
摘要

这篇文章主要介绍如何使用React实现一个完整的TodoList,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一. 首先根据效果图讲一下要实现的功能吧todoList最终效果图(1)

这篇文章主要介绍如何使用React实现一个完整的TodoList,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一. 首先根据效果图讲一下要实现的功能吧

如何使用React实现一个完整的TodoList

todoList最终效果图

(1)可以添加任务;
(2)已完成任务以及未完成任务的颜色区分开;
(3)进行添加任务,修改任务状态,以及删除任务时,下面的任务完成数目和任务总数要进行变化;

以上就是要实现的功能。

二. 接下来该如何设计呢?

(1)任务存储的数据结构

list: [{
      id: 0,
      name: '吃饭',
      status: 0
    }, {
      id: 1,
      name: '睡觉',
      status: 0
    }, {
      id: 2,
      name: '打豆豆',
      status : 0
    }]

每个任务都有自己的id,任务名,以及任务的状态,任务的id除了标识任务的唯一性,还可以作为列表项的key值。我们都知道在react中使用列表,列表的每一项必须有个key值,这样会使得每个列表项可以快速定位,在执行Diff算法时减少不必要的查询,从而对性能的提升有所帮助。

(2)组件的划分

  1. TodoList整体作为一个大组件;

  2. 列表中的每个列表项(ListItem)作为一个组件;

  3. 任务的添加框(Dialog)作为一组件。

三. 具体实现

以列表项ListItem的实现为例:

将列表项单独划分为一个组件是必须的,这样使得每个单独的条目都是独立的,使得代码的逻辑更加简单,增强代码的复用性,维护也会变得更简单。

当然聪明的你肯定会想到一个问题:每一个Task的状态改变或者Task的添加删除,Task的完成数目和总数目都是会改变的,可是每个ListItem都是相互独立的,如何实现呢?这时就要用到父子组件之间的通信了。

如果你也是和我一样React的初学者,百度一下就会出现很多文章都会讲父子组件间如何通信,下面我简单说一下自己简单粗暴的理解:

在父子组件中定义改变state数据的方法,将方法以props的形式传递给子组件,在子组件中触发事件处理程序,然后满足某种条件的话就执行父组件传来的函数。

具体代码如下:

父组件中的代码:

import React, { Component } from 'react';
import ListItem from './listItem';
import Dialog from './dialog';
import './main.CSS';

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
    };
  }
  
  //添加新任务,在组件中以props的形式传递给子组件
  addTask (newitem) {
    var allTask = this.state.list;
    allTask.push(newitem);
    this.setState({
      list: allTask
    });
  }
  //更新完成的任务,在组件中以props的形式传递给子组件
  updateFinished (todoItem) {
    var 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
    });
  }

  //更新任务总数,在组件中以props的形式传递给子组件
  updateTotal (todoItem) {
    var 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 className="container">
        <h2>TodoList</h2>
        <ul>
          { this.state.list.map ((item, index) =>
            <ListItem 
              item={item} 
              finishedChange={this.updateFinished.bind(this)} 
              totalChange={this.updateTotal.bind(this)}
              key={index}
            />
          )}
          <li>{this.state.finished}已完成 / {this.state.list.length}总数</li>
        </ul>
        <Dialog addNewTask={this.addTask.bind(this)} nums={this.state.list.length}/>
      </div>
    );
  }
}

export default TodoList;

子组件中的代码:

import React, { Component } from 'react';

class ListItem extends Component {
  constructor (props) {
    super(props);

    this.handleFinished = this.handleFinished.bind(this);
    this.handleDelete = this.handleDelete.bind(this);
  } 

  handleFinished () {
    var status = this.props.item.status;

    status = (status === 0 ? 1 : 0);

    var 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 = {
      backgroundColor: '#DFFCB5',
      color: '#2EB872',
    };

    const finish = {
      backgroundColor: '#FFFA9D',
      color: '#FF9A3C',
      textDecoration: 'line-through'
    }

    var itemStyle = item.status === 0 ? unfinish : finish;
    
    return (
      <li key={item.id} style={itemStyle}>
        <span 
          onClick={this.handleFinished} 
          id={item.id}
          className="check-btn"
          style={{backgroundColor: item.status === 0 ? '#fff' : '#A1EAFB'}}
        ></span>
        <span>{ item.name }</span>
        <span onClick={this.handleDelete} className="delete-btn">删除</span>
      </li>
    );
  }
}

export default ListItem;

以上是“如何使用React实现一个完整的TodoList”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网JavaScript频道!

--结束END--

本文标题: 如何使用React实现一个完整的TodoList

本文链接: https://lsjlt.com/news/74227.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用React实现一个完整的TodoList
    这篇文章主要介绍如何使用React实现一个完整的TodoList,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一. 首先根据效果图讲一下要实现的功能吧todoList最终效果图(1)...
    99+
    2024-04-02
  • 如何使用react实现todolist
    本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。如何使用react实现todolist?React入门实战实例——ToDoList实现摘要: 最近学习了一小段时间的React,对一些React开发组件的...
    99+
    2023-05-14
    todolist React
  • 怎么使用react实现todolist
    这篇文章主要介绍了怎么使用react实现todolist的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用react实现todolist文章都会有所收获,下面我们一起来看看吧。使用react实现todoli...
    99+
    2023-07-04
  • 如何实现一个完整的Node.js RESTful API
    这篇文章给大家分享的是有关如何实现一个完整的Node.js RESTful API的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。环境搭建下载并安装Node.js https://...
    99+
    2024-04-02
  • 如何实现react+redux的升级版todoList
    这篇文章主要为大家展示了“如何实现react+redux的升级版todoList”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现react+redux的升...
    99+
    2024-04-02
  • react如何实现todolist的增删改查
    这期内容当中小编将会给大家带来有关react如何实现todolist的增删改查,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。以todolist为例目录如下app.js import R...
    99+
    2023-06-22
  • 如何使用Vue实现todolist
    这篇文章主要介绍了如何使用Vue实现todolist,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、使用vue-cli脚手架快速搭建一个框...
    99+
    2024-04-02
  • 如何使用react实现一个tab组件
    这篇“如何使用react实现一个tab组件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何使用react实现一个tab组件...
    99+
    2023-07-04
  • python实现一个完整的blog网站
    ##简介 学习廖雪峰python教程实战部分过程中编写的一个博客网站,包含日志、用户和评论3大部分,自己实现简易的ORM框架和Web框架,站点在这里,源码在github上。 ##界面 ####日志界面 ####管理界面 ###...
    99+
    2023-01-31
    完整 网站 python
  • 实现一个完整的Node.js RESTful API的示例
    前言 这篇文章算是对Building APIs with Node.js这本书的一个总结。用Node.js写接口对我来说是很有用的,比如在项目初始阶段,可以快速的模拟网络请求。正因为它用js写的,跟iOS直...
    99+
    2022-06-04
    示例 完整 Node
  • Java实现一个顺序表的完整代码
    实现一个顺序表 接口实现 定义一个MyArrayList类,在类中实现以下函数 public class MyArrayList { } 数组的定义 public ...
    99+
    2024-04-02
  • 如何使用TypeScript的TodoList
    这篇文章主要介绍“如何使用TypeScript的TodoList”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用TypeScript的TodoList”文章能帮助大家解决问题。为什么用todo...
    99+
    2023-07-04
  • 教你如何从 html 实现一个 react
    什么是 React React是一个简单的javascript UI库,用于构建高效、快速的用户界面。它是一个轻量级库,因此很受欢迎。它遵循组件设计模式、声明式编程范式和函数式编程...
    99+
    2024-04-02
  • 如何快速搭建一个完整的网站
    本篇内容主要讲解“如何快速搭建一个完整的网站”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何快速搭建一个完整的网站”吧!  第一步、登录云指官网免费注册页面,注册一个建站系统。在注册页面有建站...
    99+
    2023-06-10
  • linux如何确认一个rpm包的完整性
    ...
    99+
    2024-04-02
  • mysql中怎么实现一个完整性约束
    这篇文章将为大家详细讲解有关mysql中怎么实现一个完整性约束,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。约束条件作用:用于保证数据的完整性和一致性主要分...
    99+
    2024-04-02
  • Python实现一个完整学生管理系统
    目录前言创建入口函数新增学生insert展示学生show查找学生find删除学生delete加入存档读档存档读档打包成exe程序发布代码前言 功能 新增学生显示学生查找学生删除学生存...
    99+
    2023-01-29
    Python学生管理系统 Python学生管理系统设计
  • 使用react怎么实现一个Radio组件
    使用react怎么实现一个Radio组件?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。测试组件:class Test extends Comp...
    99+
    2023-06-14
  • 怎么使用react实现一个tab组件
    本教程操作环境:windows7系统、react18.0.0版、Dell G3电脑。怎么使用react实现一个tab组件?react写Tab组件使用react写TAB栏组件和对应hover事件(背景:在用gatsby开发页面时,遇到这样的组...
    99+
    2022-11-22
    tab组件 React
  • 如何使用React Portals实现一个功能强大的抽屉组件
    本篇内容介绍了“如何使用React Portals实现一个功能强大的抽屉组件”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作