精通react/vue組件設計之實現一個輕量級可擴展的模態框組件

2021-01-10 酷扯兒

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

前言

本文是筆者寫組件設計的第九篇文章, 今天帶大家實現一個輕量級且可靈活配置組合的模態框(Modal)組件, 該組件在諸如Antd或者elementUI等第三方組件庫中都會出現,主要用來提供系統的用戶反饋.

之所以會寫組件設計相關的文章,是因為作為一名前端優秀的前端工程師,面對各種繁瑣而重複的工作,我們不應該按部就班的去"辛勤勞動",而是要根據已有前端的開發經驗,總結出一套自己的高效開發的方法.

[筆記]前端組件的一般分類:

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

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

正文

在開始組件設計之前希望大家對css3和js有一定的基礎,並了解基本的react/vue語法.我們先來解構一下Modal組件, 一個Modal分為以下幾個部分:

編輯

搜圖

每一個區塊都可以自定義配置, 也可以組合其他組件.實現後的組件效果:

編輯

搜圖

1. 組件設計思路

按照之前筆者總結的組件設計原則,我們第一步是要確認需求. 模態框(Modal)組件一般會有如下需求點:

能控制Modal主體的樣式提供Modal完全關閉後的回調能控制取消按鈕文字和樣式能控制確認按鈕文字和樣式控制modal展示的位置控制是否顯示右上角的關閉按鈕可以配置自定義關閉圖標配置關閉時是否銷毀Modal裡的子元素自定義模態框底部內容控制是否支持鍵盤esc關閉控制是否展示遮罩控制點擊蒙層是否允許關閉自定義遮罩樣式自定義標題控制對話框是否可見自定義對話框寬度暴露點擊遮罩層或右上角叉或取消按鈕的回調提供點擊確定回調

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

編輯

搜圖

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

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

2.1. Modal組件框架設計

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

import PropTypes from 'prop-types'

import './index.less'

/**

* Modal Modal組件

* @param {afterClose} func Modal完全關閉後的回調

* @param {bodyStyle} object Modal body的樣式

* @param {cancelText} string|ReactNode 取消按鈕文字

* @param {centered} bool 居中展示Modal

* @param {closable} bool 是否展示右上角的關閉按鈕

* @param {closeIcon} ReactNode 自定義關閉圖標

* @param {destroyOnClose} bool 關閉時銷毀Modal裡的子元素

* @param {footer} null|ReactNode 底部內容,當不需要底部默認按鈕時,可以設置為footer={null}

* @param {keyboard} bool 是否支持鍵盤的esc鍵退出

* @param {mask} bool 是否展示遮罩

* @param {maskclosable} bool 點擊蒙層是否允許關閉

* @param {maskStyle} object 遮罩樣式

* @param {okText} string|ReactNode 確認按鈕的文本

* @param {title} string|ReactNode 標題內容

* @param {visible} bool Modal是否可見

* @param {width} string Modal寬度

* @param {onCancel} func 點擊遮罩或者取消按鈕,或者鍵盤esc按鍵時的回調

* @param {onOk} func 點擊確定的回調

*/

function Modal(props) {

const {

afterClose,

bodyStyle,

cancelText,

centered,

closable,

closeIcon,

destroyOnClose,

footer,

keyboard,

mask,

maskclosable,

maskStyle,

okText,

title,

visible,

width,

onCancel,

onOk

} = props

return <div className="xModalWrap">

<div className="xModalContent">

<div className="xModalHeader">

</div>

<div className="xModalBody">

</div>

<div className="xModalFooter">

</div>

</div>

<div className="xModalMask"></div>

</div>

}

export default Modal

有了這個框架,我們來一步步往裡面實現內容吧.

2.2 實現基礎配置功能

基礎配置功能往往和業務邏輯無關, 僅僅用來控制元素的顯示隱藏等,由於其非常容易實現,所以我們先來實現以下這些屬性的功能:

bodyStylecancelTextclosablecloseIconfootermaskmaskStyleokTexttitlewidth

