当 <td 中有超过 3 行时如何显示图标>

How to display an icon when there are more than 3 lines in <td>

提问人:doobean 提问时间:11/16/2023 更新时间:11/16/2023 访问量:25

问:


当表格单元格中有超过 3 行文本时,我正在尝试在表格单元格中显示 SVG 图标。

此表正文的文本数据如下所示:

  const bodyData = [
    <>Cell 1</>,
    <>
      <ul>
        <li>Cell 2 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed dictum ante eget massa rhoncus
      tincidunt.</li>
      </ul>
    </>,
    <>Cell 3</>,
    <>
      Cell 4 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed dictum ante eget massa rhoncus
      tincidunt. Nullam vestibulum euismod justo, vitae bibendum enim auctor nec. Integer a lorem
      nec nibh tincidunt volutpat. Duis non consequat erat.
    </>,
  ];

它像这样映射这些数据:

     <tbody>
       <tr>
         {bodyData.map((text, index) => (
           <td>
             <Content>{text}</Content>
           </td>
         ))}
       </tr>
     </tbody>

我尝试过使用滚动高度和客户端高度调整大小观察器,如下所示:


useEffect(() => {
    const textElements = document.querySelectorAll('.text-container');
    if (textElements.length > 0) {
      resizeObserver.current = new ResizeObserver(entries => {
        entries.forEach(entry => {
          const truncated = entry.target.scrollHeight > entry.target.clientHeight;
           // How can I change this logic to detect if it's more than 3 lines...
          if (truncated) {
             // TODO: logic to display an icon
          }
        });
      });

      textElements.forEach(textElement => {
        resizeObserver.current?.observe(textElement);
      });
    }

    return () => {
      if (resizeObserver.current) {
        resizeObserver.current.disconnect();
      }
    };
  }, []);

这是错误的。我被困住了。我真的不知道如何检测每个表格单元格中的文本是否超过 3 行。

我之所以命名这个变量,是因为我还想在文本超过 3 行时截断文本。但是我发现它可以通过css(线夹)来实现。如果有人能帮我解决这个问题,我将不胜感激。谢谢。truncated

reactjs html-table 调整大小观察者

评论

0赞 Sahab 11/16/2023
您可以将字符串转换为等于 3 行的特定字符,然后显示带有链接的“阅读更多”按钮
0赞 doobean 11/17/2023
@Sahab 您好,感谢您的建议。不幸的是,我必须处理不同的语言,因此它无法正常工作:(

答:

0赞 Qasim 11/16/2023 #1

因此,要确定任何表格单元格中的文本是否超过 3 个字符,可以使用 clientHeight、scrollHeight 和 line-height 的组合。请尝试下面的代码。

useEffect(() => {
  const textElements = document.querySelectorAll('.text-container');

  if (textElements.length > 0) {
    resizeObserver.current = new ResizeObserver(entries => {
      entries.forEach(entry => {
        const lineHeight = parseInt(window.getComputedStyle(entry.target).lineHeight);
        const numberOfLines = Math.floor(entry.target.clientHeight / lineHeight);

        // Check if the number of lines is greater than 3
        if (numberOfLines > 3) {
          // TODO: logic to display an icon
          console.log('More than 3 lines');
        }
      });
    });

    textElements.forEach(textElement => {
      resizeObserver.current?.observe(textElement);
    });
  }

  return () => {
    if (resizeObserver.current) {
      resizeObserver.current.disconnect();
    }
  };
}, []);

所以基本上我们是在计算字符存储的字符高度,然后将客户端高度除以字符高度来确定字符数。如果行数超过 3,则可以使用逻辑来显示图标。

注意:确保表格单元格中文本的行高相同,因为计算基于确切的行高值。

:)

评论

0赞 doobean 11/16/2023
感谢您的回复。我已经试过了,所有的表格单元格(即使文本少于 3 行)都达到了逻辑 numberOfLines > 3