监听异步生成的元素变化

如何监听异步生成的元素变化

在开发的过程中,可能会遇到以下的情况:异步生产两个元素A和B,但是B需要根据A的高度来判断是否显示。

() =>(
	<div ref={targetElementRef} className={styles.reallyText}>{text}</div>
	<div style={{ display: showElement ? 'block' : 'none' }} onClick={() => setExpand(false)}>
	  <span>{'Expand'}</span>
	  <DownOutlined className={styles.programIcon} />
	</div>
)

无效的检测

因为异步的原因,在这边的targetElementRef.current.clientHeight是获取不到的

useEffect(() => {
    const targetElementHeight = targetElementRef.current.clientHeight;
    // 根据目标元素的高度进行条件判断,这里示例设置高度大于 100 时显示
    setShowElement(targetElementHeight > 100);
  }, []);

正确的检测

使用MutationObserver监听目标元素变化,保证即便是异步也能获取到真正的高度

  useEffect(() => {
    const observeTargetElement = () => {
      if (targetElementRef.current) {
        const targetElementHeight = targetElementRef.current.clientHeight;

        // 根据目标元素的高度进行条件判断,这里示例设置高度大于 100 时显示
        setShowElement(targetElementHeight > 100);
      }
    };

    // 使用MutationObserver监听目标元素变化
    const observer = new MutationObserver(observeTargetElement);
    observer.observe(targetElementRef.current, { attributes: true, childList: true, subtree: true });

    // 清理函数
    return () => observer.disconnect();
  }, [targetElementRef]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值