這幾個功能在框架搭建好之後已經部分實現了,是因為他們都比較簡單,不會牽扯到其他複雜邏輯.只需要對外暴露屬性並使用屬性即可. 具體實現如下:

// ...

function Modal(props) {

// ...

return <div className="xModalWrap">

<div

className="xModalContent"

style={{

width

}}

>

<div className="xModalHeader">

<div className="xModalTitle">

{ title }

</div>

</div>

{

closable &&

<span className="xModalCloseBtn">

{ closeIcon || <Icon type="FaTimes" /> }

</span>

}

<div className="xModalBody" style={bodyStyle}>

{ children }

</div>

{

footer === null ? null :

<div className="xModalFooter">

{

footer ? footer :

<div className="xFooterBtn">

<Button className="xFooterBtnCancel" type="pure">{ cancelText }</Button>

<Button className="xFooterBtnOk">{ okText }</Button>

</div>

}

</div>

}

</div>

{

mask && <div className="xModalMask" style={maskStyle}></div>

}

</div>

}

通過以上實現,我們很容易控制一個modal組件具體顯示那些元素,以及那些元素是可關閉modal的,具體案例如下:

1. 去除footer(通過設置footer為null)

2. 去除右上角的關閉按鈕

3. 去除mask遮罩

2.3 實現visible(帶有彈窗出來和隱藏的動畫animation)

熟悉antd或者element的朋友都知道,visible用來控制modal的顯示和隱藏,我們這裡也來實現同樣的功能,關於隱藏和顯示的動畫,我們這裡用transform:scale來實現。先來看看實現效果吧:

編輯搜圖

這裡筆者使用了react hooks的useState這個API,來設置彈窗可見性的state,modal默認不可見。具體邏輯如下:

let [isHidden, setHidden] = useState(!props.visible)

const handleClose = () => {

setHidden(false)

}

html結構如下:

<div className="xModalWrap" style={{display: isHidden ? 'none' : 'block'}}>

由以上代碼我們知道模態框的顯示隱藏是通過設置display:none/block來控制的,但是我們都知道display:none是不能執行動畫效果的,為了實現內容彈窗的動畫,我們這裡採用了@keyframe動畫,對於低版本瀏覽器也採用了很好的向下兼容。具體css代碼如下:

@keyframes xSpread {

0% {

opacity: 0;

transform: scale(0);

}

100% {

opacity: 1;

transform: scale(1);

}

}

2.5 實現centered

centered屬性的作用就是來控制彈窗內容距離整個遮罩或者可視區域的位置的,值為true則居與遮罩或者可視區域的正中心。因為我們默認設置的modal內容區域的位置是左右居中,頂部距離可視區域頂部100px,所以這裡我們實現如下:

<div className={`xModalContent${centered ? ' xCentered' : ''}`}>

css代碼如下:

&.xCentered {

top: 50%;

transform: translateY(-50%);

}

這個實現也非常簡單,就是通過屬性centered來動態的設置類名即可。

2.6 實現destroyOnClose

這個功能意思是在彈窗關閉時是否清除子元素,我在:《精通react/vue組件設計》之配合React Portals實現一個功能強大的抽屜(Drawer)組件這篇文章中有詳細的介紹,大家感興趣可以研究以下,這裡我指介紹實現過程。

當destroyOnClose為true時,我們銷毀子元素即可,通過維護一個state來實現組件的重新渲染。要想實現該功能,我們需要處理如下幾個事件:

當點擊關閉按鈕時,根據destroyOnClose銷毀子組件當點擊確認按鈕時,根據destroyOnClose銷毀子組件當visible為true,根據destroyOnClose將子組件重新渲染出來具體實現代碼如下:

// 關閉事件(關閉和確認事件邏輯基本一致,這裡就不單獨寫了)

const handleClose = () => {

setHidden(true)

if(destroyOnClose) {

setDestroyChild(true)

}

document.body.style.overflow = 'auto'

onCancel && onCancel()

}

