精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

《精通react/vue組件設(shè)計》之實現(xiàn)一個健壯的警告提示(Alert)組件

開發(fā) 前端
對于react選手來說,如果沒用typescript,建議大家都用PropTypes, 它是react內(nèi)置的類型檢測工具,我們可以直接在項目中導(dǎo)入. vue有自帶的屬性檢測方式,這里就不一一介紹了。

前言

本文是筆者寫組件設(shè)計的第七篇文章, 今天帶大家實現(xiàn)一個自帶主題且可關(guān)閉的Alert組件, 該組件在諸如Antd或者elementUI等第三方組件庫中都會出現(xiàn),主要用來提供系統(tǒng)的用戶反饋.

之所以會寫組件設(shè)計相關(guān)的文章,是因為作為一名前端優(yōu)秀的前端工程師,面對各種繁瑣而重復(fù)的工作,我們不應(yīng)該按部就班的去"辛勤勞動",而是要根據(jù)已有前端的開發(fā)經(jīng)驗,總結(jié)出一套自己的高效開發(fā)的方法.

前端組件一般會劃分為如下幾種類型:

  • 通用型組件: 比如Button, Icon等.
  • 布局型組件: 比如Grid, Layout布局等.
  • 導(dǎo)航型組件: 比如面包屑Breadcrumb, 下拉菜單Dropdown, 菜單Menu等.
  • 數(shù)據(jù)錄入型組件: 比如form表單, Switch開關(guān), Upload文件上傳等.
  • 數(shù)據(jù)展示型組件: 比如Avator頭像, Table表格, List列表等.
  • 反饋型組件: 比如Progress進度條, Drawer抽屜, Modal對話框等.
  • 其他業(yè)務(wù)類型

所以我們在設(shè)計組件系統(tǒng)的時候可以參考如上分類去設(shè)計,該分類也是antd, element, zend等主流UI庫的分類方式.

正文

在開始組件設(shè)計之前希望大家對css3和js有一定的基礎(chǔ),并了解基本的react/vue語法.我們先看看實現(xiàn)后的組件效果:

圖片圖片

1. 組件設(shè)計思路

按照之前筆者總結(jié)的組件設(shè)計原則,我們第一步是要確認(rèn)需求. 一個警告提示(Alert)組件會有如下需求點:

  • 能控制Alert組件的樣式
  • 能控制Alert組件的關(guān)閉按鈕是否顯示
  • 用戶可以自己輸入提示內(nèi)容
  • 能控制關(guān)閉按鈕的文本,或者自定義關(guān)閉按鈕
  • 支持顯示提示內(nèi)容的輔助文本
  • 內(nèi)置提供不同類型的警告提示樣式,比如成功, 錯誤, 警告等
  • 關(guān)閉提示時能提供自定義事件

需求收集好之后,作為一個有追求的程序員, 會得出如下線框圖:

圖片圖片

對于react選手來說,如果沒用typescript,建議大家都用PropTypes, 它是react內(nèi)置的類型檢測工具,我們可以直接在項目中導(dǎo)入. vue有自帶的屬性檢測方式,這里就不一一介紹了.

通過以上需求分析, 我們發(fā)現(xiàn)實現(xiàn)一個Alert非常簡單, 它屬于反饋型組件,所以不會涉及到太多功能.接下來我們就來看看具體實現(xiàn).

2. 基于react實現(xiàn)一個Alert組件

2.1. Alert組件框架設(shè)計

首先我們先根據(jù)需求將組件框架寫好,這樣后面寫業(yè)務(wù)邏輯會更清晰:

import classnames from 'classnames'
import styles from './index.less'


/**
 * 警告提示組件
 * @param {style} object 更改Alert樣式
 * @param {closable} bool 是否顯示關(guān)閉按鈕, 默認(rèn)不顯示
 * @param {closeText} string|reactNode 自定義關(guān)閉按鈕
 * @param {message} string 警告提示內(nèi)容
 * @param {description} string 警告提示的輔助性文字
 * @param {type} string 警告的類型
 * @param {onClose} func 關(guān)閉時觸發(fā)的事件
 */
