当前位置: 首页 > news >正文

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

自己封装了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><Viewstyle={{ position: 'absolute', left: 0, top: -999999, opacity: 0 }}className={className}id="rectAssist">{children}</View><ViewclassName={`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.lryc.cn/news/119066.html

相关文章:

  • Kendo UI for jQuery,一个现代的jQuery UI组件!
  • C++初阶语法——类和对象
  • linux学习(进程创建)[8]
  • Linux基础与应用开发系列九:各类系统函数
  • 国产数据库排行
  • 数学符号说明——三角等号(≜)
  • 健启星|医学营养的市场先行者
  • 从 GPT4All 体验 LLM
  • QGraphicsView实现简易地图4『局部加载-地图漫游』
  • ubuntu 安装 nvidia 驱动
  • 探索APP界面布局的艺术与技巧:从入门到精通
  • 回归预测 | MATLAB实现POA-CNN-GRU鹈鹕算法优化卷积门控循环单元多输入单输出回归预测
  • 15.3.2 【Linux】系统的配置文件:/etc/crontab,/etc/cron.d/*
  • 新版PMP考试中,敏捷是怎么考的?
  • uniapp-----封装接口
  • [oeasy]python0081_[趣味拓展]ESC键进化历史_键盘演化过程_ANSI_控制序列_转义序列_CSI
  • 第十六次CCF计算机软件能力认证
  • 关于Postman如何配置随请求携带token
  • 逆向破解学习-登山赛车
  • linux下实现生产者和消费者 pv操作
  • 十六、遥感影像识别
  • 源码角度分析@configuration和@component不同
  • 实现分布式事务:Java与MySQL的XA事务协调
  • 如何通过CRM系统进行成功的客户生命周期管理?
  • Leetcode 977. 有序数组的平方
  • vue3中使用toValue
  • 阿里云国际版CDN使用教程!
  • 【docker】Dockerfile构建镜像常用指令:
  • Java课题笔记~ 会话跟踪
  • HbuildX生成安卓签名证书