React+TS前台项目实战(二十三)-- 基于属性自定义数值显示组件Decimal封装

news2024/12/23 23:03:31

文章目录

  • 前言
  • Decimal组件
    • 1. 功能分析
    • 2. 代码+详细注释
    • 3. 使用方式
    • 4. 效果展示
  • 总结


前言

今天要封装的Decimal 组件,是通过传入的属性进行定制化显示数值,在渲染时,会根据不同的情况显示整数部分、小数部分和单位,支持自定义样式、布局和单位,同时根据数值正负情况显示不同样式,适用于准确展示各种类型的数值数据。

Decimal组件

1. 功能分析

(1)支持不同的样式(type显示类型,layout布局类型)
(2)支持是否显示小数点后全部小数部分或默认8位小数(display属性)
(3)支持显示不同的单位(unit属性)
(4)结合type属性,判断是否根据数值的正负情况显示不同的样式
(5)使用useMemo,避免重复计算,并且使用 BigNumber 来进行精确的数值计算操作
(6)支持传入 className 自定义类名来修改样式

2. 代码+详细注释

// @/components/Decimal/index.tsx
import { useMemo, FC } from "react";
import BigNumber from "bignumber.js";
import classNames from "classnames";
import { DecimalContainer } from "./styled";

// 组件的属性类型
type Props = {
  value: string; // 要显示的数值
  type?: "value" | "compare"; // 显示类型,默认为 "value",当需要显示正负值,并且有颜色区分时,使用compare
  layout?: "responsive" | "fixed"; // 布局类型,默认为 "fixed",响应式为responsive
  unit?: "CKB" | string | null; // 显示的单位,默认为 "CKB"
  display?: "full" | "short"; // 显示样式,默认为 "short",显示小数点后8位,为full时显示全部小数部分
  className?: string; // 自定义的类名
};

const Decimal: FC<Props> = (props) => {
  // 解构属性
  const { value, type = "value", layout = "fixed", unit = "CKB", display = "short", className } = props;
  // 使用 useMemo 缓存计算结果,避免重复计算
  const [int, dec, status] = useMemo(() => {
    const c = new BigNumber(value);
    // 将数值格式化为字符串,并分割成整数部分和小数部分
    const [int, dec] = c.toFormat(display === "short" ? 8 : undefined).split(".");
    // 如果是比较模式,并且数值不为零,则返回整数部分和小数部分以及数值的正负
    if (type !== "compare" || c.isZero()) return [int, dec];
    if (c.isPositive()) return [int, dec, "positive"];
    return [int, dec, "negative"];
  }, [value, display, type]);

  return (
    <DecimalContainer className={classNames(className)} data-type={type} data-value-status={status} data-layout={layout}>
      <span className={classNames("int")}>{int}</span>
      {dec && <span className={classNames("dec monospace")}>{`.${dec}`}</span>}
      {unit && <span className={`unit monospace`}>{unit}</span>}
    </DecimalContainer>
  );
};

export default Decimal;
------------------------------------------------------------------------------
// @/components/Decimal/styled.tsx
import styled from "styled-components";
import variables from "@/styles/variables.module.scss";
export const DecimalContainer = styled.div`
  display: inline-flex;
  align-items: flex-end;
  font-size: 16px;
  white-space: nowrap;
  span.dec {
    font-size: 12px;
  }
  .unit {
    margin-left: 5px;
  }
  &[data-type="value"] {
    span.dec {
      color: var(--cd-gray-light-3);
    }
  }
  &[data-type="compare"] {
    color: var(--cd-gray-light-3);
    &[data-value-status="positive"] {
      color: var(--cd-primary-color);
      &::before {
        content: "+";
      }
    }
    &[data-value-status="negative"] {
      color: var(--cd-danger-color);
    }
  }

  &[data-layout="responsive"] {
    @media (max-width: ${variables.mobileBreakPoint}) {
      font-size: 12px;
      span.dec {
        font-size: 10px;
      }
      .unit {
        font-size: 12px;
      }
    }
  }
`;