function Alert(props) {
  const {
    style,
    closable,
    closeText,
    message,
    description,
    type,
    onClose
  } = props


  return <div className={styles.xAlertWrap}>
          <div className={styles.alertMes}>{ message }</div>
          <div className={styles.alertDesc}>{ description }</div>
          <span className={styles.closeBtn}>{ closeText ? closeText : 'x' }</span>
         </div>
}


export default Alert

有了這個框架,我們就來往里面實現(xiàn)內(nèi)容吧.

2.2 實現(xiàn)style,closeText,message, description,type

這幾個功能在框架搭建好之后已經(jīng)部分實現(xiàn)了,是因為他們都比較簡單,不會牽扯到其他復(fù)雜邏輯.只需要對外暴露屬性并使用屬性即可. 具體實現(xiàn)如下:

function Alert(props) {
  const {
    style,
    closable,
    closeText,
    message,
    description,
    type,
    onClose
  } = props


  return <div 
      className={classnames(styles.xAlertWrap, styles[type] || styles.warning)}
      style={{
        ...style
      }}
    >
      <div className={styles.alertMes}>{ message }</div>
      <div className={styles.alertDesc}>{ description }</div>
      <span className={styles.closeBtn}>{ closeText ? closeText : 'x' }</span>
    </div>
}

以上代碼可以發(fā)現(xiàn)筆者采用了classnames這個第三方工具, 他可以組合我們的class以實現(xiàn)更靈活的配置. 對于type的實現(xiàn),我的思路是提前預(yù)制好幾種類型樣式, 通過用戶手動配置來匹配到對應(yīng)的樣式:

.xAlertWrap {
  box-sizing: border-box;
  position: relative;
  padding: 5px 12px;
  margin-bottom: 16px;
  border-radius: 3px;
  &.success {
    background-color: #f6ffed;
    border: 1px solid #b7eb8f;
  }
  &.info {
    background-color: #e6f7ff;
    border: 1px solid #91d5ff;
  }
  &.error {
    background-color: #fffbe6;
    border: 1px solid #ffe58f;
  }
  &.warning {
    background-color: #fff1f0;
    border: 1px solid #ffa39e;
  }
}

2.3 實現(xiàn)closable和onClose

closable主要是用來讓用戶能手動關(guān)閉Alert,onClose是對外暴露的關(guān)閉時的方法, 因為沒必要也不需要向外暴露屬性來讓Alert關(guān)閉, 所以最好的方式是在組件內(nèi)部實現(xiàn), 我們會通過useState這個鉤子來處理,代碼如下:

function Alert(props) {
  const {
    style,
    closable,
    closeText,
    message,
    description,
    type,
    onClose
  } = props
  let [visible, setVisible] = useState(true)


  const handleColse = () => {
    setVisible(false)
    onClose && onClose()
  }
  return visible ? 
    <div 
      className={classnames(styles.xAlertWrap, styles[type] || styles.warning)}
      style={{
        opacity: visible ? '1' : '0',
        ...style
      }}
    >
      <div className={styles.alertMes}>{ message }</div>
      <div className={styles.alertDesc}>{ description }</div>
      {
        !!closable && <span className={styles.closeBtn} notallow={handleColse}>{ closeText ? closeText : 'x' }</span>
      }
    </div> : null
}

通過控制visible來控制Alert的出現(xiàn)和消失, 并且當(dāng)點擊關(guān)閉按鈕時能調(diào)用外部暴露的onClose方法.

2.4 健壯性支持, 我們采用react提供的propTypes工具:

import PropTypes from 'prop-types'
// ...
Alert.propTypes = {
  style: PropTypes.object,
  closable: PropTypes.bool,
  closeText: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.element
  ]),
  message: PropTypes.string,
  description: PropTypes.string,
  type: PropTypes.string,
  onClose: PropTypes.func
}

關(guān)于prop-types的使用官網(wǎng)上有很詳細(xì)的案例,這里說一點就是oneOfType的用法, 它用來支持一個組件可能是多種類型中的一個.  組件完整css代碼如下:

