我正在React中构建一个Notes应用程序,并将笔记存储在Firestore中。如果我从Firestore中阅读的内容超过三行,我希望显示“阅读更多”按钮。如果没有,那么我不想显示“阅读更多”按钮。
也使用Tailwind的样式,我知道他们有一个线营插件和类称为“截断”,但我不知道如何实现它与条件渲染按钮。所以任何帮助如何实现这将不胜感激。这里是我的代码,需要截断的文本。
<div>
<p className="break-words text-xl">{note?.noteContent}</p>
</div>
2条答案
按热度按时间m2xkgtsf1#
您可以使用以下内容对文本设置字符限制。
然后就像
ha5z0ras2#
使用CSS(或Tailwind)截断到特定行是一个很好的方法。然后您需要使用JavaScript来检测文本是否被截断,以便您可以决定显示/隐藏“阅读更多”按钮。这可以通过比较元素的
scrollHeight
和offsetHeight
来完成。scrollHeight
度量元素内容的高度,包括溢出(MDN link)隐藏的任何内容。offsetHeight
度量元素的呈现高度,它排除了溢出隐藏的任何内容(MDN link)所以,如果
scrollHeight
大于offsetHeight
,我们知道我们的元素有一些溢出。在这种情况下,我们的文本被截断了。为了在React中使用这些值,我们需要使用ref
和useLayoutEffect
钩子。完整示例代码
这里假设你只需要一个“Read more”按钮。我将包括另一个带有“Read less”选项的例子。
代码演练
如上所述,
useTruncatedElement
钩子会判断段落是否被截断。它还会返回一些状态,以确定“Read more”按钮是否已被单击。这样我们就可以通过删除line-clamp-3
类来扩展文本,并在单击按钮后隐藏按钮(或将文本更改为“Read less”)。Tailwind的线夹插件
这个插件用一个
line-clamp-{n}
形式的类来处理截断。它将以下CSS添加到元素中(如果你没有使用tailwind,你可以添加它):要安装插件:
x1米11米1x
或
yarn add -D @tailwindcss/line-clamp
然后将其添加到
tailwind.config.cjs
文件中的插件数组中:多显示/少显示
如果你想要一个切换,这样用户就可以在展开文本后再次截断它(一种显示更多/显示更少的场景),那么你可以从钩子返回一个切换函数: