摘要:用簡單的話來說,主要是為了更大程度的復用現有代碼,抽離代碼而產生的一個模式高階組件的參數可以為一個組件,通過一個組件再去生成另一個組件用官方的例子來解釋現有一個組件如下就是全局的數據源添加事件處理函數訂閱數據清除事件處理函數任何時候數據發生
用簡單的話來說,主要是為了更大程度的復用現有代碼,抽離代碼而產生的一個模式
高階組件的參數可以為一個組件,通過一個組件再去生成另一個組件
用官方的例子來解釋:
現有一個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
摘要:創建一個普通函數因為的存在所以變成構造函數創建一個方法在方法中,創建一個中間實例對中間實例經過邏輯處理之后返回使用方法創建實例而恰好,高階組件的創建邏輯與使用,與這里的方法完全一致。因為方法其實就是構造函數的高階組件。 很多人寫文章喜歡把問題復雜化,因此當我學習高階組件的時候,查閱到的很多文章都給人一種高階組件高深莫測的感覺。但是事實上卻未必。 有一個詞叫做封裝。相信寫代碼這么久了,大...
摘要:也明確了大數據時代,前端所應該具備的職業素養高階組件高階組件,高階組件就是一個組件包裹著另外一個組件中兩種的實現方法中兩種的實現方法返回的類繼承了。之所以被稱為是因為被繼承了,而不是繼承了。在這種方式中,它們的關系看上去被反轉了。 前言 最近一直再做數據可視化,業務的理解,數據的理解確實如數據可視化要求的一樣,有了更多的理解。但是技術上還停留在echart,Hchart, 畫圖上。正好...
摘要:為了代碼進一步解耦,可以考慮使用高階組件這種模式。開源的高階組件使用提供了一系列使用的高階組件,可以增強組件的行為,可以利用此庫學習高階組件的寫法。通過使用此庫提供的高階組件,可以方便地讓列表元素可拖動。 1. Decorator基本知識 在很多框架和庫中看到它的身影,尤其是React和Redux,還有mobx中,那什么是裝飾器呢。 修飾器(Decorator)是一個函數,用來修改類的...
摘要:高階組件主要又分為屬性代理和反向繼承兩種類型,上述舉例中的函數就屬于屬性代理的類型。記住,高階函數返回的是一個函數,我們只是對其進行了相對應的包裝。 首先在正式的高階組件之前我們先來了解一下函數的類似操作: function hello () { console.log(hello) } function WrapperHello (fn) { return func...
閱讀 2864·2021-11-16 11:55
閱讀 2608·2021-09-29 09:34
閱讀 3404·2021-09-01 14:21
閱讀 3753·2019-08-29 12:36
閱讀 696·2019-08-26 10:55
閱讀 3959·2019-08-26 10:20
閱讀 1026·2019-08-23 18:19
閱讀 1194·2019-08-23 17:56