挑战用React封装100个组件【003】

news/2024/12/3 0:49:43/

项目地址
https://github.com/hismeyy/react-component-100

组件描述
组件适用于展示个人信息

样式展示

在这里插入图片描述

前置依赖

今天我们的这个挑战需要用用到了 react-icons 依赖,因此,我们需要先安装它。

# 使用 npm
npm install react-icons# 或者使用 yarn
yarn add react-icons

使用的话,大家可以看这个网站。大家进去可以找需要的图标。具体使用里面有介绍,非常简单。
react-icons 图标
好了,下面我们展示代码。

代码展示

InfoCard.tsx
import './InfoCard.css'
import { BsFillCheckCircleFill } from "react-icons/bs";
import { BsPersonHearts } from "react-icons/bs";
import { BsTrophyFill } from "react-icons/bs";
import { FaStar } from 'react-icons/fa';interface InfoCardProps {title?: string;avatarUrl?: string;name?: string;job?: string;progress?: number;likes?: number;checks?: number;trophies?: number;
}const defaultProps: InfoCardProps = {title: "个人中心",avatarUrl: "https://images.unsplash.com/photo-1633332755192-727a05c4013d?w=500&h=500&q=80",name: "MaxCosmos",job: "React 开发工程师",progress: 85,likes: 128,checks: 46,trophies: 15
}const InfoCard = (props: InfoCardProps) => {const {title,avatarUrl,name,job,progress = defaultProps.progress,likes,checks,trophies} = { ...defaultProps, ...props };const circumference = 2 * Math.PI * 60;const strokeDashoffset = circumference - ((progress || 0) / 100) * circumference;return (<div className='info-card'><div className='info-title'><h6>{title}</h6></div><div className='info-avatar'><div className='tip-logo'><FaStar /></div><svg className='avatar-bg' width="130" height="130" viewBox="0 0 130 130" xmlns="http://www.w3.org/2000/svg"><circle cx="65" cy="65" r="60" stroke="#E0E1E6" stroke-width="5" fill="none" /><circle cx="65" cy="65" r="60" stroke="#FA7D73" stroke-width="5" fill="none"stroke-dasharray={circumference} stroke-dashoffset={strokeDashoffset} stroke-linecap="round" /></svg><div className='avatar'><img src={avatarUrl} alt={name} /></div></div><div className="info"><p className='info-name'>{name}</p><p className='info-job'>{job}</p></div><div className='info-other'><div><BsPersonHearts style={{ color: '#FF451C' }} />&nbsp;&nbsp;{likes}</div><div><BsFillCheckCircleFill style={{ color: '#FF451C' }} />&nbsp;&nbsp;{checks}</div><div><BsTrophyFill style={{ color: '#FF451C' }} />&nbsp;&nbsp;{trophies}</div></div></div>)
}export default InfoCard
css_104">InfoCard.css
.info-card {box-sizing: border-box;width: 320px;height: 400px;border-radius: 25px;background-color: #FFFFFF;box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.0.1);display: flex;flex-direction: column;align-items: center;padding: 30px;overflow: hidden;font-family: "Microsoft YaHei", SimSun, "PingFang SC", "Helvetica Neue", Arial, sans-serif;
}.info-card .info-title {width: 100%;display: flex;justify-content: left;
}.info-card .info-title h6{all: unset;font-weight: bold;letter-spacing: 2px;
}.info-card .info-avatar{margin-top: 20px;background-color: #FFFFFF;width: 130px;height: 130px;overflow: hidden;display: flex;justify-content: center;align-items: center;position:relative;}.info-card .info-avatar .tip-logo{position: absolute;width: 25px;height: 25px;bottom: 10px;right: 10px;border-radius: 50%;background-color: black;z-index: 5;display: flex;justify-content: center;align-items: center;color: #FFFFFF;font-size: 14px;
}.info-card .info-avatar .avatar-bg{position: absolute;top: 0;left: 0;transform: rotate(-90deg);
}.info-card .info-avatar .avatar{width: 90px;height: 90px;border-radius: 100%;
}.info-card .info-avatar .avatar img{all: unset;width: 100%;height: 100%;background-color: #FA7D73;border-radius: 100%;overflow: hidden;
}.info-card .info {margin-top: 20px;display: flex;flex-direction: column;align-items: center;text-align: center
}.info-card .info .info-name{all: unset;font-weight: bold;font-size: 20px;
}.info-card .info .info-job{all: unset;font-size: 14px;color: #B3B3B3;margin-top: 10px;font-weight: bold;
}.info-card .info-other{display: flex;justify-content: space-around;width: 100%;margin-top: 40px;
}.info-card .info-other div{width: 70px;height: 35px;display: flex;justify-content: center;align-items: center;border-radius: 17.5px;box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.1);font-size: 13px;font-weight: bold;
}