3. 使用方式

// 引入组件
import Decimal from '@/components/Decimal'
// 使用
{/* PC端、正数 */}
<Decimal value="888888.00000066666666666600" type="compare" />
{/* PC端、负数 */}
<Decimal value="-888888.00000066666666666600" type="compare" />
{/* PC端、显示所有小数点 */}
<Decimal value="888888.00000066666666666600" display="full" />
{/* 移动端尺寸 */}
<Decimal layout="responsive" value="888888.00000066666666666600" type="compare" />

4. 效果展示

在这里插入图片描述


总结

下一篇讲【全局常用组件Echarts封装】。关注本栏目,将实时更新。

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

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

相关文章

加速度数据 - 初始速度未知对速度积分的影响

这个问题不多说&#xff0c;只看一下速度积分的结果就可以知晓&#xff1a; 原本三角函数sin的积分是相移之后的自身&#xff0c;但是&#xff1a; 注意这一个概念&#xff1a; 原始信号如果引入一个未知的直流偏移。对该信号进行积分的结果&#xff0c;会将这个直流偏置转换…

Emacs之解决:java-mode占用C-c C-c问题(一百四十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

晨持绪科技:抖音网店现在能做起来吗

在这个信息爆炸的时代&#xff0c;抖音以其独特的魅力和庞大的用户基数&#xff0c;成为了众多创业者心中的黄金地带。然而&#xff0c;许多人在跃跃欲试的同时&#xff0c;也不禁会问&#xff1a;抖音网店现在还能做起来吗? 我们要认识到&#xff0c;抖音作为一个短视频平台&…

统计信号处理基础 习题解答11-1

题目 观测到的数据具有PDF 在μ给定的条件下&#xff0c;是相互独立的。均值具有先验PDF&#xff1a; 求μ的 MMSE 和 MAP 估计量。另外&#xff0c;当和时将发生什么情况? 解答 和两者都是独立高斯分布&#xff0c;与例题10.1一致&#xff0c;直接套用&#xff08;10.11&am…

单片机中有FLASH为啥还需要EEROM?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 一是EEPROM操作简单&…

第2章.现场设备的物联网模式--数字孪生

2.2 数字孪生 DT是部署在现场的物联网设备的虚拟复制品。这个概念与创建物理实体或过程的模型&#xff08;模拟&#xff09;以了解其表现行为的过程非常相似。本书中使用的DT符号如下图所示&#xff1a; 图2.3——DT模式的符号 DT是物联网背景下的一种重要模式&#xff0c;因为…

2024年Stable Diffusion下载+安装+使用教程(超详细版本)收藏这一篇就够了!

本篇咱们要聊的是如何用“整合包”来搞定StabIe Diffusion WebUI的本地安装和使用&#xff0c;别担心&#xff0c;你不需要成为计算机大神&#xff0c;新手也能轻松上手。不过得提醒一下&#xff0c;你的硬盘得留出100G~200G的空间来&#xff0c;才能玩得转。 整合包放这里&am…

无人机热成像分析图谱原理

一、热成像原理 热成像&#xff0c;也称为红外热成像或红外成像&#xff0c;是一种利用红外辐射&#xff08;通常指的是热辐射&#xff09;来获取物体表面温度分布信息的成像技术。在无人机上集成热成像传感器&#xff0c;可以远程捕获并分析目标物体的热特征&#xff0c;不受…

【OpenCV 图像处理 Python版】OpenCV 简介及安装

文章目录 1.OpenCV 介绍1.1 OpenCV 的特点1.2 OpenCV 的主要模块1.3 OpenCV 的应用场景 2.OpenCV-Python 库3.OpenCV 安装 1.OpenCV 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它由英特尔公司于1999年…

[工业网络][4] 网络防御

防御 防御方案 层层防御的原则是依赖于多层次的重叠防护措施&#xff0c;以防止最严重的情况发生。如果一层措施失效&#xff0c;下一层措施将接管&#xff0c;依此类推。为了理解这个概念如何应用于工业网络安全&#xff0c;我们首先看看如何应用于一个常见的化工处理应用&a…

SQL语句的案例分析

根据提供的图片内容&#xff0c;这段文字看起来像是一个SQL查询的一部分&#xff0c;特别是一个用于删除数据的语句。以下是对这段SQL的核心内容整理&#xff1a; ### 核心内容整理&#xff1a; 1. **删除操作**&#xff1a; - 使用DELETE语句来删除数据。 2. **子查询**…

红酒与高尔夫:球场上的优雅之选

在绿茵茵的高尔夫球场上&#xff0c;每一个挥杆的瞬间都充满了优雅与力量。而当这种运动与红酒相遇&#xff0c;便是一场关于品味与格调的很好邂逅。今天&#xff0c;就让我们一起探讨红酒与高尔夫这对球场上的优雅之选&#xff0c;感受它们交织出的不同魅力。 一、高尔夫&…

《信创数据库沙龙上海站:共话发展,智启未来》

2024 年 6 月 29 日周六 14:00&#xff0c;信创数据库沙龙在上海市徐汇区建国西路 285 号科投大厦 13 楼金星厅成功举办。本次活动吸引了众多学术界和产业界的专家、学者以及技术爱好者参与。 活动中&#xff0c;多位嘉宾带来了精彩分享。薛晓刚探讨了 Oracle 在国内的前景&a…

最新全国河流断面水质监测日数据,shp/excel格式

基本信息. 数据名称: 全国河流断面水质监测日数据 数据格式: Shp、Excel 数据时间: 2023年 数据几何类型: 点 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据字段&#xff1a; 序号字段名称字段说明1province省名称2city城市名称3county区县名称…

量取无忧 —— PP容量瓶,实验室的透明选择

PP容量瓶&#xff0c;即聚丙烯&#xff08;Polypropylene&#xff0c;简称PP&#xff09;材质的容量瓶&#xff0c;是一种实验室常用的量器&#xff0c;用于准确量取一定体积的液体。以下是PP容量瓶的一些主要特性和应用&#xff1a; 主要特性&#xff1a; 1. 耐化学性&#x…

亚马逊等跨境电商测评怎么做?

由于政府的扶持&#xff0c;跨境电商面向全球市场的大蛋糕让国内创业者找到了新的方向&#xff0c;现在很多国内卖家都转型做跨境了&#xff0c;但较多卖家现在都是两眼摸黑&#xff0c;不懂怎么做&#xff0c;南哥这边给大家分享一下现在的大部分卖家都在做的——测评 什么是…

【论文阅读】XuanYuan: An AI-Native Database

XuanYuan: An AI-Native Database 这篇文章主要是讨论了AI4DB 和 DB4AI 集成的数据库架构&#xff0c;以此提出了AI原生的数据库&#xff0c;架构如下&#xff1a; 而具体发展阶段来说&#xff0c;AI原生数据库主要由五个阶段组成 第一阶段&#xff0c;AI建议型数据库&#xf…

乐鑫Wi-Fi单火线开关方案,传统开关智能升级,启明云端乐鑫一级代理商

随着智能家居技术的飞速发展&#xff0c;我们的日常生活正在变得越来越便捷。今天&#xff0c;我们要探讨的是一种创新的智能家居方案——Wi-Fi单火线智能开关。 传统的机械单火线开关虽然简单可靠&#xff0c;但在现代智能家居系统中显得力不从心。它们无法远程控制&#xff…

leetcode每日一练:链表OJ题

链表经典算法OJ题 1.1 移除链表元素 题目要求&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&a…

绝区零 Mac 下载安装详细教程(MacOS IPA 砸壳包 playCover 完美运行)

绝区零 7.4 号开始公测&#xff0c;但刚刚就可以开始下载了&#xff0c;我也是第一时间就迫不及待的安装到了我的 Mac 电脑上&#xff0c;感兴趣的朋友可以跟我一起安装试试 我这里是通过 playCover 的形式在 Mac 上安装运行的&#xff0c;根据之前原神的经验所以这次还是同样…