nob*_*are 10 javascript dom resize reactjs
我在 Chrome 上使用 React 15 并希望连接一个事件侦听器来检测对父容器的更改。在四处寻找选项后,我遇到了 ResizeObserver,但不确定如何让它在我的项目中工作。
目前,我将它放在我的构造函数中,但它似乎没有打印任何文本,我不确定在observe调用中放入什么。
class MyComponent extends React.Component {
constructor(props) {
super(props);
const resizeObserver = new ResizeObserver((entries) => {
console.log("Hello World");
});
resizeObserver.observe(somethingGoesHere);
}
render() {
return (
<AnotherComponent>
<YetAnotherComponent>
</YetAnotherComponent>
<CanYouBelieveIt>
</CanYouBelieveIt>
<RealComponent />
</AnotherComponent>
);
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我也不想RealComponent用 a包装div并给它div一个 id。有没有办法RealComponent直接到?
我的目标是观察任何调整大小的变化,RealComponent但MyComponent也很好。我应该在somethingGoesHere插槽中放什么?
编辑:
为了让一些东西工作,我咬紧牙关并div在 周围缠了一个标签RealComponent。然后我给了它一个 id<div id="myDivTag">并更改了observe调用:
resizeObserver.observe(document.getElementById("myDivTag"));
Run Code Online (Sandbox Code Playgroud)
但是,在运行时,我得到:
未捕获的类型错误:resizeObserver.observe 不是函数
任何帮助将不胜感激。
Mar*_*ark 13
编辑:Davidicus 下面的回答更完整,先看那里
ResizeObserver 不能进入构造函数,因为在组件生命周期的那个点上 div 不存在。
我认为您无法绕过额外的 div,因为无论如何反应组件都会减少到 html 元素。
把它放在 componentDidMount 中,它应该可以工作:
componentDidMount() {
const resizeObserver = new ResizeObserver((entries) => {
console.log("Hello World");
});
resizeObserver.observe(document.getElementById("myDivTag"));
}
Run Code Online (Sandbox Code Playgroud)
ComponentDidMount将是设置观察者的最佳位置,但您也想断开ComponentWillUnmount.
class MyComponent extends React.Component {
resizeObserver = null;
resizeElement = createRef();
componentDidMount() {
this.resizeObserver = new ResizeObserver((entries) => {
// do things
});
this.resizeObserver.observe(this.resizeElement.current);
}
componentWillUnmount() {
if (this.resizeObserver) {
this.resizeObserver.disconnect();
}
}
render() {
return (
<div ref={this.resizeElement}>
...
</div>
);
}
}
Run Code Online (Sandbox Code Playgroud)
我最近正在解决类似的问题,不同之处在于我的应用程序主要使用钩子和功能组件。
以下是如何在 React 功能组件中使用 ResizeObserver 的示例(在打字稿中):
const resizeObserver = React.useRef<ResizeObserver>(new ResizeObserver((entries:ResizeObserverEntry[]) => {
// your code to handle the size change
}));
const resizedContainerRef = React.useCallback((container: HTMLDivElement) => {
if (container !== null) {
resizeObserver.current.observe(container);
}
// When element is unmounted, ref callback is called with a null argument
// => best time to cleanup the observer
else {
if (resizeObserver.current)
resizeObserver.current.disconnect();
}
}, [resizeObserver.current]);
return <div ref={resizedContainerRef}>
// Your component content here
</div>;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9067 次 |
| 最近记录: |