【发布时间】:2021-09-03 10:37:55
【问题描述】:
我正在学习 React Redux 并且正在编写待办事项列表应用程序。最后缺少的部分是编辑所选项目的选项(onClick)。我这样做有问题。
您能告诉我如何实现吗?
我正在寻找这样的解决方案:
- 选择要更新的项目(通过单击编辑图标)
- 表单应更改为“编辑模式”,以便用户可以将新值传递给编辑项。
- 传递值后,用户点击提交按钮。
我不知道如何制作编辑模式,以便我的输入表单可以处理更新现有项目。
// ACTION
export const editTask = (task) => ({
type: "EDIT_TASK",
payload: task,
});
// REDUCER
const INITIAL_STATE = {
tasks: [],
alert: {
show: false,
message: "",
type: "",
},
isEditing: false,
};
const reducer = (state, action) => {
switch (action.type) {
case "EDIT_TASK":
return {
...state,
isEditing: true,
// take current tasks and updatedTask
tasks: [...state.tasks, action.payload],
alert: setAlert(true, "Task has changed succesfull ????", "success"),
};
default:
return state;
On my todo.jsx
const TasksTodo = () => {
const [inputValue, setInputValue] = useState("");
const [state, dispatch] = useReducer(reducer, INITIAL_STATE);
const editTaskFromList = (item) => {
// match tasks from list with that selected
const taskToEdit = state.tasks.find(
(taskToFind) => taskToFind.id === item.id
);
const editedTask = {
taskToEdit,
title: inputValue,
};
dispatch(editTask([...state.tasks, editedTask]));
};
const handleSubmit = (e) => {
e.preventDefault();
if (inputValue) {
const newItem = {
id: new Date().getTime().toString(),
title: inputValue,
};
dispatch(addNewTask(newItem));
setInputValue("");
} else {
dispatch({ type: "NO_VALUE" });
}
};
const handleChange = (e) => {
setInputValue(e.target.value);
};
return (
<div className="tasks-list-section">
<h3 className="tasks__title">tasks List </h3>
{state.alert.show && (
<Alert
{...state.alert}
removeAlert={() => dispatch(changeAlertState())}
/>
)}
<form onSubmit={handleSubmit} className="tasks__form">
<input
type="text"
value={inputValue}
placeholder="e.g homework"
className="tasks__input"
onChange={handleChange}
/>
<button type="submit" className="tasks__submit-btn">
{state.isEditing ? "edit" : "submit"}
</button>
</form>
{state.tasks.length > 0 && (
<div className="tasks__container">
<Tasks
listItems={state.tasks}
removeTask={removeTaskFromList}
editTask={editTaskFromList}
/>
</div>
)}
</div>
);
};
TaskList Component:
const Tasks = ({ listItems, editTask, removeTask }) => {
return (
<div className="tasks-list">
{listItems.map((item) => {
const { id, title } = item;
return (
<div key={id} className="tasks__item">
<p className="tasks__item--title">{title}</p>
<div className="tasks__button-group">
<button
type="button"
className="tasks__button-group--edit"
onClick={() => editTask(item)}
>
<RiEditBoxLine className="size" />
</button>
<button
type="button"
className="tasks__button-group--delete"
onClick={() => removeTask(item)}
>
<RiDeleteBin6Line className="size" />
</button>
</div>
</div>
);
})}
</div>
);
};
【问题讨论】:
标签: reactjs react-redux