最近,我的 React 应用程序中开始出现一个新错误:
ResizeObserver loop limit exceeded
似乎普遍的共识是该错误是良性的,没有什么可担心的。
但是,当我通过 测试我的程序时,我不确定如何忽略它或让它停止显示npm start。
出现的屏幕如下所示:
有什么方法可以抑制此页面或其他地方的此特定错误,这样我就不必每次都将其忽略?
该错误来自我使用的MUI Masonry 组件,但我的理解是它可能来自许多依赖项。
这是我使用它的代码,以防有助于抑制此错误。
import Masonry from '@mui/lab/Masonry';
import { Box } from '@mui/material';
import { ReactNode } from 'react';
import { BsFillPlusSquareFill as AddButton } from 'react-icons/bs';
import { useNavigate } from 'react-router';
import { LoadingIndicator } from '../LoadingIndicator';
import { BackButton } from './BackButton';
import styles from './SheskaList.module.css';
export const SheskaListContent = (props: { loading: boolean, cards: ReactNode[] }) …Run Code Online (Sandbox Code Playgroud) 我想使用ResizeObserver检测 widnow 调整大小事件
我使用的货币
window.addEventListener('resize',() => console.log('resize'));
Run Code Online (Sandbox Code Playgroud)
我想重构它并使用ResizeObserver。是否可以?
我想将 nivo 与 Next 一起使用,但是当我加载包含用 nivo 制作的饼图的页面时,出现以下错误:ReferenceError: ResizeObserver is not defined。
我的Pie.js组件:
import { ResponsivePie } from "@nivo/pie";
export const data = [
{
id: "c",
label: "c",
value: 80,
color: "hsl(8, 70%, 50%)",
},
{
id: "lisp",
label: "lisp",
value: 188,
color: "hsl(122, 70%, 50%)",
},
{
id: "go",
label: "go",
value: 161,
color: "hsl(111, 70%, 50%)",
},
];
export default function MyPie({ data }) {
return (
<ResponsivePie
data={data}
margin={{ top: 40, right: 80, …Run Code Online (Sandbox Code Playgroud) 我试图将一个 div 绝对定位在另一个 div 之上。我试图覆盖的 div 可以根据用户交互更改大小和位置。
我已经使用 resizeObserver 成功匹配了大小,但有一个问题是,如果我试图覆盖的 div 上方的页面改变了高度,则 resizeObserver 不会触发将覆盖的 div 移回原位 - x/y在 resizeObserver 回调中始终为 0/0。
有没有办法观察静态元素的 x/y 位置?
我正在尝试使用 karma 和 jasmine 测试ResizeObserverAngular 12 应用程序中调用的代码。当我通过在浏览器上打开应用程序进行手动测试时,代码表现得非常好,但在我的单元测试中,业力似乎只是忽略了ResizeObserver. 有人知道在业力/茉莉花测试中使用是否存在一些问题ResizeObserver,导致其无法正常工作?
应用程序描述
我构建了一个简单的应用程序来隔离问题。核心代码是一个组件,它只绘制一个被 a 观察的 div ResizeObserver。观察者在调整大小时存储新的 div 大小,并且模板在自己的 div 内显示此信息。
组件核心代码:
@ViewChild('aDiv')
aDiv!: ElementRef;
resizeObserver!: ResizeObserver;
dimensions?: Dimensions;
constructor(private zone: NgZone) { }
ngOnInit(): void {
const that = this;
this.resizeObserver = new ResizeObserver(entries => {
for (const entry of entries) {
if(entry.target.tagName.toLowerCase() === 'div') {
const div = entry.target as HTMLDivElement;
that.onResize(div);
}
}
});
}
ngAfterViewInit(): void {
this.resizeObserver.observe(this.aDiv.nativeElement);
}
ngOnDestroy(): void { …Run Code Online (Sandbox Code Playgroud) 当我手动调整窗口大小时它有效,但当内容高度发生变化时则不起作用,而这正是我所需要的。
难道我做错了什么?
class MainContainer extends React.Component {
constructor(props) {
super(props);
this.containerRef = React.createRef();
this.containerObserver = null;
this.state = {
top: false,
};
}
componentDidMount() {
this.containerObserver = new ResizeObserver((e) => this.handleResize(e));
this.containerObserver.observe(this.containerRef.current);
}
componentWillUnmount() {
if (this.containerObserver) {
this.containerObserver.disconnect();
}
}
handleResize = (e) => {
const { target } = e[0];
const top = target.scrollTop;
const scrollHeight = target.scrollHeight;
const position = scrollHeight - top;
const clientHeight = target.clientHeight;
console.log({ top }, { scrollHeight }, { position }, { …Run Code Online (Sandbox Code Playgroud) 我想检查<body>的宽度变化(而不是高度)。
有没有办法用 ResizeObserver 来做到这一点?
有没有办法检查ResizeObserver给定页面中存在的所有条目?
有开发工具可以帮忙吗?尝试寻找,但没有结果
当某些观察到的元素从 DOM 中删除时,我应该调用.unobserve该元素以防止内存泄漏,还是会“自动不被观察到”?
const ro = new ResizeObserver((entries) => { console.log(entries); });
const el = document.getElementById('foo');
ro.observe(el);
// ... some time later
el.remove();
ro.unobserve(el); // <-- is this needed, or does it happen automatically behind the scenes?
Run Code Online (Sandbox Code Playgroud)
为什么我问:我正在实现一个观察许多孩子的 React 组件,并正确清理未安装组件的观察者将涉及非平凡的代码,如果实际上不需要它,我想避免这种情况。
我看到用户收到错误,ReferenceError: Can't find variable: ResizeObserver即使他们使用的浏览器(Safari v15.6.1、v16.1)是应该支持 ResizeObserver 的版本。
任何人都知道可能是什么原因造成的?
PS - 我还使用polyfill.io为不支持它的浏览器加载ResizeObserver polyfill,但我猜在这些情况下它不会下载polyfill,因为这些浏览器版本应该支持ResizeObserver
谢谢
我有菜单和汉堡按钮可以切换它,并且想测试这种行为。但是,菜单并没有完全消失,只是在隐藏时变得更薄(只有图标可见),所以我不能只测试它是否可见,因为它总是可见。
因此,我通过invoke('width')这样的方式检查尺寸:
cy.get('[data-test="sidebar"]')
.invoke('width')
.should('be.above', 200)
cy.get('[data-test="sidebar-toggle"]')
.click()
cy.get('[data-test="sidebar"]')
.invoke('width')
.should('be.below', 100)
Run Code Online (Sandbox Code Playgroud)
但我收到错误ResizeObserver loop limit exceeded,因为它在单击后不等待菜单转换完成。所以我只是添加了wait(500)之后click(),现在它可以工作了。但这不是有点黑客吗?现在我需要为每个转换设置正确的延迟,或者总是设置一个适用于所有转换的很长的延迟,但这浪费了测试时间。
是否有任何简单的通用方法告诉 Cypress 等待我的宽度达到应有的宽度,而不是立即放弃?
编辑:我对 wait() 解决方案的看法是错误的,它并没有真正的帮助。错误可能与转换无关。无需使用已接受答案中更改的代码 -invoke有效。但是这个关于忽略错误的答案的解决方案是正确的 - 关于此错误有多个问题,并且可以安全地忽略。答案如此简短 - 只需忽略此异常即可。它可以不放在 test 中,而是放在 support/index.js 中,这样它就可以在全球范围内工作。
我已经创建了一个 Web 组件,并尝试将 a 添加ResizeObserver到该元素。
ResizeObserver添加后,connectedCallback它似乎只在元素添加到 DOM 时触发一次,但在元素调整大小时不会再次触发。
我希望ResizeObserver当组件被其父元素强制调整大小时,将被触发。我已经检查并观察了开发人员工具中的元素大小,它确实调整了大小。
我还使用标准 HTML 元素(id:#foo)测试了相同的代码,并且回调有效。所以我只能假设问题与 Shadow DOM 有关。
\n规范说:
\n我可以确认第一点发生了。
\n我预计第五点应该会发生,但它从来没有发生过。如果检查元素,它的大小不是 0,0 并且会随页面调整大小。
\n我已经浏览了 Web 组件的 MDN 文档和ResizeObserver许多其他网站,据我所知,我的一切都是正确的。
这是代码的 JSFiddle:\n https://jsfiddle.net/h15e48fx/1/
\n我试图在某些应用程序中通过 google 自动登录,但收到此错误消息:(未捕获的异常)错误:超过 ResizeObserver 循环限制错误以下错误源自您的应用程序代码,而不是来自 Cypress。
超出 ResizeObserver 循环限制
当赛普拉斯检测到源自您的应用程序的未捕获错误时,它将自动使当前测试失败。
此行为是可配置的,您可以选择通过侦听 uncaught:exception 事件来关闭此行为。
这是我的代码:
describe('empty spec', () => {
it('login multi domain ', () => {
cy.visit('/login');
cy.get('form > .flex').click({force:true});
cy.origin(`https://accounts.google.com`, ()=>{
cy.get("#identifierId").type("user");
cy.get(".VfPpkd-LgbsSe-OWXEXe-k8QpJ").click({force:true});
cy.get(`#password`).type("pass");
cy.get(".VfPpkd-LgbsSe-OWXEXe-k8QpJ").click({force:true});
})
})
})
Run Code Online (Sandbox Code Playgroud)
提前致谢
resize-observer ×13
javascript ×8
reactjs ×3
cypress ×2
dom ×2
angular ×1
animation ×1
automation ×1
callback ×1
eslint ×1
firefox ×1
jasmine ×1
karma-runner ×1
material-ui ×1
next.js ×1
nivo-react ×1
polyfills ×1
resize ×1
typescript ×1