亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

React 導(dǎo)讀(四)

cooxer / 2615人閱讀

摘要:一前言在導(dǎo)讀三中介紹了項(xiàng)目的背景功能需求項(xiàng)目結(jié)構(gòu)以及組件的劃分層次,接下來我們就來看下實(shí)際的代碼,這一篇文章會(huì)主要分享用到的基礎(chǔ)組件的封裝。

一、前言

在 React 導(dǎo)讀(三) 中介紹了項(xiàng)目的背景、功能需求、項(xiàng)目結(jié)構(gòu)以及組件的劃分層次,接下來我們就來看下實(shí)際的代碼,這一篇文章會(huì)主要分享用到的基礎(chǔ)組件的封裝。

二、基礎(chǔ)組件設(shè)計(jì)

我們?cè)谠O(shè)計(jì)組件之前本來是有一個(gè)流程和過程的,這里我寫的組件并不會(huì)像社區(qū)內(nèi)的組件庫一樣完善或者說一定考慮很完整,但是這樣也會(huì)有一個(gè)好處,可以按照自己項(xiàng)目的需求進(jìn)行定制、擴(kuò)展以及冗余的代碼會(huì)更少,當(dāng)然很多時(shí)候節(jié)約的這點(diǎn)代碼可以忽略不計(jì)(特別是項(xiàng)目業(yè)務(wù)代碼和庫的代碼比例上升到一定比例過后,所以一切不說場(chǎng)景就說某某庫太大的觀點(diǎn)都是不正確的),因?yàn)榇蠹叶加邪葱杓虞d的配置可選。這不是絕對(duì)的,不一定說你自己花時(shí)間和精力去開發(fā)一個(gè)這樣的庫就更好,因?yàn)?strong>隨著項(xiàng)目規(guī)模的擴(kuò)大,組件的種類和需求會(huì)越來越多,即使是一個(gè)不錯(cuò)的工程師利用技巧保障項(xiàng)目持續(xù)迭代,但是人的時(shí)間和精力是有限的,更合理的利用現(xiàn)有資源去提高效率才是最優(yōu)先考慮的事情。

我這里的基礎(chǔ)組件實(shí)現(xiàn)了這么幾個(gè):
Button, Dialog, Input, Loading, Table

然后分別來介紹一下如何基礎(chǔ)開始封裝和拆合組件。其實(shí)基礎(chǔ)組件的設(shè)計(jì)是很殺腦細(xì)胞的,如果要考慮很周全的話,因?yàn)橐骖檮e人用的爽,也盡可能要保留可擴(kuò)展性,基礎(chǔ)組件如果擴(kuò)展性太弱,基本等于廢了。其實(shí)如果有學(xué)習(xí)設(shè)計(jì)模式是可以相互連接的,因?yàn)樵O(shè)計(jì)模式是成熟的經(jīng)驗(yàn),不是說非要在寫某種邏輯代碼或者做架構(gòu)設(shè)計(jì)的時(shí)候才能使用,它是能夠貫穿在整個(gè)軟件周期內(nèi)的。

(1) 思考想要如何去組織組件樣式

首先這里的組件是 css 和 js 最好能夠分開使用的(這里的分開使用不是指?jìng)鹘y(tǒng)意義的分離,而是保持獨(dú)立,可進(jìn)可退),拿以前 UI 需求來看,就是在同一個(gè)結(jié)構(gòu)的 HTML,加上 class 都是能夠正常展現(xiàn)的,我這里的 css 結(jié)構(gòu)是以前用過的,也沒做什么改動(dòng)直接拿過來使用的。這種設(shè)計(jì)思路其實(shí)和現(xiàn)在的組件化開發(fā)是不沖突的,組件化后還能夠使得這種模式更簡(jiǎn)單的被實(shí)現(xiàn),因?yàn)槟阒恍枰紤]組件這個(gè)作用域內(nèi)的樣式。