使用

App.tsx
import './App.css'
import InfoCard from './components/card/infoCard03/InfoCard'function App() {return (<><InfoCard /></>)
}export default App

http://www.ppmy.cn/news/1551888.html

相关文章

组播基础实验

当需要同时发给多个接受者或者接收者ip未知时使用组播 一、组播IP地址 1、组播IP地址范围 组播地址属于D类地址&#xff1a;224.0.0.0/4&#xff08;224.0.0.0-239.255.255.255&#xff09; 2、分类 &#xff08;1&#xff09;链路本地地址&#xff08;link-local&#xf…

使用 Docker 容器创建一个 Web 服务器:从入门到实践

目录 Docker 与容器技术简介准备工作通过 Docker 创建一个简单的 Web 服务器 基于官方 Nginx 镜像搭建 Web 服务器基于自定义 Python 脚本的 Web 服务器 优化 Docker Web 服务器 绑定数据卷实现动态更新配置环境变量增强灵活性实现负载均衡与扩展性 部署 Docker Web 服务器的实…

Shell脚本小练习

学习了这么长时间Shell脚本&#xff0c;总得来一次小小的练习吧&#xff0c;那么请看下文&#xff01; 1.用Shell写一个小计算器。 通过read命令获取用户输入的表达式&#xff0c;表达式的格式设定为操作数1 运算符 操作数2&#xff0c;例如53&#xff0c;然后利用设计的脚本…

题目 3209: 蓝桥杯2024年第十五届省赛真题-好数

一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &#xff09;上的数字是偶数&#xff0c;我们就称之为“好数”。给定一个正整数 N&#xff0c;请计算从…

从数据孤岛到数据协同:企业如何构建安全的数据共享生态?

聚焦数据协作与隐私保护技术&#xff0c;探索企业如何在共享中保持安全性。 导读 在数字经济时代&#xff0c;数据已成为企业最宝贵的战略资源。然而&#xff0c;传统的"数据孤岛"模式正阻碍企业价值创新。本文将深度解析如何突破数据壁垒&#xff0c;构建安全高效的…

如何在 Debian 7 上设置 Apache 虚拟主机

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 虚拟主机 虚拟主机用于在单个 IP 地址上运行多个域。这对需要在一个虚拟专用服务器上运行多个站点的人特别有用——每个站点将根据用户…

C++小玩具1

好耶是新系列 #include<windows.h> #include<bits/stdc.h> using namespace std; POINT p; HANDLE hOutput GetStdHandle(STD_OUTPUT_HANDLE); HWND hGetForegroundWindow(); CONSOLE_FONT_INFO consoleCurrentFont; int X,Y,jg; bool f; void G(int x,int y){CO…

条件数:概念、矩阵中的应用及实际工业场景应用

一、引言 条件数是数值分析领域中的一个重要概念&#xff0c;它在理解线性方程组的敏感性、矩阵运算的稳定性等方面发挥着关键作用。无论是在纯数学理论研究&#xff0c;还是在解决实际工业问题的工程应用中&#xff0c;条件数都有着广泛的意义。 二、条件数的概念 &#xff…