react笔记(三):badge徽章组件
Badge 徽章 消息提示一般会用到这个功能,大多位于子元素右上角
图片
废话不多说了:开始,
js
badge.tsx
import React from 'react'
import './badge.css'
interface BadgeProps {
num?: number,// 数字显示的值
dot?: boolean,// true显示小红点,默认false,显示数字类型
children?: React.ReactNode,//子组件
width: number,//当显示数字时,计算badge元素的宽除以2,用来设置绝对定位right的值
}
class Badge extends React.Component <any,BadgeProps>{
constructor(props:BadgeProps){
super(props);
this.state = {
num: this.props.num || 1,//默认显示0
dot: this.props.dot || false,//dot默认false,显示数字,不显示小红点
children: this.props.children, //包裹的子组件
width: 0,//宽度默认为0
}
}
componentDidMount() {
/**
* 计算badge元素宽度
* 当dot为false和num不为0时
*/
if(!this.state.dot && this.state.num){
let el = this.refs.badgemark as HTMLElement;
this.setState({
width: el.offsetWidth / 2
})
}
}
render () {
// 获取dot的值
let dot = this.state.dot;
let badge;
//如果dot为true,num值为大于0的值时显示红点
if(dot && this.state.num){
badge = <span className="badge-dot"></span>
}else{
// 如果dot值为false,且num的值大于0显示数字
if(this.state.num){
badge = <span className="badge-num" style={{right: `-${this.state.width}px`}} ref="badgemark">{this.state.num}</span>;
}
}
return <div className="badge">
{badge}
{this.props.children}
</div>
}
}
export default Badge;
badge.tsx
import React from 'react'
import './badge.css'
interface BadgeProps {
num?: number,// 数字显示的值
dot?: boolean,// true显示小红点,默认false,显示数字类型
children?: React.ReactNode,//子组件
width: number,//当显示数字时,计算badge元素的宽除以2,用来设置绝对定位right的值
}
class Badge extends React.Component <any,BadgeProps>{
constructor(props:BadgeProps){
super(props);
this.state = {
num: this.props.num || 1,//默认显示0
dot: this.props.dot || false,//dot默认false,显示数字,不显示小红点
children: this.props.children, //包裹的子组件
width: 0,//宽度默认为0
}
}
componentDidMount() {
/**
* 计算badge元素宽度
* 当dot为false和num不为0时
*/
if(!this.state.dot && this.state.num){
let el = this.refs.badgemark as HTMLElement;
this.setState({
width: el.offsetWidth / 2
})
}
}
render () {
// 获取dot的值
let dot = this.state.dot;
let badge;
//如果dot为true,num值为大于0的值时显示红点
if(dot && this.state.num){
badge = <span className="badge-dot"></span>
}else{
// 如果dot值为false,且num的值大于0显示数字
if(this.state.num){
badge = <span className="badge-num" style={{right: `-${this.state.width}px`}} ref="badgemark">{this.state.num}</span>;
}
}
return <div className="badge">
{badge}
{this.props.children}
</div>
}
}
export default Badge;
badeg.css
css
.badge{
position: relative;
display: inline-block;
}
.badge-dot{
position: absolute;
right: -5px;
top: -5px;
z-index: 99;
width: 10px;
height: 10px;
border-radius: 50%;
background: #f56c6c;
}
.badge-num{
position: absolute;
top: -5px;
z-index: 99;
padding: 0 5px;
text-align: center;
line-height: 14px;
font-size: var(--font-size-sm);
color: #fff;
border-radius: 7px;
background: #f56c6c;
}
.badge{
position: relative;
display: inline-block;
}
.badge-dot{
position: absolute;
right: -5px;
top: -5px;
z-index: 99;
width: 10px;
height: 10px;
border-radius: 50%;
background: #f56c6c;
}
.badge-num{
position: absolute;
top: -5px;
z-index: 99;
padding: 0 5px;
text-align: center;
line-height: 14px;
font-size: var(--font-size-sm);
color: #fff;
border-radius: 7px;
background: #f56c6c;
}
调用
html
import Badge from '../components/widget/badge'
<Badge num={100}>
<Button type={'primary'}>primary</Button>
</Badge>
<Badge dot={true} num={1} >
<Button type={'primary'}>primary</Button>
</Badge>
import Badge from '../components/widget/badge'
<Badge num={100}>
<Button type={'primary'}>primary</Button>
</Badge>
<Badge dot={true} num={1} >
<Button type={'primary'}>primary</Button>
</Badge>
因为也是刚开始正式接触react,写的不对或者可以改进的地方,麻烦公众号直接发消息留言给我,谢谢。
本文到此结束。
反馈信息
INFO