// visivle/destroyOnClose更新時,重新渲染子組件

useEffect(() => {

if(visible) {

if(destroyOnClose) {

setDestroyChild(true)

}

}

}, [visible, destroyOnClose])

這樣我們就實現了彈窗關閉時銷毀組件的功能。

2.7 實現鍵盤按鍵ESC時關閉模態框(Modal)

為了更好的用戶體檢,筆者的Modal組件支持鍵盤事件,我們都知道鍵盤的ESC對應的事件碼為27,那麼我們就能根據這個原理來實現鍵盤按鍵ESC時關閉模態框:

useEffect(() => {

document.onkeydown = function (event) {

let e = event || window.event || arguments.callee.caller.arguments[0]

if (e && e.keyCode === 27) {

handleClose()

}

}

}, [])

因為事件監聽只需要執行一次,所以useEffect的依賴設置為空數組即可。雖然這樣已經基本實現了鍵盤關閉的功能,但是這樣的代碼明顯不夠優雅,所以我們來完善以下,我們可以將鍵盤關閉的方法抽離出來,然後在useEffect的第一個回調函數中返回另一個函數(該函數裡是組件卸載前的鉤子),當組件卸載時我們將事件監聽移除,這樣可以提高一些性能,對內存優化也有幫助:

const closeModal = function (event) {

let e = event || window.event || arguments.callee.caller.arguments[0]

if (e && e.keyCode === 27) {

handleClose()

}

}

useEffect(() => {

document.addEventListener('keydown', closeModal, false)

return () => {

document.removeEventListener('keydown', closeModal, false)

}

}, [])

通過這種方式,代碼和功能實現上是不是會更優雅呢?

2.8 實現afterClose

afterClose的作用主要是在模態框關閉之後執行某個回調函數。我們使用class組件很好實現這個功能,因為setState可以傳兩個參數,一個是更新state的回調,另一個是state更新之後的回調,我們只需要把afterClose放到更新後的回調即可,也就是第二個參數回調裡。但是我們modal組件目前是用react hooks和函數式組件寫的,那麼怎麼實現狀態更新後的回調呢?筆者這裡提供一個實現思路,利用閉包來實現,核心代碼如下:

// 函數組件外部

let hiddenCount = 0;

// 函數組件內部

useEffect(() => {

if(isHidden && hiddenCount) {

hiddenCount = 0

afterClose && afterClose()

}

hiddenCount = 1

}, [isHidden])

我們知道useEffect不僅僅可以實現監聽掛載組件的鉤子,也同樣能監聽state更新,我們利用這一點來實現該功能,值得注意的是我們要在執行afterClose前重置hiddenCount,避免其他使用modal組件的函數的影響。

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

import PropTypes from 'prop-types'

// ...

Modal.propTypes = {

afterClose: PropTypes.func,

bodyStyle: PropTypes.object,

cancelText: PropTypes.oneOfType([

PropTypes.string,

PropTypes.element

]),

centered: PropTypes.bool,

closable: PropTypes.bool,

closeIcon: PropTypes.element,

destroyOnClose: PropTypes.bool,

footer: PropTypes.oneOfType([

PropTypes.element,

PropTypes.object

]),

keyboard: PropTypes.bool,

mask: PropTypes.bool,

maskclosable: PropTypes.bool,

maskStyle: PropTypes.object,

okText: PropTypes.oneOfType([

PropTypes.string,

PropTypes.element

]),

title: PropTypes.oneOfType([

PropTypes.string,

PropTypes.element

]),

visible: PropTypes.bool,

width: PropTypes.string,

onCancel: PropTypes.func,

onOk: PropTypes.func

}

關於prop-types的使用官網上有很詳細的案例,這裡說一點就是oneOfType的用法, 它用來支持一個組件可能是多種類型中的一個. 組件完整css代碼如下:

