当前位置:首页 > 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:

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如何获取li每个的宽度

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

相关文章

react moment如何使用

react moment如何使用

安装 react-moment 通过 npm 或 yarn 安装 react-moment 包。确保项目中已安装 moment.js,因为 react-moment 依赖它。 npm install…

react如何取消渲染

react如何取消渲染

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

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修改…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实…

如何记忆react

如何记忆react

理解核心概念 React的核心概念包括组件、状态(state)、属性(props)、生命周期方法(类组件)和钩子(函数组件)。掌握这些基础概念是记忆React的关键。组件是React应用的构建块,分为…

react 如何分页

react 如何分页

分页实现方法 在React中实现分页功能可以通过多种方式完成,具体取决于数据来源(如API或本地数据)和UI库的选择。以下是常见的实现方法: 使用本地数据分页 对于存储在组件状态或Context中…