Skip to content

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

邮箱: open_teams@163.com