我正试图通过Reaction创建一个非常简单的"待办事项 list ".我想要编辑一项任务,只要"编辑"按钮被点击,但之后出现上述错误.根据调试过程,我发现退出减速器作用域后,"任务"变得不确定.我想知道一个国家怎么可能变得不确定.以下是我的代码:

import { useReducer, useRef } from "react";

const App = () => {
  const idCreator = () => {
    return Math.floor(Math.random() * 100000);
  };

  const reducer = (state, action) => {
    switch (action.type) {
      case "add": {
        return [
          ...state,
          {
            task: action.task,
            isEditMode: false,
            isDeleteMode: false,
            id: idCreator()
          }
        ];
      }

      case "edit": {
        const tempObj = state.forEach((item) => {
          if (item.id === action.id) {
            return { ...item, isEditMode: !item.isEditMode };
          } else return item;
        });
        return tempObj;
      }

      default:
        return state;
    }
  };
  const [tasks, dispatch] = useReducer(reducer, []);

  const task = useRef("");

  return (
    <>
      <input
        placeholder="task..."
        onChange={(e) => {
          task.current = e.currentTarget.value;
        }}
      />
      <button
        onClick={() => {
          dispatch({ type: "add", task: task.current });
        }}
      >
        Add
      </button>
      <ul>
        {tasks.map((item) => {
          return (
            <li key={item.id}>
              <input
                value={item.task}
                style={{ display: item.isEditMode ? "inline-block" : "none" }}
                onChange={(e) => {
                  item.task = e.currentTarget.value;
                }}
              />
              <h3
                style={{ display: item.isEditMode ? "none" : "inline-block" }}
              >
                {item.task}
              </h3>
              <button
                style={{ display: "inline-block" }}
                onClick={() => {
                  dispatch({ type: "edit", id: item.id });
                }}
              >
                Edit
              </button>
              <button>Delete</button>
            </li>
          );
        })}
      </ul>
    </>
  );
};

export default App;

任何帮助都将不胜感激.

推荐答案

您使用的是forEachin Reducer,它不会返回任何内容,因此不会返回任何状态,因此出现错误.用map代替

const tempObj = state.map((item) => {
          if (item.id === action.id) {
            return { ...item, isEditMode: !item.isEditMode };
          } else return item;
        });

Reactjs相关问答推荐

下拉Tailwind CSS菜单与怪异beviour

如何处理具有REACTION-REDUX状态的Nextjs路由警卫

有没有一种方法可以在没有强烈动画的情况下有条件地渲染组件?

我应该如何管理设置组件初始状态的复杂逻辑?

如何使ionic 面包屑在州政府条件下可点击?

使用Next.js和Next-intl重写区域设置

React-router动态路径

无法通过react 路由中的链接传递信息

React - 拖放 UML

如何处理页面加载时发生的 reactjs 错误?

Cypress 组件测试不渲染react 组件(但它的内容)

使用 React Router v6 监听来自不同组件的组件状态变化

如何通过onpress on view in react native flatlist来降低和增加特定视图的高度?

将 Material UI 菜单渲染为

在视图列表上react 本机无限循环的反弹动画?

列表应该有一个唯一的关键props

axios post方法中的请求失败,状态码为500错误

如何跟踪 dexie UseLiveQuery 是否完成

如何在 React x 中返回组件?

可以'读取未定义的属性(读取'路径')