.xAlertWrap {
  box-sizing: border-box;
  position: relative;
  padding: 5px 12px;
  margin-bottom: 16px;
  border-radius: 3px;
  &.success {
    background-color: #f6ffed;
    border: 1px solid #b7eb8f;
  }
  &.info {
    background-color: #e6f7ff;
    border: 1px solid #91d5ff;
  }
  &.error {
    background-color: #fffbe6;
    border: 1px solid #ffe58f;
  }
  &.warning {
    background-color: #fff1f0;
    border: 1px solid #ffa39e;
  }


  .alertMes {
    margin-bottom:5px;
    color: rgba(0, 0, 0, 0.85);
    font-size: 14px;
    line-height: 1.5em;
  }
  .alertDesc {
    color: rgba(0, 0, 0, 0.65);
    font-size: 14px;
    line-height: 1.5em;
    word-break: break-all;
  }
  .closeBtn {
    position: absolute;
    right: 8px;
    top: 5px;
    color: rgba(0, 0, 0, 0.4);
    cursor: pointer;
  }
}

通過以上步驟, 一個健壯的的Alert組件就完成了,關(guān)于代碼中的css module和classnames的使用大家可以自己去官網(wǎng)學(xué)習(xí),非常簡單.如果不懂的可以在趣談前端技術(shù)群里提問,筆者看到后會第一時間解答.

2.5 使用Alert組件

我們可以通過如下方式使用它:

<Alert message="溫馨提示,你忘帶口罩了" />
<Alert message="溫馨提示,你注冊成功" type="success" />
<Alert message="錯誤提示,你沒洗手了" type="error" />
<Alert message="提示: 我們開始吧" type="info" />
<Alert message="提示: 我可以關(guān)閉了" type="info" closable notallow={() => { alert(111) }} /><Alert message="注冊成功" descriptinotallow="你在本網(wǎng)站已經(jīng)注冊成功,謝謝您的支持和反饋,多交流真正的技術(shù)吧" closable type="success" />

筆者已經(jīng)將實現(xiàn)過的組件發(fā)布到npm上了,大家如果感興趣可以直接用npm安裝后使用,方式如下:

npm i @alex_xu/xui
// 導(dǎo)入xui
import {
  Button,
  Skeleton,
  Empty,
  Progress,
  Tag,
  Switch,
  Drawer,
  Badge,
  Alert
} from '@alex_xu/xui'

該組件庫支持按需導(dǎo)入,我們只需要在項目里配置babel-plugin-import即可,具體配置如下:

// .babelrc
"plugins": [
  ["import", { "libraryName": "@alex_xu/xui", "style": true }]
]

npm庫截圖如下:

圖片圖片

最后

之前筆者已經(jīng)實現(xiàn)了:

  • modal(模態(tài)窗),
  • badge(徽標(biāo)),
  • table(表格),
  • tooltip(工具提示條),
  • Skeleton(骨架屏),
  • Message(全局提示),
  • form(form表單),
  • switch(開關(guān)),
  • 日期/日歷,
  • 二維碼識別器組件

等組件, 來復(fù)盤筆者多年的組件化之旅.


責(zé)任編輯:武曉燕 來源: 趣談前端
相關(guān)推薦

2023-04-28 09:30:40

vuereact

2021-03-31 08:01:24

React Portareactcss3

2023-05-17 10:05:35

組件設(shè)計(Modal)組件

2018-09-18 10:11:21

前端vue.jsjavascript

2021-06-21 15:49:39

React動效組件

2021-10-17 20:37:44

組件DrawerReact

2009-08-20 10:12:59

Flex Alert組

2022-09-20 11:00:14

Vue3滾動組件

2022-05-13 08:48:50

React組件TypeScrip

2023-12-21 10:26:30

??Prettier

2021-01-28 06:11:40

導(dǎo)航組件Sidenav Javascript

2022-04-26 05:55:06

Vue.js異步組件

2024-04-01 11:52:46

2024-03-20 09:31:00

圖片懶加載性能優(yōu)化React

2022-04-25 07:36:21

組件數(shù)據(jù)函數(shù)

2020-12-15 08:58:07

Vue編輯器vue-cli

2022-09-07 16:07:17

前端React

2018-01-31 15:45:07

前端Vue.js組件

2024-07-29 00:02:00

DemoVue開發(fā)

2024-01-09 09:06:13

