精通react/vue組件設計之實現一個Tag(標籤)和Empty(空狀態)組件

2020-12-23 酷扯兒

本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫

前言

本文是筆者寫組件設計的第五篇文章,之所以會寫組件設計相關的文章,是因為作為一名前端優秀的前端工程師,面對各種繁瑣而重複的工作,我們不應該按部就班的去"辛勤勞動",而是要根據已有前端的開發經驗,總結出一套自己的高效開發的方法.作為數據驅動的領導者react/vue等MVVM框架的出現,幫我們減少了工作中大量的冗餘代碼, 一切皆組件的思想深得人心.所以, 為了讓工程師們有更多的時間去考慮業務和產品迭代,我們不得不掌握高質量組件設計的思路和方法.所以筆者將花時間去總結各種業務場景下的組件的設計思路和方法,並用原生框架的語法去實現各種常用組件的開發,希望等讓前端新手或者有一定工作經驗的朋友能有所收穫.

今天主要帶大家一起實現一個Tag組件和Empty(空狀態)組件,在介紹組件設計之前,先給大家介紹一個免費開源的圖標庫icomoon,

可以在線導入SVG格式字體,並進行編輯,然後下載來使用,在組件設計中有具體的使用介紹.

正文

在開始組件設計之前希望大家對css3和js有一定的基礎.我們先看看實現後的組件效果:

由圖可以知道tag組件可以自定義顏色主題(color theme), 可以手動關閉標籤, 空狀態主要是提供用戶數據展示用的, 實現起來很簡單,重點在圖標的使用上.

1. 組件設計思路

按照之前筆者寫的組件設計原則,我們第一步是要確認需求. 一個tag標籤組件一般都會有如下需求點:

可以改變標籤顏色提供關閉標籤的配置,讓用戶可以關閉標籤關閉標籤的回調,讓用戶能控制標籤關閉後觸發的動作

需求收集好之後,作為一個有追求的程式設計師, 會得出如下線框圖:

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

2. 基於react實現一個Tag組件

2.1. tag組件框架設計

首先我們先根據需求將組件框架寫好,這樣後面寫業務邏輯會更清晰:

import React from 'react'

import classnames from 'classnames'

import styles from './index.less'

/**

* 標籤組件

* @param {closable} boolean 是否可關閉

* @param {onClose} func 標籤關閉時的回調

* @param {color} string 標籤的顏色,不設置則為默認顏色

*/

export default function Tag(props) {

let { children, closable, onClose, color } = props

return <div

className={styles.xTag}

style={{ backgroundColor: color }}

{ children }

</div>

}

有了這個框架,我們來一步步往裡面實現內容吧. 根據需求,顏色這個屬性好實現,在上述代碼中已經實現了, 我們看看closable和onClose如何實現.我們要向關閉tag,實際上是需要將這個標籤隱藏,比如說使用display:none,或者從dom中移除, 筆者就參考antd的實現方式,通過display:none來實現.

首先我們要想在react的函數式組件操作dom, 最好的方式是使用ref, 關於ref的使用如果不熟悉的可以參考react官方文檔,這裡實現如下:

import React from 'react'

import classnames from 'classnames'

import styles from './index.less'

/**

* 標籤組件

* @param {closable} boolean 是否可關閉

* @param {onClose} func 標籤關閉時的回調

* @param {color} string 標籤的顏色,不設置則為默認顏色

*/

export default function Tag(props) {

let { children, closable, onClose, color } = props

let tag = React.createRef()

let handleClose = () => {

onClose && onClose()

tag.current.style.display = 'none'

}

return <div

className={classnames(styles.xTag, color ? styles.xTagHasColor : '')}

style={{ backgroundColor: color }}

ref={tag}>

{ children }

{ closable && <span className={styles.closeBtn} onClick={handleClose}>x</span> }

</div>

}

通過react的createRef API,我們很方便的拿到了當前的dom對象, 在handleClose可以進行屬性的分配. 組件的js代碼基本實現完成了,接下來看看css:

.xTag {

margin-bottom: 8px;

margin-right: 8px;

display: inline-block;

border-radius: 4px;

border: 1px solid #d9d9d9;

padding: 0 7px;

font-size: 12px;

line-height: 20px;

white-space: nowrap;

background-color: #fafafa;

&.xTagHasColor {

border-color: transparent;

color: #fff;

.closeBtn {

color: rgba(255, 255, 255, .6)

}

}

.closeBtn {

margin-left: 5px;

color: rgba(0, 0, 0, 0.45);

cursor: pointer;

}

}

