首頁 >web前端 >前端問答 >如何使用react實現todolist

如何使用react實現todolist

藏色散人
藏色散人原創
2022-12-29 11:26:052732瀏覽

使用react實作todolist的方法:1、新建一個專案資料夾Code;2、透過「create-react-app todo-list」指令建立react專案;3、在components資料夾下新建ToDoList. jsx檔案;4、使用一個陣列來保存數據,數組中每個元素為一個物件;5、編寫頁面佈局;6、添加鍵盤事件,監聽輸入變化,實現待辦事項和已辦事項即可。

如何使用react實現todolist

本教學操作環境:Windows10系統、react18.0.0版、Dell G3電腦。

如何使用react實作todolist?

React入門實戰實例-ToDoList實作

摘要:

 最近學習了一小段時間的React,對一些React開發組件的基礎有了一點認識,跟著教學視頻,自己實現了一個ToDoList組件的功能,今天把做這個組件的過程記錄一下,加深學習印象,給同樣的前端入門者一個參考。

 一、實例展示與功能介紹

1.1 實例展示

如何使用react實現todolist

 

 影片1.1

 1.2 功能介紹

  •  新增待辦事項,按enter鍵確定,同時清空輸入框;
  • 透過checkbox是否勾選可以切換待辦事項和已辦事項;
  • 點擊刪除可以刪除事項

二、準備工作

#2.1 環境配置提醒

準備前:本文假定開發環境已配置完成,包括:

  • Node.js已安裝;
  • cnpm 已安裝; npm install -g cnpm --registry=https://registry. npm.taobao.org 
  • 鷹架工具已安裝; npm install -g create-react-app / cnpm install -g create-react-app 

 注意:初次設定鷹架會出現禁止執行腳本的錯誤,解決方法點選:https://www.php.cn/link/e543789a8d5b6a0e6b2f2a804d207e8d

#2.2 新建React專案

1.新建一個專案資料夾Code,使用VSCode,將Code檔案新增至工作區;

## 圖2.1

#2.右鍵Code資料夾,在標籤中選擇在終端機中開啟;

 圖2.2

# 3.在終端機中輸入下列指令,新建React專案: create-react-app todo-list 

 

 圖2.3

4.產生Rreact專案如下:

# 圖2.4

React開發主要是對

src 裡的文件動手腳,node_modules主要防止各種依賴包,public放置一些公共文件,package.json這些是一些配置文件,在此不詳述。

2.3 檔案分類

    在src目錄下新建components資料夾,用來放置自己建立的元件;
  • 在src目錄下新建assets檔案加用來防止css檔案和圖片檔案等靜態資源;
  • ##如圖2.5所示:

 圖2.5

## 

三、實作過程

 3.1 建立元件ToDoList

#在

components

資料夾下新建

ToDoList.jsx文件,寫如下程式碼,搭好一個元件的基本架構;程式碼如下:

//导入React相关依赖
import React from 'react';

//创建一个组件
class ToDoList extends React.Component{
    //构造函数
    constructor(props){
        super(props);
        //this是父组件(类)的一个实例,实例就类似于java里的一个类,创建了这个类型的一个对象,这个对象就是实例
        this.state = {
            //this.state里可以写一些初始化的数据
        }
    }


    //render渲染虚拟DOM
    render(){

        return(
            <div>
                ToDoList
            </div>
        );
    }

}


//输出组件,使得该组件可以被其他组件调用
export default ToDoList;
   元件中每個部分的功能,在註解裡有簡略描述。一個基本的元件一般包括以上的幾個部分:

  • import导入的依赖;
  • 组件(class XXX extends React,Component);
  • 构造函数constructor;
  • render函数;
  • export输出组件;

3.2 功能实现与解析

1.初始化数据

使用一个数组来保存数据,数组中每个元素为一个对象,该对象包括两个字段:title和checked,tile为字符串类型,checked为布尔类型,用来区分待办(false)已办(true);

 list:[
                {
                    title:'吃饭',
                    checked:true
                },
                {
                    title:'跑步',
                    checked:false
                },
                {
                    title:'上班',
                    checked:false
                },
                {
                    title:'睡觉',
                    checked:true
                },
       ]

 该数组在this.state中初始化:

 constructor(props){
        super(props);
        //this是父组件(类)的一个实例,实例就类似于java里的一个类,创建了这个类型的一个对象,这个对象就是实例
        this.state = {
            //this.state里可以写一些初始化的数据
            list:[
                {
                    title:'吃饭',
                    checked:true
                },
                {
                    title:'跑步',
                    checked:false
                },
                {
                    title:'上班',
                    checked:false
                },
                {
                    title:'睡觉',
                    checked:true
                },
            ],
        }
    }

