最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React HOC高階組件深入講解

 更新時間:2022年10月14日 08:43:48   作者:愛思考的豬  
高階組件就是接受一個組件作為參數(shù)并返回一個新組件(功能增強的組件)的函數(shù)。這里需要注意高階組件是一個函數(shù),并不是組件,這一點一定要注意,本文給大家分享React 高階組件HOC使用小結(jié),一起看看吧

1. 概念

高階組件和高階函數(shù)的類似,使用函數(shù)接收一個組件,并返回一個組件。

function withList(WrapComponent) {
  return class extends Component {
    render() {
      return <div><WrapComponent {...this.props}/></div>;
    }
  }
};

高階組件主要用作于邏輯的封裝、攔截渲染、攔截生命周期:獲取渲染性能,日志打點等,安按照實現(xiàn)方式可以分為屬性代理和反向繼承兩種。

2. 屬性代理

屬性代理的作用:

  • 代理props
  • 條件渲染
  • 添加狀態(tài)(state)
  • 封裝一些通用的邏輯

2.1 代理props

function withList(WrapComponent) {
  const data = [{ id: '1', text: '測試1' }, { id: '2', text: '測試2' }, { id: '3', text: '測試3' }, { id: '4', text: '測試4' }, { id: '5', text: '測試5' }]
  return class extends Component {
    render() {
      return <div>
        {this.props.data.length > 0 ? <WrapComponent {...this.props} data={data} /> : <span>{emptyText}</span>}
      </div>;
    }
  }
};
class List extends Component {
  render() {
    return (
      <ul>
        {this.props.data.map(item => {
          return <li key={item.id}>{item.text}</li>
        })}
      </ul>
    )
  }
};
export default withList(List);

2.2 條件渲染

function withList(WrapComponent, emptyText) {
  return class extends Component {
    render() {
      return <div>
        {this.props.data.length>0 ? <WrapComponent {...this.props}/> : <span>{emptyText}</span>}
      </div>;
    }
  }
};
 class List extends Component {
  render() {
    return (
      <ul>
        {this.props.data.map(item => {
          return <li key={item.id}>{item.text}</li>
        })}
      </ul>
    )
  }
};
export default withList(List,'暫無數(shù)據(jù)');

2.3 添加狀態(tài)

利用這一點可以將非受控組件轉(zhuǎn)為受控組件

import React, { Component } from 'react'
class Input extends Component {
  render() {
    return (
      <input value={this.props.value} />
    )
  }
};
function withInput(WrapComponent) {
  return class extends Component {
    state = {
      value: this.props.value
    }
    onChange = (value) => {
      this.setState({ value });
    }
    render() {
      return <WrapComponent {...this.props} value={this.state.value} onChange={this.onChange}/>;
    }
  }
};
export default withInput(Input);

3. 反向繼承

  • 反向繼承的作用
  • 攔截渲染
  • 代理props
  • 劫持生命周期函數(shù)
  • 操作state
  • 修改react樹

3.1 攔截渲染

function withList(WrapComponent) {
  return class extends WrapComponent {
    render() {
      return <div>
        <span>通過反向繼承攔截渲染</span>
        {super.render()}
      </div>;
    }
  }
};

3.2 劫持生命周期

function withList(WrapComponent) {
  return class extends WrapComponent {
    componentDidMount(){
      if(super.componentDidMount){
        super.componentDidMount.apply(this);
      };
      console.log('攔截生命周期');
    }
    render() {
      return <div>
        <span>通過反向繼承攔截渲染</span>
        {super.render()}
      </div>;
    }
  }
};

3.3 操作state

import React, { Component } from 'react';
function withList(WrapComponent) {
  return class extends WrapComponent {
    constructor(props) {
      super(props);
      this.state.data = []; //將列表數(shù)據(jù)置空
    }
    render() {
      return <div>{super.render()}</div>
    }
  }
};
class List extends Component {
  state = {
    data: [{ id: '1', text: '測試1' }, { id: '2', text: '測試2' }, { id: '3', text: '測試3' }, { id: '4', text: '測試4' }, { id: '5', text: '測試5' }],
  }
  render() {
    return (
      <ul>
        {this.state.data.map(item => {
          return <li key={item.id}>{item.text}</li>
        })}
      </ul>
    )
  }
};
export default withList(List);

3.4 修改react樹

import React, { Component } from 'react';
function withList(WrapComponent) {
  return class extends WrapComponent {
    render() {
      const tree = super.render();
      let newProps = { ...tree.props };
      if (tree.type === 'ul') {
        newProps.value = 'value';
      }
      return React.cloneElement(tree, newProps, newProps.children);
    }
  }
};
class List extends Component {
  render() {
    return (
      <ul>
        {this.props.data.map(item => {
          return <li key={item.id}>{item.text}</li>
        })}
      </ul>
    )
  }
};
export default withList(List);

3.5 記錄渲染性能

