reactjs 如何在React中检测和分组溢出元素

hgqdbh6s  于 5个月前  发布在  React
关注(0)|答案(2)|浏览(69)

假设我有一个导航栏,并将根据我拥有的数组在导航栏中呈现N个锚元素(类型类似于[text:string,href:string][])
检测哪些元素将从导航栏中溢出(在x轴上),以便我可以决定将它们呈现在其他地方(如More Links x1)的最佳实践是什么?

lzfw57am

lzfw57am1#

我在下面添加示例代码。

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

const Navbar = ({ links }) => {
  const navbarRef = useRef(null);
  const [overflowLinks, setOverflowLinks] = useState([]);

  useEffect(() => {
    const navbar = navbarRef.current;
    const linksArray = Array.from(navbar.getElementsByTagName('a'));

    const navbarWidth = navbar.offsetWidth;
    let currentWidth = 0;
    const overflowLinksArray = [];

    linksArray.forEach((link, index) => {
      const linkWidth = link.offsetWidth;

      if (currentWidth + linkWidth > navbarWidth) {
        overflowLinksArray.push(index);
      } else {
        currentWidth += linkWidth;
      }
    });

    setOverflowLinks(overflowLinksArray);
  }, [links]);

  return (
    <div>
      <div className="navbar" ref={navbarRef}>
        {links.map((link, index) => (overflowLinks.indexOf(index) == -1 ?
          <a key={index} href={link[1]}  style={{color:'green'}}>
            {link[0]}
          </a> : null
        ))}
      </div>

      {overflowLinks.length > 0 && (
        <div className="more-links-dropdown">
          {overflowLinks.map((index) => {
            const link = links[index];
            return <a key={index} href={link[1]} style={{color:'red'}}>
              {link[0]}
            </a>
          })}
        </div>
      )}
    </div>
  );
};

// Example usage
const App = () => {
  const linksArray = [
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    ['Link 1', '/link1'],
    ['Link 2', '/link2'],
    // Add more links as needed
  ];

  return <Navbar links={linksArray} />;
};

export default App;

字符串

iqxoj9l9

iqxoj9l92#

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

const YourNavbar = ({ links }) => {
  const navbarRef = useRef(null);
  const [overflowingLinks, setOverflowingLinks] = useState([]);

  useEffect(() => {
    const navbarWidth = navbarRef.current.offsetWidth; // Get navbar width

    let totalWidth = 0;
    const overflowLinks = [];

    // Measure each anchor element and calculate total width
    links.forEach((link) => {
      const anchor = document.getElementById(link.href); // Get anchor element by ID
      if (anchor) {
        const { width } = anchor.getBoundingClientRect(); // Get width of anchor element
        totalWidth += width;

        if (totalWidth > navbarWidth) {
          overflowLinks.push(link); // Add overflowing links to a separate array
        }
      }
    });

    setOverflowingLinks(overflowLinks);
  }, [links]);

  return (
    <nav ref={navbarRef}>
      {links.map((link) => (
        <a key={link.href} id={link.href} href={link.href}>
          {link.text}
        </a>
      ))}

      {/* Render More Links dropdown */}
      {overflowingLinks.length > 0 && (
        <div className="more-links-dropdown">
          {overflowingLinks.map((link) => (
            <a key={link.href} href={link.href}>
              {link.text}
            </a>
          ))}
        </div>
      )}
    </nav>
  );
};

export default YourNavbar;

字符串
说明:此代码测量导航栏中每个锚元素的宽度,并将其与可用空间(navbarWidth)进行比较。如果锚元素的总宽度超过可用空间,则它将识别哪些链接溢出(overflowingLinks),并将其呈现在“更多链接”选项卡或单独的容器中。

相关问题