點贊
收藏

51CTO技術(shù)棧公眾號

中国xxxx性xxxx产国| 少妇精品久久久久久久久久| 日韩女优一区二区| 在线日韩成人| 欧美午夜视频在线观看| 天堂一区二区三区| 精品国产伦一区二区三区| 亚洲人成人一区二区三区| 精品亚洲一区二区三区| 一本岛在线视频| 在线观看中文| www.豆豆成人网.com| 国产亚洲综合色| 国产区精品视频| 国产亚洲成人av| 精品日韩一区| 精品电影一区二区三区| 欧美极品少妇xxxxⅹ裸体艺术| 18黄暴禁片在线观看| 国产视频福利在线| 高清av一区二区| 国产精品专区一| 婷婷激情五月网| 一区二区三区四区在线观看国产日韩 | 精品视频一区二区| 国产又大又黄又爽| 日韩精品欧美精品| 18一19gay欧美视频网站| 国产男女猛烈无遮挡在线喷水| 91九色在线播放| 国产精品美女久久久久av爽李琼| 国产日韩欧美二区| 国产日韩欧美视频在线观看| 久久综合影音| 2023亚洲男人天堂| 免费一级片在线观看| 高清在线一区二区| 在线观看一区不卡| 无码播放一区二区三区| 亚洲色图美国十次| 日韩美女久久久| 视频一区视频二区视频三区高| 天堂国产一区二区三区| 国产91色综合久久免费分享| 91久久国产综合久久91精品网站 | 精品在线视频一区二区| 亚洲精品国产精品国| 精品亚洲porn| 国产噜噜噜噜噜久久久久久久久| 懂色av蜜臀av粉嫩av喷吹| 国产精品普通话对白| 韩国日本不卡在线| 国产精品成人av久久| 77成人影视| 7777精品伊人久久久大香线蕉经典版下载| 日本成人中文字幕在线| 国产精品久久久精品四季影院| 午夜视频福利在线观看| 国产成人a级片| 99在线免费观看视频| 国产精品一品二区三区的使用体验| 全部av―极品视觉盛宴亚洲| 国产精品99久久久久久www| 国产毛片久久久久久久| 日韩成人一级| 日韩精品亚洲精品| 免费在线观看你懂的| 香蕉人人精品| 亚洲天堂影视av| 奇米网一区二区| 国产精品久久占久久| www欧美日韩| 欧美精品入口蜜桃| 在线播放精品| 色爱精品视频一区| 西西444www无码大胆| 欧美综合久久| 久久天天躁狠狠躁老女人| 久久黄色小视频| 国产精品三上| 国产精品欧美激情在线播放| 国产又粗又黄视频| 丰满肉肉bbwwbbww| 日韩精品视频网站| 成人黄色av网站| 六月婷婷中文字幕| 久久久精品免费网站| 亚洲高清123| 色网在线观看| 欧美性少妇18aaaa视频| 污污的视频免费| 粉嫩久久久久久久极品| 亚洲欧美国产制服动漫| 日本不卡一二区| 亚洲精品孕妇| 国产精品色午夜在线观看| www.com欧美| 久久久精品免费观看| 成年人黄色在线观看| 午夜成人免费影院| 国产欧美日韩中文久久| 免费的av在线| 欧洲av不卡| 日韩一区二区麻豆国产| 91精品国产综合久久香蕉麻豆| 国产极品尤物在线| 美女av在线播放| 亚洲成人久久影院| 在线观看av网页| 久久精品亚洲成在人线av网址| 尤物精品国产第一福利三区| 久久久香蕉视频| 免费观看成人av| 国产一区在线免费观看| 永久av在线| 欧美日韩国产色视频| 在线一区二区不卡| 国产免费av一区二区三区| 九九热最新视频//这里只有精品 | 里番在线观看网站| 黄色一区二区三区| 国产高清999| jlzzjlzz亚洲女人| 97色伦亚洲国产| 国产农村妇女毛片精品| 国产欧美日韩视频在线观看| 精品无码国产一区二区三区av| 四虎在线精品| 国产亚洲欧洲高清| 91porny在线| 日韩午夜激情| 97激碰免费视频| 92久久精品一区二区| 久久嫩草精品久久久精品| 超碰10000| 国产精品欧美一区二区三区不卡 | 99精品国产在热久久下载| 91精品久久久久久久久| 福利成人在线观看| 色久优优欧美色久优优| 99久久人妻无码中文字幕系列| 91精品国产福利在线观看麻豆| 国产亚洲精品美女久久久久| 国产在线拍揄自揄拍无码视频| 理论片日本一区| 四虎一区二区| 日韩精品免费观看视频| 亚洲天堂av在线免费| 日韩一区二区视频在线| av高清不卡在线| 精品视频在线观看一区| 久久免费看视频| 亚洲五月综合| 欧洲一区二区视频| 久久久午夜影院| 久久久久久网| 久久亚洲高清| 亚洲欧美电影| 亚洲欧洲黄色网| 中文字幕手机在线视频| 国产偷国产偷精品高清尤物 | 日本成人在线视频网站| 视频一区二区在线观看| 欧美成人毛片| 欧美成人精品三级在线观看| 亚洲av综合色区无码一区爱av | 99精品黄色片免费大全| 国产精品国产亚洲精品看不卡| 好吊妞视频这里有精品| 91高清在线免费观看| 丰满少妇一级片| 偷拍日韩校园综合在线| 日本少妇高潮喷水xxxxxxx| 乱人伦精品视频在线观看| 欧美一区二区高清在线观看| 日本成人福利| 操91在线视频| 天天躁日日躁狠狠躁喷水| 色婷婷久久99综合精品jk白丝| 国产中年熟女高潮大集合| 男男视频亚洲欧美| 国产日产欧美一区二区| a欧美人片人妖| 欧美丝袜第三区| 国产精品九九视频| 日韩1区2区| 97国产suv精品一区二区62| 午夜在线视频观看| 欧美视频精品在线| 免费无遮挡无码永久在线观看视频| 91在线你懂得| 毛片毛片毛片毛| 精品美女久久久| 69堂成人精品视频免费| 成人三级黄色免费网站| 欧美一级日韩免费不卡| 免费观看一区二区三区毛片| 国产精品麻豆视频| 97精品人人妻人人| 欧美 日韩 国产精品免费观看| 国产区一区二区三区| 91另类视频| 免费在线成人网| 久久精品成人一区二区三区蜜臀| 日本在线中文字幕一区二区三区| 色综合91久久精品中文字幕 | 成人精品高清在线| 日韩视频免费在线播放| 欧美搞黄网站| 亚洲国产欧美一区二区三区不卡| 成午夜精品一区二区三区软件| 国产精品国模在线| 2021中文字幕在线| 精品国产一区二区三区久久久狼| 色视频在线观看免费| 一区二区三区四区五区视频在线观看| 精品夜夜澡人妻无码av| 国产麻豆精品在线观看| 男女爽爽爽视频| 91久久视频| 国产美女视频免费| 精品国产一区二区三区久久久蜜臀| 国产精品theporn88| **国产精品| 国产精品十八以下禁看| 在线成人av观看| 国语对白做受69| 色老头在线观看| 日韩一区二区av| 成人动漫在线免费观看| 亚洲女人天堂网| 天天射,天天干| 精品精品国产高清a毛片牛牛 | 午夜电影一区二区| 午夜激情福利网| 中文字幕一区二区5566日韩| 永久免费成人代码| 久久理论电影网| 中文字幕一区二区久久人妻网站| 成人精品一区二区三区中文字幕| www.久久com| 国产福利精品一区| 永久免费看片在线观看| 国产在线精品视频| 日韩av片免费观看| 久国产精品韩国三级视频| 蜜臀在线免费观看| 日韩在线视屏| 亚洲精品在线观看免费| 日韩精品欧美| 中文字幕一区二区三区有限公司 | 日本伦理一区二区三区| 国产日韩精品视频一区| 久久久久无码精品国产sm果冻| 久久久亚洲精品一区二区三区 | 999精品色在线播放| 成人免费网站在线观看| 成人在线视频观看| 国产日韩欧美在线播放| 伊人久久大香伊蕉在人线观看热v| 国产专区欧美专区| 国产一区二区三区免费观看在线| 亚洲影视九九影院在线观看| 日韩精品三级| 国产精品久久久一区二区三区| 卡通动漫精品一区二区三区| 久久久久无码国产精品一区| 精品一区欧美| 亚洲精品成人久久久998| 久久资源中文字幕| 妞干网这里只有精品| 欧美精品1区| 日日碰狠狠添天天爽超碰97| 视频一区中文字幕| 8x8x成人免费视频| 国产98色在线|日韩| www.日本高清| 国产精品美女久久久久久久| 午夜精品一区二区三区视频| 亚洲一区成人在线| 天码人妻一区二区三区在线看| 欧美吻胸吃奶大尺度电影| 国产裸体永久免费无遮挡| 日韩欧美精品在线视频| 欧美日韩国产中文字幕在线| 久久精品国产视频| 国产亚洲成av人片在线观看| 国产成人综合久久| 精品国产一区二区三区性色av| 国产欧美精品一区二区三区| 精品日韩毛片| 欧美久久在线观看| 日韩高清不卡一区二区| 国产老头和老头xxxx×| 26uuu欧美| 极品久久久久久| 欧美视频裸体精品| 99国产精品99| 亚洲色无码播放| 麻豆蜜桃在线| 国产精品视频久久久久| 成人直播在线观看| 一区二区精品免费视频| 亚洲日韩视频| 少妇性l交大片7724com| 久久麻豆一区二区| 国产一级中文字幕| 717成人午夜免费福利电影| 丝袜视频国产在线播放| 久久国产加勒比精品无码| 在线免费日韩片| 高清国产在线一区| 日韩精品水蜜桃| 日本成人在线免费视频| 亚洲综合二区| 国产一级二级av| 国产精品毛片大码女人| 久久久久久少妇| 午夜精品久久99蜜桃的功能介绍| 国产又黄又爽免费视频| 久久久久国产精品一区三寸| 怡红院一区二区| 尤物在线观看一区| 亚洲视频在线免费播放| 亚洲欧美第一页| 美女在线视频免费| 99热在线播放| 欧美成人嫩草网站| 999这里有精品| 国产精品素人一区二区| 色老头在线视频| 日韩美女av在线| 国产精品偷拍| av成人观看| 欧美a级一区| 岛国大片在线免费观看| 亚洲视频香蕉人妖| 一二区在线观看| 色偷偷888欧美精品久久久| 日韩精品免费观看视频| 欧美下载看逼逼| 久久国产日本精品| 欧美老熟妇乱大交xxxxx| 欧美日韩国产色视频| 日本私人网站在线观看| 51视频国产精品一区二区| 男人的天堂久久| 亚洲精品在线电影| 日韩在线第三页| 久久er99精品| 久久国产高清视频| 51精品秘密在线观看| 伦xxxx在线| 91久久偷偷做嫩草影院| 欧美粗暴jizz性欧美20| 亚洲妇女无套内射精| av一区二区不卡| 日本三级免费看| 亚洲激情小视频| 永久免费av在线| 国产日韩欧美另类| 91精品国产调教在线观看| 一二三级黄色片| 亚洲黄网站在线观看| 欧美视频一二区| 中文字幕最新精品| 日韩电影精品| 国产资源第一页| 白白色亚洲国产精品| 欧美啪啪小视频| 日韩亚洲欧美中文在线| 高清久久一区| 欧美在线观看成人| 激情综合一区二区三区| 四虎精品免费视频| 精品少妇一区二区三区免费观看| 女囚岛在线观看| 美国av一区二区三区| 日av在线不卡| 青青草在线观看视频| 亚洲风情亚aⅴ在线发布| 国模套图日韩精品一区二区| 亚洲精品乱码视频| 国产精品456| 影音先锋亚洲天堂| 最近2019年手机中文字幕| 国产三区四区在线观看| 欧美视频中文字幕| 日本亚洲精品| 国产在线精品一区| 日韩在线播放一区二区| 青草影院在线观看| 亚洲另类图片色| 精品一区二区三区在线观看视频 | 综合久久2019| 精品一区二区三区日本| 精品一区二区三区日韩| 99视频在线看| 久久久999精品视频| 亚洲ab电影|