You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

浏览器resize时如何正确触发useEffect调整react-slick轮播卡片高度

你出现报错的核心原因是违反了React Hook的调用规则:所有Hook只能在组件的顶层作用域调用,不能嵌套在事件回调、循环、条件判断内部,因此不能把React.useEffect写在resize事件的回调函数里。

你可以把resize监听逻辑整体放到useEffect内部处理,同时记得在组件卸载时移除监听避免内存泄漏,优化后的代码如下:

const [upcomingEventsHeight, setUpcomingEventsHeight] = React.useState("auto");

// 封装获取高度的逻辑,方便复用
const updateSliderHeight = () => {
  const sliderTrack = document.getElementsByClassName("slick-track")[0];
  if (sliderTrack) {
    setUpcomingEventsHeight(`${sliderTrack.clientHeight}px`);
  }
};

React.useEffect(() => {
  // 组件首次挂载时等待slick初始化完成后获取高度
  const initTimer = setTimeout(updateSliderHeight, 3000);

  // 防抖函数,避免resize频繁触发执行
  let debounceTimer = null;
  const handleResize = () => {
    clearTimeout(debounceTimer);
    // 可以根据需求调整防抖间隔,300ms是通用的窗口调整防抖阈值
    debounceTimer = setTimeout(updateSliderHeight, 300);
  };

  // 注册resize监听
  window.addEventListener('resize', handleResize);

  // 组件卸载时清除所有定时器和监听事件,避免内存泄漏
  return () => {
    clearTimeout(initTimer);
    clearTimeout(debounceTimer);
    window.removeEventListener('resize', handleResize);
  };
}, []);

内容的提问来源于stack exchange,提问作者inquisitivemongoose

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:51:02