2.编写页面布局

页面分为顶部的输入框(input)和下面的 待办事项列表 已办事项列表;在render中的return中编写(jsx);

    render(){

        return(
            <div>
                 <header>TodoList:  <input> </header>

                <h2>待办事项</h2>

                <hr>
                
                <ul>
                    {/* 多个li,后面会循环输出 */}
                    <li>
                        <input> -- <button>删除</button>
                    </li>
                </ul>           



                <h2>已完成事项</h2>

                <hr>
                <ul>
                    {/* 多个li,后面会循环输出 */}
                    <li>
                        <input> -- <button>删除</button>
                    </li>
                </ul>    
            </div>
        );
    }

 3.挂载到根节点下

在index.js下,引入ToDoList组件

import ToDoList from './components/ToDoList';

然后挂在组件ToDoList

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import ToDoList from './components/ToDoList';

ReactDOM.render(
  <react.strictmode>
    {/* 此处是ToDoList组件 */}
    <todolist></todolist>   
  </react.strictmode>,
  document.getElementById('root')
);

// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();

简陋渲染效果如下:

 图3.1

3.功能实现

  • 添加待办事项

(1)使用ref属性,获取input输入值:

  在input标签上设置属性ref="inputToDo",然后在方法中可以通过 this.refs.inputToDo.value获取输入值;

(2)添加键盘事件,监听输入变化,当输入enter时,添加待办事项;

  使用onKeyUp(键盘弹起)/onKeyDown(键盘按下)事件来监听键盘变化。当键盘变化后,触发添加函数,将输入值添加到待办事项中;代码如下:

jsx:

<header>TodoList:  <input> </header>

addToDo函数:

    addToDo = (event) => {
        console.log(event.keyCode);
        if(event.keyCode === 13)
        {
            let tempList = this.state.list;
            tempList.push({
                title:this.refs.inputToDo.value,
                checked:false,
            });
            this.setState({
                list:tempList,
            });
            this.refs.inputToDo.value = '';
        }
    }

(3)在constructor中使用bind绑定addToDo,这一步是必须的,否则方法不能执行,所有的方法都需要像这样绑定;

 this.addToDo = this.addToDo.bind(this);

 

 

 图3.2

效果:

 如何使用react實現todolist

视频3.1

  • 输出待办事项和已办事项

  使用map方法,循环遍历数组,输出每组数据;代码如下:

 
                        {/* 多个li,后面会循环输出 */}                     {                         this.state.list.map((value,index)=>{                 {/*checked为false表示待办*/}                             if(!value.checked)                             {                                 return (                                     
  •                          {/* */}                                         <input> {value.title}-- <button>删除</button>                                     
  •                                 );                             }                         })                     }  

checked = {value.checked}表示复选框是否打勾,onChange事件触发一个改变事项状态的方法,index是数组的索引,该方法在下文实现;

  效果:

 图3.3

  • 待办和已办互相转换

  这一步的思路也很简单,其实就是在触发checkboxonChange事件时,将某一个事项的checked值变为相反的值(true->false/false->true),所以onChange后的方法需要传入数组的索引值,具体实现代码如下:

jsx

<input> {value.title}-- <button>删除</button>

checkboxChange

checkboxChange = (index) => {
      let tempList = this.state.list;
      tempList[index].checked = !tempList[index].checked;
      this.setState({
          list:tempList,
     });
}

 效果:

如何使用react實現todolist

 视频3.2

  • 删除事项

 删除事项比较简单了,思路也是类似的,在button上添加onClick按钮,触发删除事件,传入参数index,然后根据index,使用数组的splice函数,删除某一待办事项。

arrayA.splice(index,n)

该方法第一个参数是数组中的元素位置,第二个参数是从index开始删除多少个元素。

具体实现如下:

jsx

  
  •         {value.title}        --   
  •  removeToDo

        removeToDo = (index) => {
            let tempList = this.state.list;
            tempList.splice(index,1);
            this.setState({
                list:tempList,
            });
        }

    效果:即为开篇展示的效果 

    3.3 编写样式

     样式随便写了一下,不太好看,这里也把代码丢上来吧;

    index.css

    .list{
    
      padding: 10px;
    }
    
    .list li{
    
      line-height: 40px;
      margin-left: 30px;
    }
    
    .title{
    
      height: 44px;
    
      line-height: 44px;
    
      text-align: center;
    
      background: #000;
    
      color:#fff;
    }
    
    .title input{
    
      height: 40px;
    }
    
    
    .container{
      width: 800px;
      height: 1000px;
      margin-left: auto;
      margin-right: auto;
      background-color:  #D0D0D0;
      border: #fff solid 1px;
      border-radius: 5px;
    }
    
    .container h2{
      margin-left: 20px;
    }
    
    .del-btn {
      float: right;
      margin-right: 30px;
    }
    • 引入样式

      在ToDoList.jsx中按如下代码引入index.css

    import '../assets/index.css';

    3.4 整体效果

     如何使用react實現todolist

    视频3.3:整体效果展示

    四、整体代码

    • ToDoList.jsx
    //导入React相关依赖
    import React from 'react';
    import '../assets/index.css';
    
    //创建一个组件
    class ToDoList extends React.Component{
        //构造函数
        constructor(props){
            super(props);
            //this是父组件(类)的一个实例,实例就类似于java里的一个类,创建了这个类型的一个对象,这个对象就是实例
            this.state = {
                //this.state里可以写一些初始化的数据
                list:[
                    {
                        title:'吃饭',
                        checked:true
                    },
                    {
                        title:'跑步',
                        checked:false
                    },
                    {
                        title:'上班',
                        checked:false
                    },
                    {
                        title:'睡觉',
                        checked:true
                    },
                ],
            }
    
            this.addToDo = this.addToDo.bind(this);
            this.checkboxChange = this.checkboxChange.bind(this);
        }
    
        addToDo = (event) => {
            console.log(event.keyCode);
            if(event.keyCode === 13)
            {
                let tempList = this.state.list;
                tempList.push({
                    title:this.refs.inputToDo.value,
                    checked:false,
                });
                this.setState({
                    list:tempList,
                });
                this.refs.inputToDo.value = '';
            }
        }
    
    
        checkboxChange = (index) => {
            let tempList = this.state.list;
            tempList[index].checked = !tempList[index].checked;
            this.setState({
                list:tempList,
            });
        }
    
        removeToDo = (index) => {
            let tempList = this.state.list;
            tempList.splice(index,1);
            this.setState({
                list:tempList,
            });
        }
    
        //render渲染虚拟DOM
        render(){
    
            return(
                
                     <header>TodoList:  <input> </header>                     
                            

    待办事项

                            
                            
                                  {/* 多个li,后面会循环输出 */}                             {                                 this.state.list.map((value,index)=>{                                     if(!value.checked)                                     {                                         return (                                             
    •                                                  {value.title}                                                                                              
    •                                         );                                     }                                 })                             }                                                  
                                        

    已完成事项

                            
                            
                                  {/* 多个li,后面会循环输出 */}                             {                                 this.state.list.map((value,index)=>{                                     if(value.checked)                                     {                                         return (                                             
    •                                                  {value.title}                                                                                              
    •                                         );                                     }                                 })                             }                         
                          
                                
            );     } } //输出组件,使得该组件可以被其他组件调用 export default ToDoList;
    View Code
    • index.css 

    .red{
    
      color:red;
    }
    
    
    .list{
    
      padding: 10px;
    }
    
    .list li{
    
      line-height: 40px;
      margin-left: 30px;
    }
    
    .title{
    
      height: 44px;
    
      line-height: 44px;
    
      text-align: center;
    
      background: #000;
    
      color:#fff;
    }
    
    .title input{
    
      height: 40px;
    }
    
    
    .container{
      width: 800px;
      height: 1000px;
      margin-left: auto;
      margin-right: auto;
      background-color:  #D0D0D0;
      border: #fff solid 1px;
      border-radius: 5px;
    }
    
    .container h2{
      margin-left: 20px;
    }
    
    .del-btn {
      float: right;
      margin-right: 30px;
    }
    • index.js 

    import React from 'react';
    import ReactDOM from 'react-dom';
    import './index.css';
    import App from './App';
    import * as serviceWorker from './serviceWorker';
    import ToDoList from './components/ToDoList';
    
    ReactDOM.render(
      <react.strictmode>
        {/* <app></app> */}
        <todolist></todolist>
      </react.strictmode>,
      document.getElementById('root')
    );
    
    // If you want your app to work offline and load faster, you can change
    // unregister() to register() below. Note this comes with some pitfalls.
    // Learn more about service workers: https://bit.ly/CRA-PWA
    serviceWorker.unregister();

    五、结语

    结语就算了吧,好困,睡了。 

    写博客费时间啊,大家要是看到有啥不对的地方,麻烦联系我修改哈,我水平太有限了,谢谢大佬们了。

     推荐学习:《react视频教程

    以上是如何使用react實現todolist的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn