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