淺談 react高階組件-反向繼承

1. 前言

1.不廢話,書接上文react-高階組件參數(shù),只講了,高階組件實(shí)現(xiàn)方式的一種屬性代理
2.接下來講 反向繼承


2. 反向繼承

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


3. 先來個(gè)簡單的繼承 熱身下

1.比如基于請求攔截,響應(yīng)攔截的一些想法
2.搞個(gè) Loading 和關(guān)閉Loading
3.baseURL

3.1 簡要代碼

   class Loading extends React.Component {
            constructor(props) {
                super(props)
                this.state = {
                    baseURL: "http://yzs.com",
                    baseImgURL: "http://yzs.com/img"
                }
            }

            show() {
                console.log("loading")
            }
            hide(){
                console.log("加載完畢")
            }
        }

1.一般腳手架項(xiàng)目也都是繼承自 Component或者pureComponent
2.所以在根組件繼承 下面的組件都具備這個(gè)功能了
3.這也是JS推出 class extends 代替原型鏈的,比如 vue中就是常用原型上掛axios,扯遠(yuǎn)了 O(∩_∩)O哈哈~


3.2 使用

  class Btn extends Loading{
            render() {
                return(
                    <div>
                        <button onClick={this.show}> show </button>
                        <button onClick={this.hide}> hide</button>
                        <h1>{this.state.baseURL}</h1>
                    </div>
                )
            }
        }
        let App = ()=>{
             return(
                 <div>
                    <h1>App</h1>
                    <Btn/>
                </div>
             )
        }
        ReactDOM.render(<App/>,app)

子組件肯定也繼承了父組件的 state,鉤子


4. 高階組件的反向繼承

4.1 子組件

繼承嘛 所以先準(zhǔn)備個(gè)ChildComponent組件 ,用來繼承

    class ChildComponent extends React.Component {
            constructor(props) {
                super(props)
                this.state = { count: 99999 }
            }
            componentDidMount() {
                console.log("演示 反向繼承 子組件 mount");
            }
            // 點(diǎn)擊事件
            clickComponent() {
                console.log("組件被點(diǎn)了");
            }
            render() {
                return (
                    <div>{this.state.count}</div>
                )
            }
        }

1.簡單的state 用來傳遞到子組件
2.簡單的事件,子組件可以調(diào)用
3.簡單的布局,展示數(shù)據(jù)


4.2 高階組件

   const ReverHOC = WrapComponent => {
            return class extends WrapComponent {
                constructor(props) {
                    super(props)
                    this.state = { count: 1000 }
                }
                componentDidMount() {
                    // 反向繼承后,可以拿到原始組件的props和state數(shù)據(jù)
                    console.log("高階組件", this.props, this.state)

                    console.log("高階組件 did mount")
                    this.clickComponent()
                }
                render() {
                    return (
                        // 反向繼承時(shí), MyCom是父組件, 不能在子組件模板中使用父組件標(biāo)簽
                        // return <MyCom/>
                        // 使用 super.render() 渲染父組件模板 
                        <div>
                            <h1 onClick={this.clickComponent}>高階組件</h1>
                            <div>{super.render()}</div>
                        </div>
                    )
                }
            }
        }

1.高階組件有自己的 state
2.反向繼承,也可以獲取原始組件的 props state
3.componentDidMount簡單調(diào)用下,證明可以訪問父組件的函數(shù)
4.布局里面加入點(diǎn)擊事件
5.父組件標(biāo)簽不能在組件使用,所以需要通過來渲染模板

{super.render()}

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

        const HOCView = ReverHOC(ChildComponent)
        let App = () => {
            return (
                <div>
                    <h1>App</h1>
                    <ChildComponent />
                    <HOCView />
                </div>
            )
        }

1.直接使用就行
2.查看效果,點(diǎn)擊測試


5. 高階組件的實(shí)現(xiàn)方式

  1. 屬性代理: 通過創(chuàng)建新組件來包裹原始組件, 把原始組件作為新組件的子組件渲染
    功能: 可實(shí)現(xiàn)對原始組件的 props數(shù)據(jù)更新 和 組件模板更新
  2. 反向繼承: 通過創(chuàng)建新組件繼承自原始組件, 把原始組件作為父組件
    功能: 可實(shí)現(xiàn)對原始組件的state狀態(tài)數(shù)據(jù)更新 和 組件模板更新

6. 渲染劫持

通過高階組件把原始組件的模板進(jìn)行修改和替換
  1. 渲染劫持指對一個(gè)組件渲染內(nèi)容的裝飾或修改, 一般通過高階組件來實(shí)現(xiàn), 把一個(gè)組件傳入高階組件,
    可以對這個(gè)組件的模板進(jìn)行修改后執(zhí)行渲染, 也可以阻止組件渲染,并修改組件中的數(shù)據(jù)和邏輯
    2.渲染劫持的應(yīng)用: 一般用于一些需要登錄狀態(tài)的頁面, 在路由請求渲染頁面(如訂單頁)之前,
    使用高階組件判斷是否已登錄,如果已登錄,返回訂單頁模板, 如果沒有登錄,返回空,并跳轉(zhuǎn)到登錄頁
    3.后續(xù)有空在補(bǔ)充

參考資料

react-高階組件參數(shù)
react-高階組件初識
react-redux 基礎(chǔ)
react-組件總結(jié)
react-高階組件-中文官網(wǎng)


初心

我所有的文章都只是基于入門株旷,初步的了解浇冰;是自己的知識體系梳理,如有錯(cuò)誤,道友們一起溝通交流;
如果能幫助到有緣人,非常的榮幸,一切為了部落的崛起;
共勉
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛾狗,隨后出現(xiàn)的幾起案子兽泄,更是在濱河造成了極大的恐慌搀突,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柳骄,死亡現(xiàn)場離奇詭異团赏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)耐薯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門舔清,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人曲初,你說我怎么就攤上這事体谒。” “怎么了臼婆?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵抒痒,是天一觀的道長。 經(jīng)常有香客問我颁褂,道長故响,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任颁独,我火速辦了婚禮彩届,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘誓酒。我一直安慰自己樟蠕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布丰捷。 她就那樣靜靜地躺著坯墨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪病往。 梳的紋絲不亂的頭發(fā)上捣染,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機(jī)與錄音停巷,去河邊找鬼耍攘。 笑死榕栏,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蕾各。 我是一名探鬼主播扒磁,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼式曲!你這毒婦竟也來了妨托?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤吝羞,失蹤者是張志新(化名)和其女友劉穎兰伤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钧排,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敦腔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恨溜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片符衔。...
    茶點(diǎn)故事閱讀 38,654評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糟袁,靈堂內(nèi)的尸體忽然破棺而出判族,到底是詐尸還是另有隱情,我是刑警寧澤系吭,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布五嫂,位于F島的核電站,受9級特大地震影響肯尺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躯枢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一则吟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锄蹂,春花似錦氓仲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至朝抖,卻和暖如春啥箭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背治宣。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工急侥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砌滞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓坏怪,卻偏偏與公主長得像贝润,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子铝宵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評論 2 349

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