当前位置: 首页 > 知识库问答 >
问题:

如何解决这个错误:错误:呈现了更多的钩子比在上一次呈现期间?

储仲渊
2023-03-14

我能用钩子解决这个问题吗?

为什么它不能正常工作?

我开始使用REACT DND,在我尝试使用拖放后,所有的事情都出了问题。

我将其用作依赖项:

>

  • “@testing-library/jest-dom”:“^4.2.4”,

    "@testing-library/react":"^9.5.0",

    已部署项目-hunger-tree.surge.sh



    src/components/todos/createTodo.js

    import React, { useRef } from "react";
    import PropTypes from "prop-types";
    import { connect } from "react-redux";
    import { useDrag, useDrop } from "react-dnd";
    import actions from "../../actions";
    
    const ItemTypes = {
      CARD: "todo",
    };
    
    function createTodo(props) {
      const currTodos = props.todos();
      return currTodos.map((elem, index) => {
        const ref = useRef(null);
    
        const [{ isDragging }, drag] = useDrag({
          item: { type: ItemTypes.CARD, index },
          collect: (monitor) => ({
            isDragging: monitor.isDragging(),
          }),
        });
    
        const [, drop] = useDrop({
          accept: ItemTypes.CARD,
          hover(item, monitor) {
            if (!ref.current) {
              return;
            }
            const dragIndex = item.index;
            const hoverIndex = index;
            // Don't replace items with themselves
            if (dragIndex === hoverIndex) {
              return;
            }
            const dragTodo = props.thirdData[dragIndex];
            const todoStart = props.thirdData.slice(0, hoverIndex - 1);
            const todoEnd = props.thirdData.slice(hoverIndex);
            todoStart.splice(todoStart.indexOf(dragTodo), 1);
            todoEnd.splice(todoStart.indexOf(dragTodo), 1);
    
            const withoutTodos = [...todoStart, dragTodo, ...todoEnd];
            props.setThirdData(withoutTodos);
    
            item.index = hoverIndex;
          },
        });
        drag(drop(ref));
        return (
          <li key={index} ref={drag} style={{ opacity: isDragging ? 0.5 : 1 }}>
            <span
              className={`todos_block-text ${
                elem.isComplete ? "todos_block-text_done" : ""
              }`}
              onClick={() => props.onDoneTodo(elem.label)}
            >
              {elem.label}
            </span>
            <button
              className="todos_block-trash"
              onClick={() => props.onDeleteTodo(elem.label)}
            >
              x
            </button>
          </li>
        );
      });
    }
    
    createTodo.propTypes = {
      thirdData: PropTypes.array,
      setThirdData: PropTypes.func,
    };
    
    const mapStateToProps = (store) => {
      return {
        thirdData: store.thirdData.data,
      };
    };
    
    const mapDispatchToProps = (dispatch) => {
      return {
        setThirdData: (data) => dispatch(actions.setThirdData(data)),
      };
    };
    
    export default connect(mapStateToProps, mapDispatchToProps)(createTodo);
    
  • 共有1个答案

    樊奇思
    2023-03-14

    出现此错误是因为您正在循环内部使用钩子。钩子实现禁止这样做,您可以在这里找到更多内容:

    在此输入链接说明

    因此,您可能需要在单独的组件中分离todo项,以便在组件顶部使用钩子。

     类似资料:
    • 我目前正在实现useSWR,以便从我的express和mongo-db后端获取数据。我能够顺利地从数据库中提取数据没有问题。下面是我用来实现这一点的代码: 然后通过以下方式访问: ,其中username是集合中的一个字段。 当我尝试将此信息添加到状态钩子中时,问题就出现了,然后状态钩子返回的错误呈现的钩子比上一次呈现的钩子要多。 删除行:和使用状态变量displayNumber的任何行就可以完全修

    • 一个组件,它呈现已填好的表单的预览,当您单击左侧的表单时,它会在右侧显示它们。 第一个handleSwitchReview向我抛出了React钩子,所呈现的钩子比上一个呈现错误时要多 第二个不是。当我控制台日志道具,例如,我得到他们4-5次时,第一个函数的视图显示,但没有第二次,第二次只显示1次在控制台日志。 尝试移动setState并在控制台中记录父组件,但这个组件是唯一一个启动了很多次并中断的

    • 我正在使用 React 的钩子,我希望有一个从数据库中检索到的值作为初始值。但是,我收到以下错误: 不变冲突:不变冲突:与上一次渲染相比,渲染的钩子更多。 我用的是反应阿波罗钩。 更新

    • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

    • 我有一个组件看起来是这样的(非常简化的版本): 加载使用此组件的页面时,出现以下错误:我试图找到此错误的解释,但搜索未返回任何结果。 当我稍微修改组件时: 我再也不知道那个错误了。是因为我在由返回的jsx中包含了函数吗?如果能有一个解释为什么修复是有效的,那就太好了。

    • 我正在尝试为android编程设置IntelliJ IDEA,但我无法呈现main.xml。 RenderingException:这个版本的呈现库比您的IntelliJ IDEA版本更新。请在org.jetbrains.android.uipreview.renderServiceFactor.LoadLibrary(renderServiceFactor.java:158)在org.jetbr