淺談react 高階組件

1. 前言

1.高階組件是 react組件總結(jié)中最難的一種,平匙昵鳎基本用不到,就算能用到也給規(guī)避了,所以也導致很多人不會
2.這幾天結(jié)合之前的一些粗淺經(jīng)驗,搞了個簡單的梳理,最終梳理出幾個相對簡單易懂的課件,不足之處,歡迎交流


2. 是什么 what

高階組件(Higher Order Component,簡稱:HOC ):

1.是 React 中用于重用組件邏輯的高級技巧.
2.HOC 自身不是 React API的一部分,它是一種基于 React 的組合特性而形成的設計模式
3.高階組件參數(shù)為組件裳食,返回值為新組件的函數(shù)玫恳。


簡單理解

一個高階組件只是一個包裝了另外一個 React 組件的 組件辨赐。
這種形式通常實現(xiàn)為一個函數(shù),本質(zhì)上是一個類工廠(class factory


3.優(yōu)點

1.實現(xiàn)了對原有組件的增強和優(yōu)化,
2.可以對原有組件中的state, props和邏輯執(zhí)行增刪改操作, 一般用于代碼重用和組件增強優(yōu)化


4. 應用場景

  1. 需要代碼重用時, react如果有多個組件都用到了同一段邏輯, 這時,就可以把共同的邏輯部分提取出來,利用高階組件的形式將這段邏輯整合到每一個組件中, 從而減少代碼的邏輯重復
  1. 需要組件增強優(yōu)化時, 比如我們在項目中使用的組件有些不是自己寫的, 而是從網(wǎng)上擼下來的,但是第三方寫的組件可能比較復雜, 有時不能完全滿足需求, 但第三方組件不易修改, 此時也可以用高階組件,在不修改原始組件的前提下, 對組件添加滿足實際開發(fā)需求的功能
    3.其實主要就是針對優(yōu)點 的應用
    4.也可以用來替換 mixins 混入

4. 組件和 高階組件的區(qū)別

1.組件是將 props 轉(zhuǎn)換為 UI
2.高階組件是將組件轉(zhuǎn)換為另一個組件


5. 實現(xiàn)方式

5.1 屬性代理

(Props Proxy): 通過創(chuàng)建新組件來包裹原始組件, 把原始組件作為新組件的子組件渲染
功能: 可實現(xiàn)對原始組件的 props數(shù)據(jù)更新 和 組件模板更新


5.2 反向繼承

(Inheritance Inversion): 通過創(chuàng)建新組件繼承自原始組件, 把原始組件作為父組件
功能: 可實現(xiàn)對原始組件的state狀態(tài)數(shù)據(jù)更新 和 組件模板更新


好了已經(jīng)一大堆理論了,上代碼 再接著理論

6. 鋪墊 引出工作/代碼

6.1 代碼

    localStorage.setItem("userInfo", JSON.stringify({ name: "yzs", description: "生活如此多嬌" }))
        class UserView extends React.Component {
            constructor(props) {
                super(props)
                this.state = { userInfo: {} }

            }
            componentDidMount() {
                let userInfo = JSON.parse(localStorage.getItem("userInfo"))
                this.setState({ userInfo })
            }
            render() {
                let { userInfo } = this.state
                return (
                    <div>
                        <h1>{userInfo.name}</h1>
                        <p>{userInfo.description}</p>
                    </div>
                )
            }
        }

6.2 分析

1.上述 獲取 userInfo的邏輯要在好多地方使用,
2.那么在使用的地方都需要重寫 constructor componentDidMount ,顯然這是冗余操作
3.這個時候需要代碼 重用,所以可以選擇高階組件,對應上述的優(yōu)點之一


7. 屬性代理 用法

高階函數(shù)的基本結(jié)構(gòu)是 函數(shù),參數(shù)是組件,返回新的組件
所以基本寫法都是差不多的

7.1 基本結(jié)構(gòu)

        function withUserData(WrappedComponent) {
            return class extends React.Component {
                constructor(props) {
                    super(props)
                    this.state = { userInfo: {} }

                }
                componentDidMount() {
                    let userInfo = JSON.parse(localStorage.getItem("userInfo"))
                    this.setState({ userInfo })
                }
                render() {
                    // ...this.props 傳遞給當前組件的屬性繼續(xù)向下傳遞
                    return <WrappedComponent userInfo={this.state.userInfo} {...this.props} />
                }
            }
        }

7.2 分析

1.函數(shù)名字可以隨便起
2.參數(shù)名一般都是WrappedComponent, ed代表被包裹 ,所以整體代表 被包裹的組件,


注意

3.這里只封裝了獲取 userInfo數(shù)據(jù)的邏輯,render,布局可以不管
4.然后以屬性的形式傳遞給包裝的組件WrappedComponent
5.WrappedComponent 中直接通過 props屬性獲取需要的數(shù)據(jù)
6.其他組件也需要這段邏輯時就可以通過withUserData 高階組件包裝組件來使用


拔高

1.高階組件的主要功能是封裝并分離組件的通用邏輯京办,讓通用邏輯在組件間更好地被復用掀序。
2.高階組件的這種實現(xiàn)方式,本質(zhì)上是一個裝飾者設計模式惭婿。


8. 使用高階組件

8.1 需要使用的組件

  class UserView2 extends React.Component {
            render() {
                // 注意這里變?yōu)?props屬性接收傳值
                let { userInfo } = this.props
                return (
                    <div>
                        <h1>{userInfo.name}</h1>
                        <p>{userInfo.description}</p>
                    </div>
                )
            }
            // 省略其他邏輯,重點是當前知識點
        }

這個組件也需要用到獲取 userInfo數(shù)據(jù)的邏輯


8.2 和高階組件聯(lián)合使用

        const UserHOC = withUserData(UserView2)

函數(shù)調(diào)用,參數(shù)是組件


8.3 顯示

 let App = () => {
            return (
                <div>
                    <h1>App</h1>
                    <UserView />
                    <UserHOC />
                </div>
            )
        }
        ReactDOM.render(<App />, document.querySelector("#app"))

直接作為組件來使用


9. 高階組件與父組件區(qū)別

這里很多道友有疑問了,這不和父組件一樣嘛干啥這么麻煩呢

1.首先從邏輯的執(zhí)行流程上來看不恭,高階組件確實和父組件比較相像,
2.但是高階組件強調(diào)的是邏輯的抽象财饥。高階組件是一個函數(shù)换吧,函數(shù)關(guān)注的是邏輯;
3.父組件是一個組件钥星,組件主要關(guān)注的是UI/DOM沾瓦。如果邏輯是與DOM直接相關(guān)的,那么這部分邏輯適合放到父組件中實現(xiàn)谦炒;
4.如果邏輯是與DOM不直接相關(guān)的贯莺,那么這部分邏輯適合使用高階組件抽象,如數(shù)據(jù)校驗编饺、請求發(fā)送等乖篷。


10.后續(xù)

看來一篇文章還真不行,接著寫


參考資料

react-組件總結(jié)
react 高階組件-中文官網(wǎng)


初心

我所有的文章都只是基于入門,初步的了解透且;是自己的知識體系梳理,如有錯誤,道友們一起溝通交流;
如果能幫助到有緣人,非常的榮幸,一切為了部落的崛起;
共勉
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撕蔼,一起剝皮案震驚了整個濱河市豁鲤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲸沮,老刑警劉巖琳骡,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異讼溺,居然都是意外死亡楣号,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門怒坯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來炫狱,“玉大人,你說我怎么就攤上這事剔猿∈右耄” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵归敬,是天一觀的道長酷含。 經(jīng)常有香客問我,道長汪茧,這世上最難降的妖魔是什么椅亚? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮舱污,結(jié)果婚禮上呀舔,老公的妹妹穿的比我還像新娘。我一直安慰自己慌闭,他們只是感情好别威,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著驴剔,像睡著了一般省古。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丧失,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天豺妓,我揣著相機與錄音,去河邊找鬼布讹。 笑死琳拭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的描验。 我是一名探鬼主播白嘁,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膘流!你這毒婦竟也來了絮缅?” 一聲冷哼從身側(cè)響起鲁沥,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耕魄,沒想到半個月后画恰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡吸奴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年允扇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片则奥。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡考润,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出读处,到底是詐尸還是另有隱情额划,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布档泽,位于F島的核電站,受9級特大地震影響揖赴,放射性物質(zhì)發(fā)生泄漏馆匿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一燥滑、第九天 我趴在偏房一處隱蔽的房頂上張望渐北。 院中可真熱鬧,春花似錦铭拧、人聲如沸赃蛛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呕臂。三九已至,卻和暖如春肪跋,著一層夾襖步出監(jiān)牢的瞬間歧蒋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工州既, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谜洽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓吴叶,卻偏偏與公主長得像阐虚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蚌卤,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 什么是高階組件? high-order-function(高階函數(shù))相信大多數(shù)開發(fā)者來說都熟悉,即接受函數(shù)作為參數(shù)...
    哇塞田閱讀 9,078評論 9 23
  • 一实束、mixin 什么是mixin:創(chuàng)造一種類似多重繼承的效果奥秆。事實上,說它是組合更為貼切磕洪。 1.封裝mixin方法...
    南慕瑤閱讀 2,091評論 0 0
  • 高階組件是react應用中很重要的一部分吭练,最大的特點就是重用組件邏輯。它并不是由React API定義出來的功能析显,...
    叫我蘇軾好嗎閱讀 897評論 0 0
  • 前言 學習react已經(jīng)有一段時間了,期間在閱讀官方文檔的基礎上也看了不少文章歹嘹,但感覺對很多東西的理解還是不夠深刻...
    Srtian閱讀 1,653評論 0 7
  • 最后更新時間:2019/05/15以下內(nèi)容來自: React 官網(wǎng)文檔 Robin Wieruch 博客 《The...
    FlOWING_b425閱讀 5,070評論 0 0