健壯性支持:

import PropTypes from 'prop-types'

// ...

Tag.propTypes = {

color: PropTypes.string,

closable: PropTypes.bool,

onClose: PropTypes.func

}

是不是很簡單? 這樣一個可定製對的tag組件就完成了,關於代碼中的css module和classnames的使用大家可以自己去官網學習,非常簡單.

3. 基於react實現一個Empty(空狀態)組件

這個組件非常好寫, 目前常用的空狀態組件一般是圖片和文字組合, 圖片文字都可替換,具體實現如下:

import classnames from 'classnames'

import styles from './index.less'

/**

* 空狀態組件

* @param {className} string 自定義類名

* @param {text} string 空狀態文本

*/

export default function Empty(props) {

let { text, className } = props

return <div className={classnames(styles.emptyWrap, className)}>

<div className={styles.emptyInner}><span className="icon-finder"></span></div>

<p>{ text ? text : '空空如也'}</p>

</div>

}

這裡主要介紹icon-finder的由來.正如文章開始提到的,筆者採用icomoon作為圖標庫, 我們可以在其官網上定製自己的圖標,筆者大概選了40多了免費圖標,項目中使用基本夠用了.主要介紹一下他的具體功能:

可導入,下載,管理自己的圖標庫

可編輯圖標,生成svg圖標或者字體圖標

當然國內的iconfont也非常優秀,大家可以多嘗試.

我們將下載icomoon圖標文件後,會有一個html的demo文件,裡面有具體的使用方法和離線編輯功能,如下:

筆者在這裡就不多做介紹了, 其次我們也可以類似於antd一樣,將icon封裝成react的組件, 這樣用起來也非常方便.