(2) Dialog 組件
這里先拿 Dialog 組件先舉例,這里我將彈框組件分成了三部分:DialogHeader, DialogFooter, Dialog 拆分上也沒什么理由,這是一種簡(jiǎn)單直接的拆分,因?yàn)楹芏鄰椏蚨季哂羞@么幾部分:標(biāo)題、內(nèi)容、按鈕區(qū)域。

而且不只是這樣的才叫彈框,彈框如其名:彈出的框,所以都是可以的,比如下面這種像個(gè) Alert 一樣的彈框:

我理解的好擴(kuò)展的組件就像小時(shí)候玩的玩具一樣,各部分都是可拆解可組合的,所以彈框的這三部分都需要有一定靈活的地方。來看看代碼,其實(shí)蠻簡(jiǎn)單的。

class Dialog extends React.Component {
    render() {
        const {
            renderHeader,
            renderFooter,
            className,
        } = this.props;

        const header = renderHeader ? renderHeader() : null;
        const footer = renderFooter ? renderFooter() : null;

        const wrapClassName = cx("st-dialog", className);

        return (
            
{header} {this.props.children} {footer}
); } }

上面就是一個(gè)我這里 Dialog 的結(jié)構(gòu),headerfooter采用的是render-props的方式來實(shí)現(xiàn)具體的插入,為什么能夠采用這種方式其實(shí)不難理解,因?yàn)樵?React 中,一個(gè)函數(shù)就自然就是一個(gè)組件聲明,返回值就能是一個(gè)組件實(shí)例。我這里更直接,你要組件返回值,我就給你一個(gè)組件...使用上就是這樣:

// 這里結(jié)構(gòu)稍微代碼有點(diǎn)多,就不要揉在一起了,給一個(gè)變量存一下更清晰,在 React 中組件的使用是自由的。
const footer = (
    
);

 }
    renderFooter={() => footer}>
    
...

為什么要這樣設(shè)計(jì)呢?主要還是因?yàn)橛袝r(shí)候需求不定,萬一哪天 DialogFooter 組件不是這樣子,我就在外面實(shí)現(xiàn)好組件給這個(gè)renderFooter就行了,其他部分就不需要改動(dòng),還有就是實(shí)現(xiàn)的時(shí)候不要吝嗇div這種容器標(biāo)簽的使用,多一層就多一個(gè)權(quán)重,少一層就多了一份自由。

現(xiàn)在還有一個(gè)問題,就是我的基礎(chǔ)彈框有了,業(yè)務(wù)彈框各種各樣,這么簡(jiǎn)單的一個(gè)封裝根本不靠譜啊...那么這里你就將彈框作為一個(gè)流行的渲染組件來使用,但是是否掛載到業(yè)務(wù)模塊中就使用封裝的一層業(yè)務(wù)彈框來控制,比如我的業(yè)務(wù)彈框叫 EmployeeAddDialog,在 render 方法中:

if(!this.props.visible) {
    return null;
}

return ();

通過一個(gè) visibleprops 值來控制是否掛載 Dialog,那么這樣做就有一個(gè)好處,在處理異步彈框的時(shí)候,想什么時(shí)候關(guān)閉彈框可以由業(yè)務(wù)的流程來控制。在業(yè)務(wù)組件聲明業(yè)務(wù)彈框的地方就這樣:

然后這樣就實(shí)現(xiàn)了一個(gè)彈框了,靈活性和擴(kuò)展性都還好,最后還有一個(gè)細(xì)節(jié)就是這個(gè)EmployeeAddDialog始終都掛載在業(yè)務(wù)組件中,業(yè)務(wù)組件渲染一次這個(gè)彈框更新周期也會(huì)走一次,所以能夠繼承一下PureComponent來簡(jiǎn)單避免多次執(zhí)行不必要代碼:

class EmployeeAddDialog extends React.PureComponent { }

看上去這個(gè)彈框組件還算干凈,不可能啊,業(yè)務(wù)太復(fù)雜也不會(huì)太干凈,那么臟的東西去哪兒了呢?我這里有 2 個(gè)比較臟的地方:

(1) Footer,因?yàn)橛邪粹o,每個(gè)需求的按鈕是不一樣的;
(2) 彈框的內(nèi)容,這里就更是千奇百怪,每個(gè)產(chǎn)品經(jīng)理的腦洞都不一樣。

