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