【问题标题】:how to use two useState in one function so that the second useState can use the first updated useState?如何在一个函数中使用两个 useState,以便第二个 useState 可以使用第一个更新的 useState?
【发布时间】:2021-05-13 00:56:31
【问题描述】:

反应: 我正在尝试创建 todoapp,但负责添加新任务的组件有问题。我想为新任务分配添加日期。这是我的组件(tasksList 是所有任务的列表):

import { useState } from "react";

const ListHandler = ({ tasksList, setTasksList }) => {

  const [newTask, setNewTask] = useState({
    id: tasksList.length,
    content: "",
    done: false,
    active: true,
    date: null,
  });

  const inputHandler = (e) => {
    setNewTask((prevState) => ({
      ...prevState,
      content: e.target.value,
    }));
  };

  const addHandler = (e) => {
    e.preventDefault();
    setNewTask((prevState) => ({
      ...prevState,
      date: new Date().toTimeString().split(" ")[0],
    }));
    setTasksList((prevState) => [...prevState, newTask]);
  };

  return (
    <section className="listHandler">
      <form className="form">
        <input
          className="form__input"
          onChange={(e) => inputHandler(e)}
        ></input>
        <button className="form__button" onClick={(e) => addHandler(e)}>
          Add Task
        </button>
      </form>
    </section>
  );
};
export default ListHandler;

当我单击按钮时,我会在 tasksList 中获得一个带有 null 日期的新任务,因为在更新 newTask 之前调用了 setTasksList,对吧?我的问题是如何解决这个问题?

【问题讨论】:

    标签: javascript reactjs react-hooks use-state


    【解决方案1】:

    这可能会解决您的问题 创建了一个新状态 TaskName 用于处理更改输入并修复了 addhandler 函数和 inputhandler

      const [newTask, setNewTask] = useState([]);
      const [taskName, setTaskName] = useState("");
    
    
        const inputHandler = (e) => {
          setTaskName(e.target.value);
        };
        const addHandler = (e) => {
          e.preventDefault();
          setNewTask([...newTask,{
            id: newTask.length+1,
            content: taskName,
            done: false,
            active: true,
            date: new Date().toTimeString().split(" ")[0],
          }]);
          setTaskName("");
        };
    

    【讨论】:

      【解决方案2】:

      这是因为 newTask 将在下一次渲染中可用,例如,您可以这样做:

          const addHandler = (e) => {
              e.preventDefault();
              const newDate = date: new Date().toTimeString().split(" ")[0];
              
              setNewTask((prevState) => ({
                ...prevState,
                date: newDate
              }));
             
              setTasksList((prevState) => [...prevState, {...newTask, date: newDate }]);
            };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-10
        • 2022-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多