我這里應(yīng)對(duì)上 Footer 有一定的定制又有簡(jiǎn)單的開關(guān),比如我就支持2個(gè)按鈕:提交類、關(guān)閉類。

彈框內(nèi)容我控制不了,那么我就把代碼是否更臟的職責(zé)交出去,使用了 this.props.children來做這個(gè)事情,使用者的代碼干凈度來決定最后的業(yè)務(wù)彈框干凈度。

具體的全部代碼能夠在這里看到:

基礎(chǔ) Dialog

業(yè)務(wù) Dialog

今天先到這里吧,睡覺了?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/93567.html

相關(guān)文章

  • React 導(dǎo)讀(一)

    摘要:需要有一定的基礎(chǔ)和的使用經(jīng)驗(yàn)。這就是屬性的作用。方法接收一個(gè)新對(duì)象來重新賦值。也接收一個(gè)函數(shù),這個(gè)回調(diào)函數(shù)這里我默認(rèn)有一個(gè)參數(shù),表示之前的的值,這個(gè)函數(shù)的返回值就是最新的。但是不同的是在組件內(nèi)部是只讀的。 前言 寫這篇文章的主要目標(biāo)是讓初學(xué)者更快的上手 React 的項(xiàng)目開發(fā),能有一個(gè)循循漸進(jìn)的理解過程。需要有一定的 JavaScript 基礎(chǔ)和 NPM 的使用經(jīng)驗(yàn)。不多說了,下面會(huì)按...

    kumfo 評(píng)論0 收藏0
  • React 導(dǎo)讀(三)

    摘要:場(chǎng)景為了更清晰的安排年前年后的工作和值班,現(xiàn)在要對(duì)過年期間人員請(qǐng)假的情況進(jìn)行統(tǒng)計(jì),并且進(jìn)行一個(gè)簡(jiǎn)單的管理。我們現(xiàn)在來訂閱一個(gè)名為的事件,用來表示表格中需要展示每條數(shù)據(jù)。 前言 React 導(dǎo)讀(一)React 導(dǎo)讀(二) 在之前 2 篇文章中中學(xué)習(xí)到了寫第一個(gè) Web 組件以及常用的生命周期函數(shù)的使用,這篇文章將繼續(xù)之前的目錄,開始新的知識(shí)點(diǎn)補(bǔ)充: [x] React 如何編寫 He...

    zzir 評(píng)論0 收藏0
  • React 導(dǎo)讀(二)

    摘要:對(duì)于最開始關(guān)注的是的初始化以及在哪里請(qǐng)求。在進(jìn)行初始化,推薦在中進(jìn)行請(qǐng)求。是在組件即將被卸載前一刻的鉤子,一般用于取消中訂閱的事件等作用,清理一些不要的變量等,避免內(nèi)存泄漏。第二條的原因額,說好的更新才調(diào),初始化不調(diào)用是符合邏輯的。 前言 在上篇文章React 導(dǎo)讀(一)中學(xué)習(xí)到了寫第一個(gè) Web 組件,這篇文章將繼續(xù)之前的目錄,開始新的知識(shí)點(diǎn)補(bǔ)充: [x] React 如何編寫 H...

    Doyle 評(píng)論0 收藏0
  • 《深入理解ES6》筆記——導(dǎo)讀

    摘要:最近買了深入理解的書籍來看,為什么學(xué)習(xí)這么久還要買這本書呢主要是看到核心團(tuán)隊(duì)成員及的創(chuàng)造者為本書做了序,作為一個(gè)粉絲,還是挺看好這本書能給我?guī)硪粋€(gè)新的升華,而且本書的作者也非常厲害。 使用ES6開發(fā)已經(jīng)有1年多了,以前看的是阮一峰老師的ES6教程,也看過MDN文檔的ES6語法介紹。 最近買了《深入理解ES6》的書籍來看,為什么學(xué)習(xí)ES6這么久還要買這本書呢?主要是看到Daniel A...

    Godtoy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<