国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

理解React高階組件

jzman / 1025人閱讀

摘要:用簡單的話來說,主要是為了更大程度的復用現有代碼,抽離代碼而產生的一個模式高階組件的參數可以為一個組件,通過一個組件再去生成另一個組件用官方的例子來解釋現有一個組件如下就是全局的數據源添加事件處理函數訂閱數據清除事件處理函數任何時候數據發生

用簡單的話來說,主要是為了更大程度的復用現有代碼,抽離代碼而產生的一個模式
高階組件的參數可以為一個組件,通過一個組件再去生成另一個組件
用官方的例子來解釋:
現有一個CommentList組件如下

class CommentList extends React.Component {
  constructor() {
    super();
    this.handleChange = this.handleChange.bind(this);
    this.state = {
      // "DataSource" 就是全局的數據源
      comments: DataSource.getComments()
    };
  }

  componentDidMount() {
    // 添加事件處理函數訂閱數據
    DataSource.addChangeListener(this.handleChange);
  }

  componentWillUnmount() {
    // 清除事件處理函數
    DataSource.removeChangeListener(this.handleChange);
  }

  handleChange() {
    // 任何時候數據發生改變就更新組件
    this.setState({
      comments: DataSource.getComments()
    });
  }

  render() {
    return (
      
{this.state.comments.map((comment) => ( ))}
); } }

同時有另一個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 ;
  }
}

可以看出這兩個組件中的結構基本一致,都是通過DataSource接收數據,然后監聽,解除監聽,然后渲染
那么我們就可以將公共的部分提取出來,如下:

// 函數接受一個組件參數……
function withSubscription(WrappedComponent, selectData) {
  // ……返回另一個新組件……
  return class extends React.Component {
    constructor(props) {
      super(props);
      this.handleChange = this.handleChange.bind(this);
      this.state = {
        data: selectData(DataSource, props)
      };
    }

    componentDidMount() {
      // ……注意訂閱數據……
      DataSource.addChangeListener(this.handleChange);
    }

    componentWillUnmount() {
      DataSource.removeChangeListener(this.handleChange);
    }

    handleChange() {
      this.setState({
        data: selectData(DataSource, this.props)
      });
    }

    render() {
      // ……使用最新的數據渲染組件
      // 注意此處將已有的props屬性傳遞給原組件
      return ;
    }
  };
}

然后就可以通過withSubscription組件來生成新的組件:

const CommentListWithSubscription = withSubscription(
  CommentList,
  (DataSource) => DataSource.getComments()
);

const BlogPostWithSubscription = withSubscription(
  BlogPost,
  (DataSource, props) => DataSource.getBlogPost(props.id)
);


文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105034.html

相關文章

  • react進階系列:高階組件詳解(一)

    摘要:創建一個普通函數因為的存在所以變成構造函數創建一個方法在方法中,創建一個中間實例對中間實例經過邏輯處理之后返回使用方法創建實例而恰好,高階組件的創建邏輯與使用,與這里的方法完全一致。因為方法其實就是構造函數的高階組件。 很多人寫文章喜歡把問題復雜化,因此當我學習高階組件的時候,查閱到的很多文章都給人一種高階組件高深莫測的感覺。但是事實上卻未必。 有一個詞叫做封裝。相信寫代碼這么久了,大...

    NervosNetwork 評論0 收藏0
  • 初識react高階組件

    摘要:也明確了大數據時代,前端所應該具備的職業素養高階組件高階組件,高階組件就是一個組件包裹著另外一個組件中兩種的實現方法中兩種的實現方法返回的類繼承了。之所以被稱為是因為被繼承了,而不是繼承了。在這種方式中,它們的關系看上去被反轉了。 前言 最近一直再做數據可視化,業務的理解,數據的理解確實如數據可視化要求的一樣,有了更多的理解。但是技術上還停留在echart,Hchart, 畫圖上。正好...

    IamDLY 評論0 收藏0
  • React高階組件

    摘要:高階組件高階函數接收函數作為輸入,或者輸出另一個函數的一類函數高階組件接收組件作為輸入,輸出一個新的組件的組件。包含了一系列實用的高階組件庫拖動庫深入理解高階組件其中詳細介紹了屬性代理和反向繼承的區別。 React高階組件 高階函數: 接收函數作為輸入,或者輸出另一個函數的一類函數; 高階組件: 接收React組件作為輸入,輸出一個新的React組件的組件。 高階組件通過包裹一個新傳入...

    cncoder 評論0 收藏0
  • 學習es7的Decorator(順帶寫個react高階組件)

    摘要:為了代碼進一步解耦,可以考慮使用高階組件這種模式。開源的高階組件使用提供了一系列使用的高階組件,可以增強組件的行為,可以利用此庫學習高階組件的寫法。通過使用此庫提供的高階組件,可以方便地讓列表元素可拖動。 1. Decorator基本知識 在很多框架和庫中看到它的身影,尤其是React和Redux,還有mobx中,那什么是裝飾器呢。 修飾器(Decorator)是一個函數,用來修改類的...

    xiyang 評論0 收藏0
  • React高階組件

    摘要:結語高階函數對于初學者來說可能不太好理解,但當你深入其中,了解其中的原理之后,我們可以使用高階函數來完成很多的工作。 前段時間在工作中寫Hybrid頁面時遇到了這樣的一個場景,公司需要一系列的活動組件,在每個組件注冊的時候都需要調用App端提供的一個接口。一開始也考慮了幾種方式,包括mixin、組件繼承以及react高階組件。但經過了種種衡量,最后選擇使用了高階組件的做法。 1、Mix...

    ThinkSNS 評論0 收藏0
  • 理解React高階組件(裝飾器)

    摘要:高階組件主要又分為屬性代理和反向繼承兩種類型,上述舉例中的函數就屬于屬性代理的類型。記住,高階函數返回的是一個函數,我們只是對其進行了相對應的包裝。 首先在正式的高階組件之前我們先來了解一下函數的類似操作: function hello () { console.log(hello) } function WrapperHello (fn) { return func...

    frank_fun 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<