.xModalWrap {

position: fixed;

z-index: 999;

top: 0;

left: 0;

width: 100%;

bottom: 0;

overflow: hidden;

.xModalContent {

position: relative;

z-index: 1000;

margin-left: auto;

margin-right: auto;

position: relative;

top: 100px;

background-color: #fff;

background-clip: padding-box;

border-radius: 4px;

-webkit-box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);

box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);

pointer-events: auto;

animation: xSpread .3s;

&.xCentered {

top: 50%;

transform: translateY(-50%);

}

.xModalHeader {

padding: 16px 24px;

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

background: #fff;

border-bottom: 1px solid #e8e8e8;

border-radius: 4px 4px 0 0;

.xModalTitle {

margin: 0;

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

font-weight: 500;

font-size: 16px;

line-height: 22px;

word-wrap: break-word;

}

}

.xModalCloseBtn {

position: absolute;

top: 0;

right: 0;

z-index: 10;

padding: 0;

width: 56px;

height: 56px;

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

font-size: 16px;

line-height: 56px;

text-align: center;

text-decoration: none;

background: transparent;

border: 0;

outline: 0;

cursor: pointer;

}

.xModalBody {

padding: 16px 24px;

}

.xModalFooter {

padding: 10px 16px;

text-align: right;

background: transparent;

border-top: 1px solid #e8e8e8;

border-radius: 0 0 4px 4px;

.xFooterBtn {

.xFooterBtnCancel, .xFooterBtnOk {

margin-left: 6px;

margin-right: 6px;

}

}

}

}

.xModalMask {

position: fixed;

z-index: 999;

top: 0;

left: 0;

width: 100%;

height: 100%;

overflow: hidden;

background-color: rgba(0,0,0, .5);

}

}

@keyframes xSpread {

0% {

opacity: 0;

// 之所以要再加translateY(-50%),是為了防止動畫抖動

transform: translateY(-50%) scale(0);

}

100% {

opacity: 1;

transform: translateY(-50%) scale(1);

}

}

通過以上步驟, 一個健壯的的Modal組件就完成了.Modal組件算是組件庫中中等複雜的組件,如果不懂的可以在評論區提問,筆者看到後會第一時間解答.

2.5 使用Modal組件

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

<Modal title="xui基礎彈窗" centered mask={false} visible={false}>

<p>我是彈窗內容</p>

<p>我是彈窗內容</p>

<p>我是彈窗內容</p>

<p>我是彈窗內容</p>

</Modal>

筆者已經將實現過的組件發布到npm上了,大家如果感興趣可以直接用npm安裝後使用,方式如下:

npm i @alex_xu/xui

// 導入xui

import {

Button,

Skeleton,

Empty,

Progress,

Tag,

Switch,

Drawer,

Badge,

Alert

} from '@alex_xu/xui'

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

// .babelrc

"plugins": [

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

]

npm庫截圖如下:

編輯搜圖

最後

後續筆者將會繼續實現

badge(徽標),table(表格),tooltip(工具提示條),Skeleton(骨架屏),Message(全局提示),form(form表單),switch(開關),日期/日曆,二維碼識別器組件

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

