react-beautiful-dnd Invariant failed: Cannot find droppable entry with id
2024-08-05
221
使用react-beautiful-dnd做拖拽效果,但是根据示例代码运行后,指点拖动元素就会报错:
Uncaught runtime errors:
ERROR
Invariant failed: Cannot find droppable entry with id [droppable]
从GitHub和stackoverflow上找到了相关的问题。引起报错的原因是因为 React 18 StrictMode 严格模式。
StrictMode是一种让你知道代码中是否可能犯错误的方法。不幸的是,将严格模式与react-beautiful-dnd一起使用会导致令人沮丧的 无法找到带有id的可拖动对象:[...] 的错误。
下面有两种解决方法,推荐使用第二种。
1 关闭严格模式 React.StrictMode
可以通过从应用程序中删除严格模式来简单地解决此问题。
修改方法是修改根目录下的index.js文件
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
// 去掉 <React.StrictMode> ,改为
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<BrowserRouter>
<App />
</BrowserRouter>
);
这个方式实测有效,但是不推荐。
2 封装一个自定义Dropable组件
import { useEffect, useState } from "react";
import { Droppable } from "react-beautiful-dnd";
export const CustomDroppable = ({ children, ...props }) => {
const [enabled, setEnabled] = useState(false);
useEffect(() => {
const animation = requestAnimationFrame(() => setEnabled(true));
return () => {
cancelAnimationFrame(animation);
setEnabled(false);
};
}, []);
if (!enabled) {
return null;
}
return <Droppable {...props}>{children}</Droppable>;
};
用CustomDroppable替代原来的Droppable组件,实测完美解决。
更新于:5个月前赞一波!1
相关文章
- react使用echart图文教程
- 国外流行的前端框架有哪些?
- react前端基础面试题和答案
- React路径不变location.search参数改变不触发useEffect
- 在IIS部署React前端项目
- React Error: Exceeded timeout of 5000 ms for a test. 错误
- React @testing-library UserEvent.paste用法更新到14版本后不生效
- @testing-library/react单元测试getBy queryBy和findBy的区别
- React获取url参数的几种方法
- react监听路由变化
- Vue和React怎么选?
- react hooks获取url参数
- react单元测试模拟点击浏览器返回按钮时触发popstate事件
- react基础面试问题
- react获取url参数 忽略参数名大小写
- react获取url参数不区分大小写
- 如何在React中使用路由?
- 如何在 React 中使用 GraphQL
- 前端学react还是vue?
- 如何在React中使用Redux?
文章评论
评论问答