function withTime(WrapComponent) {
  return class extends WrapComponent {
    constructor(props) {
      super(props);
      this.start = 0;
      this.end = 0
    }
    componentWillMount() {
      if (super.componentWillMount) {
        super.componentWillMount.call(this);
      };
      this.start = Date.now();
    }
    componentDidMount() {
      if (super.componentDidMount) {
        super.componentDidMount.call(this);
      };
      this.end = Date.now();
      console.log(`渲染的時間為:${(this.end - this.start) / 1000}秒`)
    }
    render() {
      return super.render();
    }
  }
};

4. 使用裝飾器

4.1 安裝和配置

首先執(zhí)行npm run eject暴露出webpack配置,然后安裝裝飾器插件

yarn add  @babel/plugin-proposal-decoreators;

最后在package.json中的babel配置中添加一下配置然后重新項目

  "babel": {
    "presets": [
      "react-app"
    ],
    "plugins":[
      [
        "@babel/plugin-proposal-decorators",
        {"legacy":true}
      ]
    ]
  }

配置完之后如果有報紅需要配置一下:

文件-> 首選項 -> 搜索 ExperimentalDecorators 勾選上之后紅線就消失了

4.2 使用

@withList
class List extends Component {
  render() {
    return (
      <ul>
        {this.props.data.map(item => {
          return <li key={item.id}>{item.text}</li>
        })}
      </ul>
    )
  }
};

5.總結(jié)

  • 高階組件的作用有代復(fù)用、代理屬性、攔截渲染、劫持生命周期
  • 反向繼承能直接操作和攔截組件的state和生命周期,功能比屬性代理更加強大

到此這篇關(guān)于React HOC高階組件深入講解的文章就介紹到這了,更多相關(guān)React HOC 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React實現(xiàn)Excel文件的導(dǎo)出與在線預(yù)覽功能

    React實現(xiàn)Excel文件的導(dǎo)出與在線預(yù)覽功能

    這篇文章主要為大家詳細介紹了如何利用?React?18?的強大功能,演示如何使用?React?18?編寫?Excel?文件的導(dǎo)出與在線預(yù)覽功能,需要的小伙伴可以參考下
    2023-12-12
  • 詳解Ant Design of React的安裝和使用方法

    詳解Ant Design of React的安裝和使用方法

    這篇文章主要介紹了詳解Ant Design of React的安裝和使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • React中useRef與useState的使用與區(qū)別

    React中useRef與useState的使用與區(qū)別

    本文介紹了React中兩個常用的鉤子useRef和useState,包含比較它們的功能并提供示例來說明它們的用法,具有一定的參考價值,感興趣的可以了解一下
    2024-11-11
  • React實現(xiàn)組件間通信的幾種方式小結(jié)

    React實現(xiàn)組件間通信的幾種方式小結(jié)

    在React應(yīng)用中,組件間的通信是一個基礎(chǔ)而關(guān)鍵的概念,理解和掌握不同組件之間的通信方式,可以幫助我們構(gòu)建出更加模塊化、可維護和可擴展的應(yīng)用程序,React提供了多種組件通信的方法,本文給大家詳細的介紹了這些方法,需要的朋友可以參考下
    2024-07-07
  • 手挽手帶你學React之React-router4.x的使用

    手挽手帶你學React之React-router4.x的使用

    這篇文章主要介紹了手挽手帶你學React之React-router4.x的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-02-02
  • Vite+React+TypeScript手擼TodoList的項目實踐

    Vite+React+TypeScript手擼TodoList的項目實踐

    本文主要介紹了Vite+React+TypeScript手擼TodoList的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • 詳解React中key的作用

    詳解React中key的作用

    這篇文章主要介紹了React中key的作用,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下
    2021-04-04
  • react+antd.3x實現(xiàn)ip輸入框

    react+antd.3x實現(xiàn)ip輸入框

    這篇文章主要為大家詳細介紹了react+antd.3x實現(xiàn)ip輸入框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • react-router4 配合webpack require.ensure 實現(xiàn)異步加載的示例

    react-router4 配合webpack require.ensure 實現(xiàn)異步加載的示例

    本篇文章主要介紹了react-router4 配合webpack require.ensure 實現(xiàn)異步加載的示例,非常具有實用價值,需要的朋友可以參考下
    2018-01-01
  • 如何解決React useEffect鉤子帶來的無限循環(huán)問題

    如何解決React useEffect鉤子帶來的無限循環(huán)問題

    本文主要介紹了解決React useEffect鉤子帶來的無限循環(huán)問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07

最新評論

贡觉县| 华池县| 义马市| 平利县| 德清县| 绩溪县| 留坝县| 纳雍县| 师宗县| 昆明市| 普兰县| 万载县| 都安| 宿州市| 阿荣旗| 湖口县| 怀仁县| 容城县| 登封市| 石河子市| 尼玛县| 扎兰屯市| 玉树县| 哈巴河县| 禹城市| 水富县| 涿州市| 阿坝| 萨迦县| 读书| 姜堰市| 莒南县| 咸宁市| 龙南县| 昭苏县| 富源县| 肥乡县| 客服| 赫章县| 文成县| 巴青县|