摘要:現在來看看怎么使用高階組件來達到同樣的目的。在這個新的組件里包含了加強的和等內容。有時會遇到一個提供了的庫,但是你喜歡的是高階組件。我們來根據上面的例子來加一些方法可以讓高階組件和模式可以互相轉換??偨Y,回調繪制和高階組件都是可以互換的。
讓 render-xxx 模式都可以互換。
基礎所有上面提到的三種模式都是為了處理 mixin 要處理的問題的。在我們繼續之前,我們來看一些例子。
如果你已經掌握這兩個概念,可以直接跳過這一節看后面的內容
Render Prop首先,我們來寫一個組件來記錄 count,并繪制 render prop 里的繪制都在 render 方法里調用了。
class CounterComponent extends React.Component { constructor(props) { super(props); this.state = { count: 0 }; } update = type => { if (type === "Inc") { this.setState(({ count }) => ({ count: count + 1 })); } else if (type === "Dec") { this.setState(({ count }) => ({ count: count - 1 })); } }; render() { return this.props.render({ ...this.state, ...this.props, update: this.update }); } }
注意:callback 屬性也可以叫個別的名字,不一定就是 render。只不過這個模式叫做 render prop。
接下來我們需要一個組件來把需要的內容繪制到屏幕上:
const Counter = ({ count, update }) => {{count}; };
Counter組件接受 count 值和一個 update 方法,然后顯示一個增加、一個減少按鈕以及當前的 count 值。
最后我們可以用CounterComponent組件來給Counter增加一些其他的功能:
render(高階組件>} />, document.getElementById("root") );
上文講解了 render prop 模式。現在來看看怎么使用高階組件來達到同樣的目的。
const withCounter = Component => class Hoc extends React.Component { constructor(props) { super(props); this.state = { count: 0 }; } update = type => { if (type === "Inc") { this.setState(({ count }) => ({ count: count + 1 })); } else if (type === "Dec") { this.setState(({ count }) => ({ count: count - 1 })); } }; render() { return} };
看上面的例子,我們可以要把需要繪制的組件放到另外一個全新的組件里面去。在這個新的組件里包含了加強的 state 和 props 等內容。
const CounterExample = withCounter(Counter); render(, document.getElementById("root"));
目前我們已經覆蓋了基本的概念。我們可以使用不同的模式來達到相同的目的。下面我們來關注一下如何讓這幾個模式達到互換的目的。
在 render props 和高階組件之間轉換有的時候你用的庫提供了一個高級組件,但是你最喜歡的是通過JSX的方式來使用組件。有時會遇到一個提供了 render props 的庫,但是你喜歡的是高階組件。一個很有趣的事實是這些模式可以幻想轉換。
我們來根據上面的例子來加一些方法可以讓高階組件和 render props 模式可以互相轉換。
fromHoc: HOC -> RenderProp toHoc: RenderProp -> HOC
toHoc方法可以歸結為:
toHoc: Render => Comp => props => (} /> );
你也可以看使用 Render Props來作為替代實現。
它會把一個 render prop 模式轉化為高階組件。
const withCounter = toHoc(CounterComponent); const CounterExample = withCounter(Counter);
從高階組件轉化為 render prop 有一點麻煩。我們需要把一個 render prop 的組件傳入到高階組件里。多虧了 Brent Jackon 的這篇文章。
fromHoc: hoc => { class Render extends React.Component { render() { return this.props.children(this.props); } } return hoc(Render); };
或者,使用兩外一種不用 class 的方式。這次要感謝 Rodrigo Pombo 的這個例子。
fromHoc: hoc => hoc(props => props.render(props));
我們可以寫一個輕量的 helper 方法來實現高階組件和 renderprops 的轉化。注意,我們也可以在初始化 toHoc 方法的時候使用另外的 render name,因為 render prop 可以能有一個不一樣的名字,或者是一個子 prop。
const iso = { fromHoc: hoc => hoc(props => props.render(props)), toHoc: Render => Compo => props => (總結} /> ) };
Render prop,回調繪制和高階組件都是可以互換的。大多數的時候 render props 可以滿足要求。但是你也可以通過某些方法讓它在這些模式之間互相轉換。
非常感謝 Brent Jackson,Kent C. Dodds 以及 Rodrigo Pombot 提供了fromHoc方法的實現,幫我們解決了不少的問題。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95885.html
摘要:組件渲染首先我們來了解組件返回的虛擬是怎么渲染為真實,來看一下的組件是如何構造的可能我們會想當然地認為組件的構造函數定義將會及其復雜,事實上恰恰相反,的組件定義代碼極少。 前言 首先歡迎大家關注我的掘金賬號和Github博客,也算是對我的一點鼓勵,畢竟寫東西沒法獲得變現,能堅持下去也是靠的是自己的熱情和大家的鼓勵?! ≈胺窒磉^幾篇關于React的文章: React技術內幕: k...
摘要:我們可以通過剛剛高階函數的思想來創建一個中間組件,也就是我們說的高階組件。僅傳遞組件所需要的屬性。在受控組件中,表單數據由組件負責處理。作為頂層組件接收一個名為的,可以接收任意需要被放入中的字符串,數字,甚至是函數。 React組件設計 組件分類 展示組件和容器組件 展示組件 容器組件 關注事物的展示 關注事物如何工作 可能包含展示和容器組件,并且一般會有DOM標簽和cs...
摘要:此時,我將它寫下來討論和分享這些我發現的模式。正確的姿勢應該是通過的方式獲取子組件的一些信息。高階組件是需要另外一個有用的模式依賴注入。也有部分人稱它是一種模式。最直接的方式是通過每一層通過來傳遞。 原文出自:http://krasimirtsonev.com/blog/article/react-js-in-design-patterns 前言 我想找一個好的前端前端框架,找了很久。...
摘要:有狀態組件通常使用和生命周期相關事件。組件模式是使用時的最佳實踐,最初引入組件模式是為了將數據邏輯和表現層進行分離。這是一種可以對輸入組件的進行修改增刪改查然后返回全新的修改后的組件強大模式,想想和。 showImg(https://segmentfault.com/img/bVborAV?w=2560&h=1440); 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著...
閱讀 2894·2021-11-23 09:51
閱讀 3404·2021-11-22 09:34
閱讀 3305·2021-10-27 14:14
閱讀 1504·2019-08-30 15:55
閱讀 3345·2019-08-30 15:54
閱讀 1066·2019-08-30 15:52
閱讀 1888·2019-08-30 12:46
閱讀 2845·2019-08-29 16:11