当用户单击“保存”按钮时,如何实现任务的更改?

问题描述 投票:0回答:1

当用户单击“编辑”按钮时,输入字段将打开,允许用户输入新任务。但是,当用户单击“保存”按钮时,我无法实现保存这些更改。目前,当用户单击“保存”时,会保存之前的任务,但新任务会消失。在我的任务组件中,我创建了一个 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>
  );
};

我有上面的代码片段

javascript reactjs react-redux redux-toolkit
1个回答
0
投票

问题

问题似乎是您正在访问

id
元素的
button
事件对象的
onClick
属性,而不是您尝试更新其标题的特定
task
对象。

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

...

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

解决方案

您可以访问范围内封闭的当前

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>

  ...
};
© www.soinside.com 2019 - 2024. All rights reserved.