相關焦點

  • 《精通react/vue組件設計》之快速實現一個可定製的進度條組件
    今天要來實現一個高可定製的進度條組件,在介紹組件設計之前,我們先牢記以下幾個原則.每一個組件只負責某一特定的表現或者功能)正文在開始組件設計之前希望大家對css3和js有一定的基礎.我們先看看實現後的組件效果:上圖可以知道封裝後的進度條組件通過對外暴露的接口(react/vue裡面可以看做
  • 精通react/vue組件設計之配合React Portals實現一個(Drawer)組件
    通過組件的設計過程,大家會接觸到一個完成健壯的組件設計思路和方法,也能在實現組件的過程逐漸對react/vue的高級知識和技巧有更深的理解和掌握,並且在企業實際工作做遊刃有餘.作為數據驅動的領導者react/vue等MVVM框架的出現,幫我們減少了工作中大量的冗餘代碼, 一切皆組件的思想深得人心.
  • 《精通react/vue組件設計》之實現一個健壯的警告提示(Alert)組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是筆者寫組件設計的第七篇文章, 今天帶大家實現一個自帶主題且可關閉的Alert組件, 該組件在諸如Antd或者elementUI等第三方組件庫中都會出現,主要用來提供系統的用戶反饋
  • 精通react/vue組件設計之實現一個Tag(標籤)和Empty(空狀態)組件
    "辛勤勞動",而是要根據已有前端的開發經驗,總結出一套自己的高效開發的方法.作為數據驅動的領導者react/vue等MVVM框架的出現,幫我們減少了工作中大量的冗餘代碼, 一切皆組件的思想深得人心.所以, 為了讓工程師們有更多的時間去考慮業務和產品迭代,我們不得不掌握高質量組件設計的思路和方法.所以筆者將花時間去總結各種業務場景下的組件的設計思路和方法,並用原生框架的語法去實現各種常用組件的開發,希望等讓前端新手或者有一定工作經驗的朋友能有所收穫
  • 精通react/vue組件設計教你實現一個極具創意的加載(Loading)組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是筆者寫組件設計的第八篇文章, 今天帶大家用5分鐘實現一個極具創意的加載(loading)組件.涉及的核心知識點主要是css3相關特性, 如果大家非常熟悉,可直接跳過介紹直接看正文
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    本文將會使用React來開發該組件,也會使用到Javascript中常用的一些設計模式,比如單例模式,但是不管你使用什麼框架來實現,原理都是通用的,如果感興趣的朋友可以用vue也實現以一下。正文在開始組件設計之前希望大家對css3和js有一定的基礎,並了解基本的react/vue語法.我們先來解構一下Notification組件, 一個Notification分為以下幾個部分:每一個區塊都可以自定義配置, 也可以組合其他組件.並且我們可以配置提醒框出現的位置,就像antd
  • 基於jsoneditor二次封裝一個可實時預覽的json編輯器組件react版
    ,這樣一方面可以提高組件復用性和可擴展性,另一方面也帶來了項目開發的靈活性和可維護,方便多人開發協作.接下來文章將介紹如何使用react,開發一個自定義json編輯器組件.我們這裡使用了jsoneditor這個第三方庫,官方地址: jsoneditor 通過實現一個json在線編輯器,來學習如何一步步封裝自己的組件(不限於react,vue,原理類似).
  • 如何用純css打造類materialUI的按鈕點擊動畫並封裝成react組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言作為一個前端框架的重度使用者,在技術選型上也會非常注意其生態和完整性.筆者先後開發過基於vue,react,angular等框架的項目,碧如vue生態的elementUI, ant-design-vue, iView等成熟的UI框架
  • React源碼之組件的實現與首次渲染
    react: v15.0.0 本文講 組件如何編譯 以及 ReactDOM.render 的渲染過程。 babel 的編譯 babel 將 React JSX 編譯成 JavaScript.
  • 供我們選擇的 Vue 組件庫還有很多!
    adminify:同樣是一個集成 vuetify 組件庫的開源項目。vue-movie:vuetify + vue 仿豆瓣電影項目。electron-vue-music:electron + vue + vuetify 仿網抑雲音樂。
  • 快速在你的vue/react應用中實現ssr(服務端渲染)
    默認情況下,可以在瀏覽器中輸出自定義組件,進行生成 DOM和操作 DOM, 也就是我們常說的客戶端渲染, 並且我們大部分主流的場景都是SPA(單頁面)應用, 而隨著 SPA尤其是 React、Vue、Angular 為代表的前端框架的流行
  • 手把手教你用JS/Vue/React實現幸運水果機(80後情懷之作)
    項目截圖在線體驗在線體驗遊戲介紹幸運水果機是一款街機遊戲,遊戲界面由24個方格拼接成一個正方形,每個方格中都有一個不同的水果圖形,方格下都有一個小燈。當小燈停下時,如果停在玩家押注的目標上則可贏取相應的遊戲幣。物品:遊戲中的物品有八種,分別為:蘋果、西瓜、木瓜、橙子、鈴鐺、77、雙星,這些物品又分為大小兩種。還有BAR圖標,分為2種。賠率:以下為所有固定賠率物品的賠率。
  • Vue、React 和 Angular:該選擇哪個框架?
    Vue.jsGoogle 前僱員 Evan You 在與 Angular 合作多年後,決定 自己 創建一個輕量級框架,其中將包含上述框架的最佳特性。 新框架 Vue.js 於 2014 年 2 月開源 ,從那時起,Vue.js 就獲得了極高的人氣。最新版本為 2.6 Macross ,於 2019 年 2 月 4 日發布。
  • Vue.js 教程:構建一個特斯拉汽車餘電計算器
    作為本教程的起點,請克隆這個 Github 存儲庫:https://github.com/petereijgermans11/workshop-reactjs-vuejs然後轉至 vuejs-app 目錄。
  • 「首席架構師推薦」關於React生態系統的一系列精選資源(3)
    imvvm - React的不可變模型 - 視圖 - 視圖模型morearty.js - 在純JavaScript中更好地管理Reactvaluable - React的不可變數據存儲react-resolver - 用於React組件的遞歸延遲加載數據的同構庫freezer-js - React的輕量級和React式不可變數據結構MobX - 簡單,可擴展的狀態管理Qaf - 作為商店的組件。
  • Vue.js 很難學?看看這個由 DCloud 與 Vue 官方合作推出的免費入門...
    這對於微小項目可能沒什麼感覺,甚至還很方便,但對於中大型但項目,更適合工程化開發模式的 Vue/react ,只要學會了就真的不會再回去了。這套在線觀看的免費入門視頻教程就是給你們準備的。Vue.js 是目前國內很火的前端框架,前端工程師招聘幾乎都要求掌握。
  • Vue.js布局
    (但假設有一個結帳流程,您不想顯示導航。或者您可能有帶側邊欄的產品頁面和沒有側邊欄的其他頁面等等)面對這種多樣性要求,我們要怎麼做來滿足業務需求的同時,保持代碼的可維護、易擴展呢?下面一起來探討。靜態布局包裝器組件:使用普通組件(包含布局不同部分的一個或多個插槽)作為視圖的包裝器,它提供了很大的靈活性,並且感覺不像條件渲染方法那麼髒。
  • 尚矽谷前端視頻周 | React新版教程發布,聽著上頭,學到痴迷!
    師出名門的UI組件庫:antd(螞蟻金服出品),集中式狀態管理的經典之作:Redux,消息訂閱與發布理念中的老大哥:Pubsub,同時擴展了React最新的hooks、錯誤邊界、Context等內容,全面且系統的知識點剖析,助你輕鬆駕馭真實項目!講解細緻,幽默風趣,所有知識點都以案例為驅動,演繹式教學,生活化舉例,保姆式解讀官網,授之以魚更授之以漁!
  • 基於Vue實現一個有點意思的拼拼樂小遊戲
    vue的第三方移動端ui庫,筆者推薦如下:Mint 餓了麼推出的移動端ui庫NutUI 一套京東風格的移動端組件庫muse-ui 基於MaterialUI風格的移動端UI組件cube-ui滴滴團隊開發的移動端UI組件庫vant 有贊團隊的電商風格的移動端組件庫atom-design atom風格的移動端ui組件庫mand-mobile 滴滴團隊研發的基於金融場景的移動端ui組件庫
  • React系列(一) -邂逅React開發
    聲明式編程組件化開發:組件化開發頁面目前前端的流行趨勢,我們會講複雜的界面拆分成一個個小的組件;如何合理的進行組件的劃分和設計也是後面我會講到的一個重點;React的優勢React由Facebook來更新和維護,它是大量優秀程式設計師的思想結晶:React的流行不僅僅局限於普通開發工程師對它的認可,大量流行的其他框架借鑑React的思想;Vue.js框架設計之初,有很多的靈感來自Angular和React。