摘要:用簡單的話來說,主要是為了更大程度的復(fù)用現(xiàn)有代碼,抽離代碼而產(chǎn)生的一個(gè)模式高階組件的參數(shù)可以為一個(gè)組件,通過一個(gè)組件再去生成另一個(gè)組件用官方的例子來解釋現(xiàn)有一個(gè)組件如下就是全局的數(shù)據(jù)源添加事件處理函數(shù)訂閱數(shù)據(jù)清除事件處理函數(shù)任何時(shí)候數(shù)據(jù)發(fā)生
用簡單的話來說,主要是為了更大程度的復(fù)用現(xiàn)有代碼,抽離代碼而產(chǎn)生的一個(gè)模式
高階組件的參數(shù)可以為一個(gè)組件,通過一個(gè)組件再去生成另一個(gè)組件
用官方的例子來解釋:
現(xiàn)有一個(gè)CommentList組件如下
class CommentList extends React.Component { constructor() { super(); this.handleChange = this.handleChange.bind(this); this.state = { // "DataSource" 就是全局的數(shù)據(jù)源 comments: DataSource.getComments() }; } componentDidMount() { // 添加事件處理函數(shù)訂閱數(shù)據(jù) DataSource.addChangeListener(this.handleChange); } componentWillUnmount() { // 清除事件處理函數(shù) DataSource.removeChangeListener(this.handleChange); } handleChange() { // 任何時(shí)候數(shù)據(jù)發(fā)生改變就更新組件 this.setState({ comments: DataSource.getComments() }); } render() { return ({this.state.comments.map((comment) => (); } }))}
同時(shí)有另一個(gè)BlogPost組件如下:
class BlogPost extends React.Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); this.state = { blogPost: DataSource.getBlogPost(props.id) }; } componentDidMount() { DataSource.addChangeListener(this.handleChange); } componentWillUnmount() { DataSource.removeChangeListener(this.handleChange); } handleChange() { this.setState({ blogPost: DataSource.getBlogPost(this.props.id) }); } render() { return; } }
可以看出這兩個(gè)組件中的結(jié)構(gòu)基本一致,都是通過DataSource接收數(shù)據(jù),然后監(jiān)聽,解除監(jiān)聽,然后渲染
那么我們就可以將公共的部分提取出來,如下:
// 函數(shù)接受一個(gè)組件參數(shù)…… function withSubscription(WrappedComponent, selectData) { // ……返回另一個(gè)新組件…… return class extends React.Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); this.state = { data: selectData(DataSource, props) }; } componentDidMount() { // ……注意訂閱數(shù)據(jù)…… DataSource.addChangeListener(this.handleChange); } componentWillUnmount() { DataSource.removeChangeListener(this.handleChange); } handleChange() { this.setState({ data: selectData(DataSource, this.props) }); } render() { // ……使用最新的數(shù)據(jù)渲染組件 // 注意此處將已有的props屬性傳遞給原組件 return; } }; }
然后就可以通過withSubscription組件來生成新的組件:
const CommentListWithSubscription = withSubscription( CommentList, (DataSource) => DataSource.getComments() ); const BlogPostWithSubscription = withSubscription( BlogPost, (DataSource, props) => DataSource.getBlogPost(props.id) );
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/105034.html
摘要:創(chuàng)建一個(gè)普通函數(shù)因?yàn)榈拇嬖谒宰兂蓸?gòu)造函數(shù)創(chuàng)建一個(gè)方法在方法中,創(chuàng)建一個(gè)中間實(shí)例對(duì)中間實(shí)例經(jīng)過邏輯處理之后返回使用方法創(chuàng)建實(shí)例而恰好,高階組件的創(chuàng)建邏輯與使用,與這里的方法完全一致。因?yàn)榉椒ㄆ鋵?shí)就是構(gòu)造函數(shù)的高階組件。 很多人寫文章喜歡把問題復(fù)雜化,因此當(dāng)我學(xué)習(xí)高階組件的時(shí)候,查閱到的很多文章都給人一種高階組件高深莫測的感覺。但是事實(shí)上卻未必。 有一個(gè)詞叫做封裝。相信寫代碼這么久了,大...
摘要:也明確了大數(shù)據(jù)時(shí)代,前端所應(yīng)該具備的職業(yè)素養(yǎng)高階組件高階組件,高階組件就是一個(gè)組件包裹著另外一個(gè)組件中兩種的實(shí)現(xiàn)方法中兩種的實(shí)現(xiàn)方法返回的類繼承了。之所以被稱為是因?yàn)楸焕^承了,而不是繼承了。在這種方式中,它們的關(guān)系看上去被反轉(zhuǎn)了。 前言 最近一直再做數(shù)據(jù)可視化,業(yè)務(wù)的理解,數(shù)據(jù)的理解確實(shí)如數(shù)據(jù)可視化要求的一樣,有了更多的理解。但是技術(shù)上還停留在echart,Hchart, 畫圖上。正好...
摘要:高階組件高階函數(shù)接收函數(shù)作為輸入,或者輸出另一個(gè)函數(shù)的一類函數(shù)高階組件接收組件作為輸入,輸出一個(gè)新的組件的組件。包含了一系列實(shí)用的高階組件庫拖動(dòng)庫深入理解高階組件其中詳細(xì)介紹了屬性代理和反向繼承的區(qū)別。 React高階組件 高階函數(shù): 接收函數(shù)作為輸入,或者輸出另一個(gè)函數(shù)的一類函數(shù); 高階組件: 接收React組件作為輸入,輸出一個(gè)新的React組件的組件。 高階組件通過包裹一個(gè)新傳入...
摘要:為了代碼進(jìn)一步解耦,可以考慮使用高階組件這種模式。開源的高階組件使用提供了一系列使用的高階組件,可以增強(qiáng)組件的行為,可以利用此庫學(xué)習(xí)高階組件的寫法。通過使用此庫提供的高階組件,可以方便地讓列表元素可拖動(dòng)。 1. Decorator基本知識(shí) 在很多框架和庫中看到它的身影,尤其是React和Redux,還有mobx中,那什么是裝飾器呢。 修飾器(Decorator)是一個(gè)函數(shù),用來修改類的...
摘要:結(jié)語高階函數(shù)對(duì)于初學(xué)者來說可能不太好理解,但當(dāng)你深入其中,了解其中的原理之后,我們可以使用高階函數(shù)來完成很多的工作。 前段時(shí)間在工作中寫Hybrid頁面時(shí)遇到了這樣的一個(gè)場景,公司需要一系列的活動(dòng)組件,在每個(gè)組件注冊(cè)的時(shí)候都需要調(diào)用App端提供的一個(gè)接口。一開始也考慮了幾種方式,包括mixin、組件繼承以及react高階組件。但經(jīng)過了種種衡量,最后選擇使用了高階組件的做法。 1、Mix...
摘要:高階組件主要又分為屬性代理和反向繼承兩種類型,上述舉例中的函數(shù)就屬于屬性代理的類型。記住,高階函數(shù)返回的是一個(gè)函數(shù),我們只是對(duì)其進(jìn)行了相對(duì)應(yīng)的包裝。 首先在正式的高階組件之前我們先來了解一下函數(shù)的類似操作: function hello () { console.log(hello) } function WrapperHello (fn) { return func...
閱讀 2959·2021-11-16 11:55
閱讀 2737·2021-09-29 09:34
閱讀 3732·2021-09-01 14:21
閱讀 3902·2019-08-29 12:36
閱讀 773·2019-08-26 10:55
閱讀 4183·2019-08-26 10:20
閱讀 1109·2019-08-23 18:19
閱讀 1273·2019-08-23 17:56