iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0

參考了 MUI Badge 的一些設計,最後決定實作成「當 props.badgeContent 的值為 falsity 時,不顯示 badge 點;並且使用者可以透過設定 props.variant = 'dot' 來渲染無內容的小型 bodge 點」。

成品

https://ithelp.ithome.com.tw/upload/images/20221008/20142759zMjQRSO9ob.png

原始碼
成品

開發思路

樣式與位置

套了一層 span 來處理定位問題就讓一切變得非常簡單了。首先透過 badgeWrapperStyle 來製造定位錨點,再來是 baseStyle 來讓 props.badgeContent 的內容可以水平垂直置中。而 standardStyledotStyle 分別對應 props.variant = 'standard'props.variant = 'dot' 的樣式需求(大小點)。

再來與 Tooltip 的方向類似,根據 props.verticalprops.horizontal 來調整 badge 點位置。這部分可以參考 positionStyle 的邏輯。

最後為了讓使用者可以透過 props.badgeColorprops.badgeBgColor 快速定義 Badge 外觀,故將 colorStyle 也獨立出來,根據以上兩個 props 來調整回傳的樣式內容。

顯示內容

判斷邏輯如下。在使用者設定 props.variant === 'dot' 時必定顯示小型 badge 點,或當使用者有傳入非 falsityprops.badgeContent 時也會顯示「帶有 props.badgeContent 的 badge 點。而如果滿足條件 props.variant === 'standard'props.badgeContentfalsity 時,隱藏整個 badge 點。

const renderBadge = useMemo(() => {
  if (variant === 'dot') {
    return (
      <span className={cn(baseStyle, dotStyle, colorStyle, positionStyle)} />
    );
  }
  if (badgeContent) {
    return (
      <span className={cn(baseStyle, standardStyle, colorStyle, positionStyle)}>
        {badgeContent}
      </span>
    );
  }
  return <React.Fragment />;
}, [variant, badgeContent, colorStyle, positionStyle]);

修改指南

需注意如果調整了 standardStyledotStylewidth/height 尺寸,記得確認 baseStyle 中的 border-radius 數值是否需一併更新,避免 badge 點形狀無法呈現(接近)圓形的外觀。

自評

本次鐵人賽相對單純的定位系元件,雖然在最後段才登場,但如果想開始嘗試自行製作元件的話,算是一個相對簡單的起點。


上一篇
day26: Avatar
下一篇
day28: StyleProvider
系列文
我們可以不要 component library 了嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言