封装Ellipsis组件,亲测使用各种场景

news2025/2/25 17:45:10

自己封装了Ellipsis组件 基于react+taro,以下是实现代码,分为JSX和CSS文件

JSX代码如下:
import { FC, Fragment, JSX, useState } from 'react';
import { Image, StandardProps, Text, View } from '@tarojs/components';

import iconDropDown from '@/assets/icons/icon-dorpdown-primary.svg';
import useBoundingClientRect from '@/hooks/useBoundingClientRect';

import './index.less';

interface EllipsisProps {
  rows?: number;
  /**
   * 收起节点
   */
  foldRender?: JSX.Element;
  /**
   * 是否显示收取按钮
   */
  showFold?: boolean;
  /**
   * 展开节点
   */
  unfoldRender?: JSX.Element;
  /**
   * 是否显示展开按钮
   */
  showUnfold?: boolean;
  onChange?: (val: boolean) => void;
}

const Ellipsis: FC<EllipsisProps & StandardProps> = ({
  rows = 1,
  children,
  className,
  showUnfold,
  unfoldRender,
}) => {
  const [show, setShow] = useState(false);
  const [rectAssist] = useBoundingClientRect('#rectAssist', [children]);
  const [rectActual] = useBoundingClientRect('#rectActual', [children]);

  const style = {
    lineClamp: rows,
    webkitLineClamp: rows,
  };

  const showMoreBtn =
    !show &&
    showUnfold &&
    rectActual?.height &&
    rectAssist?.height &&
    Number(rectActual?.height) !== Number(rectAssist?.height);

  return (
    <Fragment>
      <View
        style={{ position: 'absolute', left: 0, top: -999999, opacity: 0 }}
        className={className}
        id="rectAssist"
      >
        {children}
      </View>

      <View
        className={`lineClamp__1 ${className}`}
        style={!show ? style : { display: 'block' }}
        id="rectActual"
      >
        {children}
        {!!showMoreBtn && (
          <View className="unfold-wrap" id="unfoldWrap" onClick={() => setShow(true)}>
            {unfoldRender || (
              <View className="unfold-btn">
                <Text>查看更多</Text>
                <Image src={iconDropDown} />
              </View>
            )}
          </View>
        )}
      </View>
    </Fragment>
  );
};

export default Ellipsis;

其中useBoundingClientRect 是自定义的hook,代码如下

import React, { useEffect, useState } from 'react';
import Taro, { NodesRef } from '@tarojs/taro';

const useBoundingClientRect = (
  selector: string,
  deps?: React.DependencyList,
): [rect: NodesRef.BoundingClientRectCallbackResult | undefined] => {
  const [rect, setRect] = useState<
    NodesRef.BoundingClientRectCallbackResult | NodesRef.BoundingClientRectCallbackResult[]
  >();

  useEffect(() => {
    Taro.nextTick(() => {
      Taro.createSelectorQuery()
        .select(selector)
        .boundingClientRect((respRect) => {
          setRect(respRect);
        })
        .exec();
    });
  }, [...(deps || [])]);

  return [rect as any];
};

export default useBoundingClientRect;

Css代码如下,目前在项目中使用less预编译处理器

.lineClamp(@row) {
  display: -webkit-box;
  overflow: hidden;
  line-clamp: @row;
  -webkit-line-clamp: @row;
  -webkit-box-orient: vertical;
  position: relative;
}

.lineClamp__1 {
  .lineClamp(1);

  &::after {
    color: red;
    position: absolute;
    right: 0;
    bottom: 5px;
  }
}

.lineClamp__2 {
  .lineClamp(2);
}

.lineClamp__3 {
  .lineClamp(3);
}

