我是react js的新手,我正在try 创建一个待办事项列表应用程序.

我使用一个模式从CreateTask组件获取两个用户输入(任务名称和描述),并将这些用户输入作为对象传递给TodoList组件.然后我try 更新状态并显示列表.但它总是显示为空.

如果有人帮我解决这个问题,我真的很感激.

这是我的密码.

TodoList function Component

import React, { useState, Fragment } from 'react'
import CreateTask from './modals/CreateTask'

const TodoList = () => {

const[modal,setModal] = useState(false);
const[taskList, setTaskList] = useState([]);


const toggle = () =>{
    setModal(!modal);
}

//saveTask function to update the taskList state

const saveTask = function (taskOBJ){

    let arr = taskList.concat(taskOBJ);
    setTaskList(...taskList, arr);
    setModal(false);

    
    console.log(arr) // arr displays Name and Description values correctly in the console
}

  return (
      <Fragment>
            <div className='header text-center'>
                <h1>Todo List</h1>
                <button className='btn btn-primary mt-2' onClick={()=>{setModal(true)}} >Create a Task</button>
            </div>

            <div className='task-container'>

             //Displaying the task name here. 

              { taskList.map((list)=> {                    
                
                  <li>{list.Name}</li>             
               
                
                 }) 
              }
 
            </div>
            <CreateTask modal={modal}  toggle={toggle} save={saveTask}/>
    </Fragment>

  )
}

export default TodoList

This is the CreateTask Function Component

    import React, { useState } from 'react'
    import {Button, Modal, ModalBody, ModalHeader,  ModalFooter} from 'reactstrap';
    
    
    const CreateTask = ({modal, toggle, save}) => {
    
            const[taskName, setTaskName] = useState("");
            const[description, setDescription] = useState("");
    
            // FUNCTION handleChange
            const handleChange = (e)=>{
    
            const{name, value} = e.target;
                if(name === "taskName"){
                    setTaskName(value);
                }else{
                    setDescription(value);
                }
    
            }
    
            // FUNCTION handleSave
            const handleSave = ()=>{
                let taskObject ={}
               
                taskObject.Name = taskName;
                taskObject.Description = description;
                save(taskObject);
                // console.log(taskObject)
            }
    

  return (
<div>
    <Modal
        isOpen={modal}
        toggle={toggle}
        // animation={false}
    >
        <ModalHeader toggle={toggle}>
             Create Task
        </ModalHeader>
        <ModalBody>
            <form>

                <div className='form-group'>
                    <label>Task Name</label>
                    <input type="text" className='form-control' name="taskName" value ={taskName} onChange ={handleChange}/>
                </div>

                <div className='form-group mt-4'>
                    <label>Description</label>
                    <textarea className='form-control' name="description" value={description} onChange ={handleChange}/>
                </div>

            </form>
        </ModalBody>
        <ModalFooter>

       // BUTTON which is associate with FUNCTION handleSave
            <Button
                color="primary"
                onClick={handleSave}
            >
                Create
            </Button>
            {' '}
            <Button onClick={toggle}>
                Cancel
            </Button>
        </ModalFooter>
    </Modal>
</div>
  )
}

export default CreateTask

推荐答案

因为没有从迭代数组返回任何内容,所以TODO没有呈现,

{taskList.map((list)=> {
  <li>{list.Name}</li>
})}

// Should be
{taskList.map((list)=> {
  return <li>{list.Name}</li>
})}

// Or 
{taskList.map((list)=> <li>{list.Name}</li>)}

此外,你的saveTask人应该像这样管理国家,

const saveTask = function (taskOBJ) {
  // Since your state is an array, 
  // you can't spread the current state array into the updating function. 
  // setTaskList(...taskList, arr)

  // Here you take the `prev` state, and return a new array that
  // contains a spread of `prev` and the new task.
  setTaskList((prev) => [...prev, taskOBJ]);
  setModal(false);

  // Another way of achieving the same could be
  const newTaskList = [...taskList, taskObj];
  setTaskList(newTaskList);
  setModal(false);
};

Javascript相关问答推荐

如果被1个Phaser JS抵消,我的倾斜碰撞

Vue-Router渲染组件但不更改网址

如何解决(不忽略)reaction详尽的linter规则,而不会在获取数据时导致无限的reender循环

单击按钮后未清除 Select

如何编辑代码FlipDown.js倒计时?

如何在使用fast-xml-parser构建ML时包括属性值?

判断表格单元格中是否存在文本框

为什么我的列表直到下一次提交才更新值/onChange

如何使用JavaScript将文本插入空div

在react JS中映射数组对象的嵌套数据

在Three JS中看不到补间不透明度更改效果

我怎么才能得到Kotlin的密文?

在执行异步导入之前判断模块是否已导入()

如何通过将实例方法的名称传递给具有正确类型的参数的继承方法来调用实例方法?

Reaction Native中的范围滑块

Reaction Redux&Quot;在派单错误中检测到状态Mutations

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

当代码另有说明时,随机放置的圆圈有时会从画布上消失

Reaction即使在重新呈现后也会在方法内部保留局部值

react 路由DOM有条件地呈现元素