当用户单击"编辑"按钮时,将打开输入字段,允许用户键入他们的新任务.但是,当用户单击"保存"按钮时,我无法实现保存这些更改.目前,当用户点击"保存"时,先前的任务会被保存,但新的任务会消失.在我的任务组件中,我创建了一个useState,它获得与当前状态相同的初始状态.然后我创建了onSaveClicked,它应该会将我的当前任务更改为一个新任务.当我判断Redux开发工具时,我可以看到我的有效负载正在更新,但它没有显示在UI中.

import { ADD_TASK, REMOVE_TASK, UPDATE_TASK } from "../actionsTypes";
import { v4 as uuidv4 } from "uuid";

export const initialState = {
  tasklist: [], //tasklist
};

export function taskReducer(state = initialState, action) {
  switch (action.type) {
    case ADD_TASK:
      return {
        ...state,
        tasklist: [
          ...state.tasklist,
          {
            id: uuidv4(),
            title: action.payload,
            isCompleted: false,
            isEditing: false,
            status: "To do",
            number: state.tasklist.length + 1,
          },
        ],
      };

    case REMOVE_TASK:
      return {
        ...state,
        tasklist: state.tasklist.filter((todo) => action.payload !== todo.id),
      };

    case UPDATE_TASK:
      return {
        ...state,
        tasklist: state.tasklist.map((prevTask) =>
          prevTask.id === action.payload.id
            ? { ...prevTask, title: action.payload.newTitle }
            : prevTask
        ),
      };

    default:
      return state;
  }
}
import React, { useState } from "react";
import "./Task.css";
import Button from "@mui/material/Button";
import DeleteIcon from "@mui/icons-material/Delete";
import EditIcon from "@mui/icons-material/Edit";
import { useDispatch } from "react-redux";
import { updateTask } from "../../store/actions";

const Task = ({ task, onDelete }) => {
  const [isEditing, setIsEditing] = useState(false);
  const [inputValue, setInputValue] = useState(task.title);
  const dispatch = useDispatch();

  const onEdit = () => {
    setIsEditing(!isEditing);
  };

  const onSaveClicked = (title) => {
    dispatch(updateTask(title.id, inputValue));
    setIsEditing(!isEditing);
  };

  return (
    <li>
      {isEditing ? (
        <input
          id="edittask"
          type="text"
          value={inputValue}
          onChange={(e) => {
            // const newName = e.target.value; // setInputValue
            // dispatch(updateTask(task.id, newName));
            setInputValue(e.target.value);
          }}
        />
      ) : (
        <>
          {task.number}
          <p>{task.title}</p>
          {task.isCompleted}
          {task.status}
        </>
      )}
      {!isEditing ? (
        <Button onClick={onEdit} variant="outlined" endIcon={<EditIcon />}>
          Edit
        </Button>
      ) : (
        <Button onClick={onSaveClicked} variant="outlined">
          Save
        </Button>
      )}
      <Button onClick={onDelete} variant="outlined" endIcon={<DeleteIcon />}>
        Remove
      </Button>
    </li>
  );
};

export default Task;
import { ADD_TASK, REMOVE_TASK, UPDATE_TASK } from "./actionsTypes";

export const addTask = (title) => ({
  type: ADD_TASK,
  payload: title, //title
});

export const removeTask = (id) => ({
  type: REMOVE_TASK,
  payload: id,
});

export const updateTask = (id, title) => ({
  type: UPDATE_TASK,
  payload: { id, newName: title },
});
import React from "react";
import InputTask from "../InputTask/InputTask";
import HeaderOfTaskList from "../HeaderOfTaskList/HeaderOfTaskList";
import Task from "../Task/Task";
import { useDispatch, useSelector } from "react-redux";
import { removeTask, addTask } from "../../../redux/store/actions";
import "./TaskList.css";

export const TaskList = () => {
  const dispatch = useDispatch();
  const task = useSelector((state) => state.tasklist);

  const handleDelete = (id) => {
    dispatch(removeTask(id));
  };

  const handleAddTask = (tasklist) => {
    dispatch(addTask(tasklist));
  };

  return (
    <div>
      <InputTask addTask={handleAddTask} />
      <HeaderOfTaskList />
      <ul>
        {task.map((task) => (
          <Task
            task={task}
            key={task.id}
            onDelete={() => handleDelete(task.id)}
          />
        ))}
      </ul>
    </div>
  );
};

我有上面的代码片段

推荐答案

Issue

问题似乎是,您正在访问button元素的onClick事件对象的id属性,而不是您试图更新其标题的特定task对象.

const onSaveClicked = (title) => { // <-- title is onClick event object
  dispatch(updateTask(title.id, inputValue));
  setIsEditing(!isEditing);
};

...

<Button onClick={onSaveClicked} variant="outlined">
  Save
</Button>

Solution

您可以访问当前范围内关闭的task道格值:

const Task = ({ task, onDelete }) => {
  ...

  const onSaveClicked = () => {
    dispatch(updateTask(task.id, inputValue));
    setIsEditing(!isEditing);
  };

  ...

  <Button onClick={onSaveClicked} variant="outlined">
    Save
  </Button>

  ...
};

您也可以显式地将task引用传递给onSaveClicked回调:

const Task = ({ task, onDelete }) => {
  ...

  const onSaveClicked = (task) => {
    dispatch(updateTask(task.id, inputValue));
    setIsEditing(!isEditing);
  };

  ...

  <Button onClick={() => onSaveClicked(task)} variant="outlined">
    Save
  </Button>

  ...
};

Javascript相关问答推荐

获取表格的左滚动位置

vanillajs-datepicker未设置输入值,日期单击时未触发更改事件

materialized - activeIndex返回-1

InDesign—创建一个独立的窗口,在文档中进行更正时保持打开状态

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

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

ChartJs未呈现

映射类型定义,其中值对应于键

使用父标签中的Find函数查找元素

我想使用GAS和HTML将从Electron 表格中获得的信息插入到文本字段的初始值中

在不扭曲纹理的情况下在顶点着色器中旋转UV

如何使用Astro优化大图像?

用于测试其方法和构造函数的导出/导入类

Next.js无法从外部本地主机获取图像

调用特定数组索引时,为什么类型脚本不判断未定义

我在哪里添加过滤器值到这个函数?

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

如果查询为空,则MongoDB将所有文档与$in匹配

如何在Java脚本中添加一个可以在另一个面板中垂直调整大小的面板?

此上下文在JavaScript中