摘要:作用是給組件增減屬性。如果你的高階組件不需要帶參數(shù),這樣寫也是很的。那么需要建立一個(gè)引用可以對(duì)被裝飾的組件做羞羞的事情了,注意在多個(gè)高階組件裝飾同一個(gè)組件的情況下,此法并不奏效。你拿到的是上一個(gè)高階組件的函數(shù)中臨時(shí)生成的組件。
是什么
簡(jiǎn)稱HOC,全稱 High Order Component。作用是給react組件增減props屬性。
怎么用為什么不先說怎么寫?恩,因?yàn)槟闫鋵?shí)已經(jīng)用過了,舉個(gè)例子:
// App.js import {connect} from "react-redux"; class App extends React.Component { render() {} } export default connect()(App);
熟悉不?redux的連接器。不過筆者有潔癖,喜歡用裝飾器:
// App.js import {connect} from "react-redux"; @connect() export class App extends React.Component { render() {} }開始寫
從connect()()可以看出,connect是一個(gè)函數(shù),返回值是個(gè)react組件。這么聰明,好佩服自己啊。
雛形// myHoc.js import React from "react"; export const myHoc = () => { return (Wrapped) => { class Hoc extends React.Component { render() { return; } } return Hoc; }; };
是的,高階組件的雛形,就是函數(shù)里隱藏了一個(gè)react組件,而參數(shù)Wrapped是什么?就是下面被裝飾的組件:
// App.js @myHoc() export class App extends React.Component { render() {} }
恩恩,表現(xiàn)形式和redux的connect一模一樣。
所以用了高階組件后,export出去的不再是你自己寫的App(Class),而是最后一個(gè)高階。
好的啦,現(xiàn)在用myHoc給App組件加點(diǎn)料:
// myHoc.js export const myHoc = () => { return (Wrapped) => { class Hoc extends React.Component { render() { return; } } return Hoc; }; };
// App.js @myHoc() export class App extends React.Component { render() { return{this.props.whoAmI}; } }
放心,此刻瀏覽器里已經(jīng)把我的名字 原罪 打印出來了。
多個(gè)高階組件是的,寫完一個(gè)hoc之后,你就會(huì)有寫第二個(gè)的需求,那就一起用呢:
// App.js @myHoc() @yourHoc() @hisHoc() @herHoc() export class App extends React.Component { render() { return{this.props.whoAmI}; } }
這就是筆者為啥要用裝飾器的原因,簡(jiǎn)潔,看起來舒服,寫起來快,我們看一下另一種寫法:
class App extends React.Component { render() {} } export default myHoc()(yourHoc()(hisHoc()(herHoc()(App))));
自己體會(huì),格式化一下吧:
class App extends React.Component { render() {} } let hoc; hoc = herHoc()(App); hoc = hisHoc()(hoc); hoc = yourHoc()(hoc); hoc = myHoc()(hoc); export default hoc;
寫得累不?來,給你條毛巾擦擦汗
帶參數(shù)對(duì)了,hoc可以接收參數(shù),比如這樣:
// App.js @myHoc("原罪2號(hào)") export class App extends React.Component { render() { return{this.props.whoAmI}; } }
那高階組件怎么接呢?
// myHoc.js export const myHoc = (name) => { return (Wrapped) => { class Hoc extends React.Component { render() { return; } } return Hoc; }; };
我把hoc接收到的參數(shù)又返還給了App組件,那現(xiàn)在瀏覽器輸出的就是:原罪2號(hào)。
不帶參數(shù)現(xiàn)在,你可能有一個(gè)大膽的插法..哦不,想法,就是@myHoc后面可以不加括號(hào)嗎?是哦,看前面幾個(gè)案例,都是@myHoc()。好的,看我的:
// myHoc.js export const myHoc = (Wrapped) => { class Hoc extends React.Component { render() { return; } } return Hoc; };
// App.js @myHoc export class App extends React.Component { render() { return{this.props.whoAmI}; } }
細(xì)心的看官看一下myHoc.js和帶參數(shù)的時(shí)候有什么區(qū)別。是的,少了一層回調(diào)。如果你的高階組件不需要帶參數(shù),這樣寫也是很ok的。
操控原組件你可能需要拿被裝飾的組件的state數(shù)據(jù)或者執(zhí)行它的方法。那么需要建立一個(gè)引用:
// myHoc.js import React from "react"; export const myHoc = () => { return (Wrapped) => { class Hoc extends React.Component { appRef = null; componentDidMount() { // 可以對(duì)被myHoc裝飾的組件做羞羞的事情了,:) console.log(this.appRef); } render() { return{this.appRef = app}} >; } } return Hoc; }; };
注意: 在多個(gè)高階組件裝飾同一個(gè)組件的情況下,此法并不奏效。你拿到的ref是上一個(gè)高階組件的函數(shù)中臨時(shí)生成的組件。而且在大多數(shù)情況下,你并不知道某個(gè)組件會(huì)被多少個(gè)高階裝飾!
總結(jié)當(dāng)項(xiàng)目中多處用到某個(gè)邏輯方法,但是這個(gè)邏輯不能放到util里的時(shí)候,HOC適合你。一個(gè)HOC最好只做一件事,這樣維護(hù)方便
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95638.html
摘要:為了代碼進(jìn)一步解耦,可以考慮使用高階組件這種模式。開源的高階組件使用提供了一系列使用的高階組件,可以增強(qiáng)組件的行為,可以利用此庫(kù)學(xué)習(xí)高階組件的寫法。通過使用此庫(kù)提供的高階組件,可以方便地讓列表元素可拖動(dòng)。 1. Decorator基本知識(shí) 在很多框架和庫(kù)中看到它的身影,尤其是React和Redux,還有mobx中,那什么是裝飾器呢。 修飾器(Decorator)是一個(gè)函數(shù),用來修改類的...
摘要:因?yàn)楣ぷ髦幸恢痹谑褂?,也一直以來想總結(jié)一下自己關(guān)于的一些知識(shí)經(jīng)驗(yàn)。于是把一些想法慢慢整理書寫下來,做成一本開源免費(fèi)專業(yè)簡(jiǎn)單的入門級(jí)別的小書,提供給社區(qū)。本書的后續(xù)可能會(huì)做成視頻版本,敬請(qǐng)期待。本作品采用署名禁止演繹國(guó)際許可協(xié)議進(jìn)行許可 React.js 小書 本文作者:胡子大哈本文原文:React.js 小書 轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息 在線閱讀:http://huzi...
摘要:總結(jié)其實(shí),這個(gè)和的思想有很大的淵源,不推薦繼承,而是推薦組合,而就是其中的典范。比如我們寫了兩個(gè)個(gè)高階組件,一個(gè)是,一個(gè)是,組件就可以隨意的在和之間隨意切換,而不需要改動(dòng)組件原有代碼。 0x000 概述 高階函數(shù)組件...還是一個(gè)函數(shù),和函數(shù)組件不同的是他返回了一個(gè)完整的組件...他返回了一個(gè)class!??! 0x001 直接上栗子 照常,先寫個(gè)App組件,外部傳入一個(gè)theme ...
手挽手帶你學(xué)React入門四檔,用人話教你react-redux,理解redux架構(gòu),以及運(yùn)用在react中。學(xué)完這一章,你就可以開始自己的react項(xiàng)目了。 之前在思否看到過某個(gè)大神的redux搭建 忘記了大神的名字 這里只記得內(nèi)容了 憑借記憶和當(dāng)時(shí)的學(xué)習(xí)路線寫下本文 隔空感謝 本人學(xué)習(xí)react-redux的時(shí)候遇到了很多坎,特別是不理解為什么這么用,這是什么東西,用來做什么。加上各種名詞讓人...
摘要:動(dòng)手實(shí)現(xiàn)實(shí)現(xiàn)這個(gè)模塊直接創(chuàng)建的函數(shù)考慮到要暴露出去的三個(gè)函數(shù)我們用函數(shù)內(nèi)部的變量來存儲(chǔ)我們的數(shù)據(jù)時(shí)候直接返回當(dāng)前的值就可以了同樣用內(nèi)部變量來存儲(chǔ)訂閱者訂閱者則由函數(shù)添加返回取消訂閱的函數(shù)。則根據(jù)返回新的同時(shí)通知訂閱者執(zhí)行相關(guān)邏輯。 文章地址 實(shí)例回顧 showImg(https://segmentfault.com/img/bVXtft?w=640&h=320); 假如按鈕和界面不在同...
閱讀 2497·2023-04-25 19:24
閱讀 1716·2021-11-11 16:54
閱讀 2842·2021-11-08 13:19
閱讀 3556·2021-10-25 09:45
閱讀 2563·2021-09-13 10:24
閱讀 3293·2021-09-07 10:15
閱讀 4046·2021-09-07 10:14
閱讀 2962·2019-08-30 15:56