相關焦點

  • 《精通react/vue組件設計》之快速實現一個可定製的進度條組件
    而是要根據已有前端的開發經驗,總結出一套自己的高效開發的方法.作為數據驅動的領導者react/vue等MVVM框架的出現,幫我們減少了工作中大量的冗餘代碼, 一切皆組件的思想深得人心.所以, 為了讓工程師們有更多的時間去考慮業務和產品迭代,我們不得不掌握高質量組件設計的思路和方法.所以筆者將花時間去總結各種業務場景下的組件的設計思路和方法,並用原生框架的語法去實現各種常用組件的開發,希望等讓前端新手或者有一定工作經驗的朋友能有所收穫
  • 精通react/vue組件設計之實現一個輕量級可擴展的模態框組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是筆者寫組件設計的第九篇文章, 今天帶大家實現一個輕量級且可靈活配置組合的模態框(Modal)組件, 該組件在諸如Antd或者elementUI等第三方組件庫中都會出現
  • 《精通react/vue組件設計》之實現一個健壯的警告提示(Alert)組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是筆者寫組件設計的第七篇文章, 今天帶大家實現一個自帶主題且可關閉的Alert組件, 該組件在諸如Antd或者elementUI等第三方組件庫中都會出現,主要用來提供系統的用戶反饋
  • 精通react/vue組件設計教你實現一個極具創意的加載(Loading)組件
    正文在開始組件設計之前希望大家對css3和js有一定的基礎,並了解基本的react/vue語法.我們先看看實現後的組件效果:因為動圖體積太大,就不給大家傳gif了,接下來我們具體分析一下該組件的特點.1.
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    正文在開始組件設計之前希望大家對css3和js有一定的基礎,並了解基本的react/vue語法.我們先來解構一下Notification組件, 一個Notification分為以下幾個部分:每一個區塊都可以自定義配置, 也可以組合其他組件.並且我們可以配置提醒框出現的位置,就像antd
  • 如何用純css打造類materialUI的按鈕點擊動畫並封裝成react組件
    , ant-design-vue, iView等成熟的UI框架, react生態的ant-design, materialUI等,這些第三方UI框架極大的降低了我們開發一個項目的成本和複雜度,使開發者更專注於實現業務邏輯和服務化.
  • Steps 組件的設計與實現
    NutUI 組件源碼揭秘前言本文的主題是 Steps 組件的設計與實現。大多數的組件是一個單獨的組件,使用起來很簡單,比如我們 NutUI 組件庫中的 <nut-button block>默認狀態</nut-button> 、<nut-icon type="top"></nut-icon> 等等這樣簡單的使用方式就可以實現組件的功能。
  • vue高級進階系列——用typescript玩轉vue和vuex
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫用過vue的朋友大概對vuex也不陌生,vuex的官方解釋是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  • 快速在你的vue/react應用中實現ssr(服務端渲染)
    默認情況下,可以在瀏覽器中輸出自定義組件,進行生成 DOM和操作 DOM, 也就是我們常說的客戶端渲染, 並且我們大部分主流的場景都是SPA(單頁面)應用, 而隨著 SPA尤其是 React、Vue、Angular 為代表的前端框架的流行
  • vue-antd-admin 0.7.1 已經發布 - OSCHINA - 中文開源技術交流社區
    vue-antd-admin 是 Ant Design Pro 的 Vue 實現版本,開箱即用的中後臺前端/設計解決方案。此版本更新內容包括: 新增了動態修改頁籤標題的api {this.$setPageTitle(route, title) & this.
  • 在vue項目中使用vuex實現狀態管理的案例
    說明:其實如果項目不是很龐大很複雜,沒有涉及到很多狀態值需要被很多頁面或組件共用;或者某個頁面或組件的行為會對其他頁面或組件造成依賴性的影響。並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。
  • 如何使用React Hooks實現容器組件?
    在開始使用React Hooks實現容器組件之前,先來簡單了解一下到底什麼是React Hooks和容器組件。——Jason Bonta容器組件通常用於從表示組件(即啞組件)中分離數據獲取/邏輯、事件和狀態。容器組件對於在其他用例(當前的項目/代碼庫或其他項目)中重用表示組件特別有幫助。保持組件的「啞」狀態可以更容易地共享並重用它們。
  • Vue、React 和 Angular:該選擇哪個框架?
    AngularAngular 的組件命名為 directive(指令) , 它們是由 Angular 跟蹤的 DOM 元素上的標記。 A ngular 將組件的 UI 部分作為 HTML 標籤的屬性 ,並將 UI 和 組件的 行為以 JavaScript 代碼的形式分離開來。
  • Vue Router 實現動態路由和常見問題解決方案;17 個場景,帶你入門...
    給「前端開發博客」加星標,每天打卡學習1、簡單的Vue腳手架案例實現步驟 通過 vue-cli 腳手架工具, 初始化項目, 命名為test_project;在 components 目錄下創建 Header.vue 組件、 List.vue 組件、 Recommend.vue 組件;在 src 目錄先新建 page
  • react中關於hook介紹及其使用
    簡單來說就是可以使用函數組件去使用react中的一些特性所要解決的問題:解決組件之間復用狀態邏輯很難得問題,hook能解決的就是在你無需修改之前組件結構的情況下復用狀態邏輯,在不使用hook的情況下,需要使用到一些高級的用法如高級組件、provider、customer等,這種方式對於新手來說不太友好
  • 基於Vue實現一個有點意思的拼拼樂小遊戲
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言為了加深大家對vue的了解和vue項目實戰,筆者採用vue生態來重構此項目,方便大家學習和探索。
  • 系統地認識組件:組件設計總結
    作者隨設計組件進行了一些總結,滿滿的乾貨,希望對大家有所幫助。Google的材料設計規範是每位設計師都需要了解的,作為西半球最牛逼的公司之一,Google聚集了世界上最優秀的設計大蟲,為開發者制定了一套具有Google精神的設計規範。
  • 2021年,vue3.0 面試題分析(乾貨滿滿,內容詳盡)
    React.js 中的 Hooks 基本使用React Hooks 允許你 "勾入" 諸如組件狀態和副作用處理等 React 功能中。Hooks 只能用在函數組件中,並允許我們在不需要創建類的情況下將狀態、副作用處理和更多東西帶入組件中。
  • Element - 餓了麼團隊出品的神級桌面 UI 組件庫
    設計師可以下載設計文件,在做設計圖時直接使用模板,既能快速出圖,也保證了前端還原實現。我是一個喜歡研究前端開發的愛好者,當我第一次看到element時,臥槽真漂亮!那個時候優秀的前端ui框架還不多,等我把官網所有的組件一一體驗下來,發現驚嘆得太早了,不僅好看,體驗做得非常到位,另我深有體會的是,原來在做產品設計時很難解決的交互問題,element都解決得非常好。高質量的UI組件為了用它,於是花了1周時間學了vue.js,之後就開始策馬奔騰了。
  • Vue.js布局
    (但假設有一個結帳流程,您不想顯示導航。或者您可能有帶側邊欄的產品頁面和沒有側邊欄的其他頁面等等)面對這種多樣性要求,我們要怎麼做來滿足業務需求的同時,保持代碼的可維護、易擴展呢?下面一起來探討。條件渲染:最基本和最直接的方法是有條件地渲染布局的某些部分。