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

React中自定义hook结合filter时useRef初始渲染返回undefined问题

问题分析

你开发的图片滑块组件搭配自定义hook useSizeElement,在完整数据渲染时正常,但过滤数据后单独渲染会触发Uncaught TypeError: elementRef.current is undefined错误,核心原因是过滤后可能无数据,导致Item组件未渲染,useSizeElement却尝试访问未绑定真实DOM的ref。

解决办法

1. 在hook中添加空值校验

修改useSizeElement,每次访问elementRef.current前先判断是否存在:

function useSizeElement() {
  const elementRef = useRef(null);
  const [size, setSize] = useState({ width: 0, height: 0 });

  useEffect(() => {
    if (!elementRef.current) return;

    const updateSize = () => {
      if (elementRef.current) {
        const { width, height } = elementRef.current.getBoundingClientRect();
        setSize({ width, height });
      }
    };

    updateSize();
    window.addEventListener('resize', updateSize);
    return () => window.removeEventListener('resize', updateSize);
  }, []);

  return { elementRef, size };
}

2. 前置判断过滤后的数据状态

渲染SliderTwo组件前,先检查过滤后的数据是否为空,为空则渲染占位内容或不渲染组件:

const filteredData = data.filter(/* 你的过滤逻辑 */);
if (filteredData.length === 0) {
  return <div>暂无内容</div>;
}
return <SliderTwo data={filteredData} />;

3. 在Item组件中做条件渲染与ref绑定

确保只有Item组件存在有效内容时,才渲染DOM并绑定ref:

function Item({ item, elementRef }) {
  if (!item) return null;
  return <div ref={elementRef}>{/* 组件内容 */}</div>;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:10:35