.unfold-wrap {
  position: absolute;
  right: 0;
  bottom: 0;
  display: flex;
  background: linear-gradient(to left, #fff, #fff, #fff, rgba(255, 255, 255, 0.4));
}

.unfold-btn {
  display: flex;
  flex-direction: row;
  align-items: center;
  min-width: 32px;
  padding: 4px 10px 4px 30px;
  line-height: 1;

  text {
    color: #b89962;
    font-size: 12px;
    font-style: normal;
    font-weight: 400;
    line-height: 12px; /* 100% */
  }

  image {
    width: 13px;
    height: 12px;
  }
}

效果如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/863064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年初中信息技术学科暑假备课

目录 2023年初中信息技术学科暑假备课1. 创意空间1.1 教师的空间1.2 学生的空间1.3 关于FTP服务器设置 2. 什么是编程2.1 编程语言2.2 人人都应学好编程2.3. 编程难吗&#xff1f;2.4 python用途 3. 开发环境3.1 打开IDLE3.2 IDLE窗口3.2.1 shell窗口和编辑窗口 4. 项目式教学4…

SysML V1.2 P1.概述

Scope SysML重用UML 2的子集&#xff0c;并提供额外的扩展来满足语言的需求。该规范根据UML 2中被重用的部分和UML 2的扩展&#xff0c;记录了语言体系结构。该规范包括完整语言的具体语法(符号)&#xff0c;并指定UML 2的扩展。UML 2规范的可重用部分没有直接包含在规范中&…

解析Python面向对象:从小白到面向对象大师的蜕变之路

文章目录 一 类和对象的概念二 类的认识2.1 类的定义和使用语法2.2 成员变量和成员方法 三 类和对象3.1 类和对象的关系3.2 构造方法3.3 魔术方法概述&#xff08;内置类方法&#xff09;3.4 内置方法详解 四 面向对象三大特性4.1 封装4.1.1 封装的理解4.1.2 私有成员变量和方法…

致谢丨感谢有你,JumpServer开源项目九周年致谢名单

2014年到2023年&#xff0c;JumpServer开源项目已经走过了九年的时间。感谢以下社区贡献者对JumpServer项目的帮助和支持。 因为有你&#xff0c;一切才能成真。 JumpServer开源项目贡献者奖杯将于近日邮寄到以上贡献者手中&#xff0c;同时JumpServer开源项目组还准备了一份小…

2023年计算机科学与信息技术国际会议(ECCSIT 2023)

会议简介 Brief Introduction 2023年计算机科学与信息技术国际会议(ECCSIT 2023) 会议时间&#xff1a;2023年12月15日-17日 召开地点&#xff1a;中国北海 大会官网&#xff1a;www.eccsit.org 2023年计算机科学与信息技术国际会议(ECCSIT 2023)由国际电气、电子与能源工程协会…

Redis_哨兵模式

9. 哨兵模式 9.1 简介 当主库宕机&#xff0c;在从库中选择一个&#xff0c;切换为主库。 问题: 主库是否真正宕机?哪一个从库可以作为主库使用?如何实现将新的主库的信息通过给从库和客户端&#xff1f; 9.2 基本流程 哨兵主要任务&#xff1a; 监控选择主库通知 会有…

100个Java工具类之42:序列化工具类Apache之SerializationUtils

序列化工具类Apache之 org.apache.commons.lang3.SerializationUtils 众所周知&#xff1a;Java中序列化是指&#xff0c;将Java对象转换为可存储传输的字节序列的过程。 序列化作用&#xff1a; 1、网络传输&#xff1a;网络可以传输字节化的java对象 2、数据安全&#xf…

jQuery EasyUI datagrid 无记录时,增加“暂无数据“提示

我们只需要在onLoadSuccess中添加如下代码&#xff1a; if (data.total 0) {var body $(this).data().datagrid.dc.body2;body.find(table tbody).append(<tr><td width" body.width() " style"height: 35px; text-align: center;"><h…

20230811导出Redmi Note12Pro 5G手机的录音机APP的录音

20230811导出Redmi Note12Pro 5G手机的录音机APP的录音 2023/8/11 10:54 redmi note12 pro 录音文件 位置 貌似必须导出录音&#xff0c;录音的源文件不知道存储到哪里了&#xff01; 参考资料&#xff1a; https://jingyan.baidu.com/article/b87fe19e9aa79b1319356842.html 红…

以数据为中心的标记语言--yaml

&#x1f600;前言 本篇博文是关于以数据为中心的配置文件yaml的说明和应用&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&…

2023年电赛---运动目标控制与自动追踪系统(E题)—— 视觉部分

文章目录 一、前言二、视觉部分2.1&#xff1a;k210识别激光点2.2&#xff1a;k210识别方框和4个角点 三、总结 一、前言 &#x1f337;此次电赛我负责的部分主要是视觉&#xff0c;所以我着重和详细讲解一下视觉部分&#xff0c;不止限于此次电赛&#xff0c;而是从这次电赛视…

canfestival_主站发送同步对象触发主站PDO发送

1.入口处 2.开启定时器 3.调用定时器函数 4.切换到初始化状态&#xff0c;自动切换到预操作状态&#xff0c;最后进入操作状态 看到在预操作状态下&#xff0c;进行了通信状态的切换&#xff0c;调用相应的函数&#xff0c;如下&#xff1a; 5.调用开启SYNC的函数 查找对象字典…

让机器人懂得人类“常识”,3D语义地图能做到吗?

机器人需要一张保姆级地图。 随着机器人的智能化技术不断迭代&#xff0c;对于复杂的行为决策、人机交互等任务仅感知环境的空间几何信息已无法满足要求&#xff0c;它需要让机器人能够像人一样&#xff0c;懂得环境中的物体类别及其位置&#xff0c;即环境的语义信息。以扫地机…

字节跳动基于火山引擎DataLeap的一站式数据治理架构实践

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 在7月22日举行的 ArchSummit 全球架构师峰会&#xff08;深圳站&#xff09;上&#xff0c;来自火山引擎DataLeap的技术专家为大家带来了字节跳动基于火山引擎DataL…

day16:static、final、常量(static final)、

一、static 特点&#xff1a;属于类 、存储在方法去、只有一份或者只执行一次、随类运行执行 可以修饰静态变量 、静态方法 、静态代码块 静态变量能否继承&#xff1f; 静态变量属于类&#xff0c;是共享的资源&#xff0c;不认为是被继承的 静态变量不可以定义在静态方法中…

数据库数据恢复-Oracle数据库数据恢复案例

数据库数据恢复环境&#xff1a; Oracle数据库ASM磁盘组有4块成员盘。 数据库故障&分析&#xff1a; Oracle数据库ASM磁盘组掉线 &#xff0c;ASM实例无法挂载&#xff0c;用户联系我们要求恢复oracle数据库。 数据库数据恢复工程师拿到磁盘后&#xff0c;先将所有磁盘以只…

批量翻译多个文件夹,让你的文件管理更智能高效!

大家好&#xff01;对于经常需要管理大量文件夹的你来说&#xff0c;每次手动逐个改名实在是一项繁琐且易出错的工作。现在&#xff0c;我们为你带来一款强大的文件夹批量改名工具&#xff0c;让你能够轻松实现多个文件夹的批量翻译&#xff0c;让你的文件管理更智能高效 第一…

学会烟感监控有多重要?办公楼真的有必要吗?

随着城市化和建筑规模的不断扩大&#xff0c;火灾风险也日益凸显。为了保障员工和财产的安全&#xff0c;以及及时应对潜在的火灾威胁&#xff0c;办公楼需要采取积极的预防措施。 因此&#xff0c;在这一背景下&#xff0c;安装有效的烟感监控系统变得至关重要。 客户案例 ​…

AI抢饭碗!多部由Midjourney+Runway,制作的电影火了!丨IDCF

ChatGPT等生成式AI正在重塑各个行业的工作模式&#xff0c;尤其是影视领域。最近&#xff0c;多部由MidjourneyRunway生成式AI制作的电影预告片在社交平台上火了。 一部名叫的《芭本海默》的电影从对白、场景、人物、切镜完全由生成式AI制作完成并受到了用户的好评。该片结合了…

PHP 之房贷计算器、组合贷

一、等额本金 // &#xff08;等额本金&#xff09; //$loanAmount>贷款金额 //$loanPeriod>贷款年限 //$interestRate>贷款利息 function calculateEqualPrincipalPayment($loanAmount, $loanPeriod, $interestRate) {$monthlyPrincipal $loanAmount / ($loanPerio…