当前位置:首页 > React

react如何获取li每个的宽度

2026-01-25 16:07:51React

获取每个 <li> 元素宽度的方法

在 React 中获取每个 <li> 元素的宽度可以通过 refuseEffect 结合实现。以下是具体实现步骤:

使用 useRefuseEffect

创建 ref 数组存储每个 <li> 的引用,并在组件挂载后通过 getBoundingClientRect() 获取宽度:

import React, { useRef, useEffect, useState } from 'react';

function ListComponent() {
  const items = ['Item 1', 'Item 2', 'Item 3'];
  const liRefs = useRef([]);
  const [widths, setWidths] = useState([]);

  useEffect(() => {
    const newWidths = liRefs.current.map(ref => ref.getBoundingClientRect().width);
    setWidths(newWidths);
  }, []);

  return (
    <ul>
      {items.map((item, index) => (
        <li
          key={index}
          ref={el => liRefs.current[index] = el}
        >
          {item} - Width: {widths[index]?.toFixed(2)}px
        </li>
      ))}
    </ul>
  );
}

动态响应宽度变化

若需监听窗口大小变化,添加 resize 事件监听器:

useEffect(() => {
  const handleResize = () => {
    const newWidths = liRefs.current.map(ref => ref.getBoundingClientRect().width);
    setWidths(newWidths);
  };

  window.addEventListener('resize', handleResize);
  handleResize(); // 初始计算

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

使用自定义 Hook 封装逻辑

将逻辑抽象为可复用的 Hook:

react如何获取li每个的宽度

function useElementWidths(itemCount) {
  const refs = useRef([]);
  const [widths, setWidths] = useState([]);

  useEffect(() => {
    const updateWidths = () => {
      setWidths(refs.current.map(ref => ref?.getBoundingClientRect().width || 0));
    };
    updateWidths();
    window.addEventListener('resize', updateWidths);
    return () => window.removeEventListener('resize', updateWidths);
  }, [itemCount]);

  return { refs, widths };
}

// 使用示例
function ListComponent() {
  const items = ['Item 1', 'Item 2', 'Item 3'];
  const { refs, widths } = useElementWidths(items.length);

  return (
    <ul>
      {items.map((item, index) => (
        <li key={index} ref={el => refs.current[index] = el}>
          {item} - Width: {widths[index]?.toFixed(2)}px
        </li>
      ))}
    </ul>
  );
}

注意事项

  1. 避免索引错位:确保 ref 回调中的索引与渲染的列表项严格对应。
  2. 性能优化:频繁的 resize 事件可能影响性能,可考虑使用防抖(debounce)技术。
  3. SSR 兼容:在服务端渲染时 getBoundingClientRect() 不可用,需添加条件判断。

通过以上方法,可以准确获取并动态跟踪每个 <li> 元素的宽度。

标签: 宽度react
分享给朋友:

相关文章

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指的是在某些条件下阻止组件渲染或中断正在进行的渲染过程。以下是几种常见的方法: 条件渲染 通过条件判断决定是否渲染组件或部分内容。可以使用if语句或三元运…

如何改造react

如何改造react

改造 React 项目的关键方法 分析当前项目结构 通过评估现有组件、状态管理和依赖项,明确需要改进的部分。使用工具如 webpack-bundle-analyzer 识别性能瓶颈。 升级 Reac…

react 如何精通

react 如何精通

掌握核心概念 深入理解React的基础概念,包括组件(函数组件与类组件)、状态(useState)、生命周期(useEffect)、Props传递、虚拟DOM与Diff算法。通过官方文档或《React…

odyssey react 如何

odyssey react 如何

Odyssey React 是耐克推出的一款跑鞋系列,以其轻量化设计和React泡沫缓震技术著称。以下是关于该系列鞋款的主要特点和使用建议: 核心特点 React泡沫中底提供出色的能量回馈和缓震效果…

react项目如何启动

react项目如何启动

启动React项目的步骤 确保已安装Node.js(建议版本12以上)和npm/yarn。可通过以下命令检查版本: node -v npm -v 全局安装create-react-app脚手架工具(…

小白如何搭建react

小白如何搭建react

安装 Node.js 和 npm 确保系统已安装 Node.js(包含 npm)。可通过官网下载安装包(https://nodejs.org/),选择 LTS 版本。安装完成后,终端运行以下命令验证版…