国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React的高階組件詳解

這篇具有很好參考價值的文章主要介紹了React的高階組件詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

React的高階組件

高階組件基本介紹

什么是高階組件呢? 在認識高階組價之前, 我們先來回顧一下什么是高階函數(shù)?

相信很多同學都知道(聽說過?),也用過高階函數(shù)

高階組件和高階函數(shù)它們非常相似的

高階函數(shù)的定義, 至少滿足以下條件之一:

接受一個或多個函數(shù)作為參數(shù);

返回一個新的函數(shù);

JavaScript中比較常見的filter、map、reduce都是高階函數(shù)。


那么什么是高階組件呢?

高階組件的英文是 Higher-Order Components,簡稱為 HOC;

官方的定義: 高階組件是一個參數(shù)為組件,并且返回值為新組件函數(shù);

我們可以進行如下的解析:

首先, 高階組件本身不是一個組件,而是一個函數(shù);

其次,這個函數(shù)的參數(shù)是一個組件,返回值也是一個組件;

演示代碼如下, 我們可以在高階組件內(nèi)部定義一個類組件或者函數(shù)組件作為返回結果

定義類組件返回

// 定義一個高階組件
// 1.高階組件會接收一個組件作為參數(shù)
function hoc(Cpn) {
  
  class NewCpn extends PureComponent {

  }
  
  // 2.并且返回一個新的組件
  return NewCpn
}

定義函數(shù)組件返回

// 定義一個高階組件
// 1.高階組件會接收一個組件作為參數(shù)
function hoc(Cpn) {

  function NewCpn() {

  }

  // 2.并且返回一個新的組件
  return NewCpn
}

高階組件使用過程

高階組件的編寫和調(diào)用過程類似于下面這樣:

// 定義一個高階組件
// 1.高階組件會接收一個組件作為參數(shù)
function hoc(Cpn) {
  class NewCpn extends PureComponent {
    render() {
      return <Cpn/>
    }
  }

  // 2.并且返回一個新的組件
  return NewCpn
}

// 創(chuàng)建一個組件作為參數(shù)
class HelloWorld extends PureComponent {
  render() {
    return <h2>Hello World</h2>
  }
}
// 調(diào)用高階組件會返回一個新的組件
const HelloWorldHOC = hoc(HelloWorld)

export class App extends PureComponent {
  render() {
    return (
      <div>
        {/* 返回的新組件展示到App組件中 */}
        <HelloWorldHOC/>
      </div>
    )
  }
}

高階組件并不是React API的一部分,它是基于React的 組合特性而形成的設計模式;

高階組件在一些React第三方庫中非常常見:

比如redux中的connect;(后續(xù)文章會講到)

比如react-router中的withRouter;(后續(xù)文章會講到)


高階組件應用場景

應用一: props增強

例如我們可以定義一個高階組件, 對傳入的組件進行props增強, 也就是為傳入的組件添加一些參數(shù), 需要注意的是, 如果傳入的組件本身也有傳遞參數(shù)的話, 我們在為組件注入要增強的參數(shù)的同時, 還需要將本身傳遞的參數(shù)也注入進來, 實例代碼如下:

// 定義一個高階組件, 對傳入的組件進行props增強
function enhancedProps(WrapperCpn) {
  class NewComponent extends PureComponent {
    constructor() {
      super()

      this.state = {
        userInfo: {
          name: "chenyq",
          age: 18
        }
      }
    }
    
    render() {
      // 如果組件本身也有傳遞參數(shù), 也需要將參數(shù)添加進來
      return <WrapperCpn {...this.props} {...this.state.userInfo}/>
    }
  }

  return NewComponent
}

// 調(diào)用高階組件, 對組件進行props增強
const Home = enhancedProps(function(props) {
  return <h2>{props.name}-{props.age}</h2>
})
const About = enhancedProps(function(props) {
  return <h2>{props.name}-{props.age}-{props.names}</h2>
})

export class App extends PureComponent {
  render() {
    return (
      <div>
        {/* 展示增強后的組件 */}
        <Home/>
        {/* 本身也有傳遞參數(shù) */}
        <About names={["aaa", "bbb", "ccc"]}/>
      </div>
    )
  }
}

也可以利用高階組件來共享Context

function withTheme(OriginComponment) {
  return (props) => {
    return (
      <ThemeContext.Consumer>
        {
          value => {
            return <OriginComponment {...value} {...props}/>
          }
        }
      </ThemeContext.Consumer>
    )
  }
}

應用二: 渲染判定鑒權

在開發(fā)中,我們可能遇到這樣的場景:

某些頁面是必須用戶登錄成功才能進行進入;

如果用戶沒有登錄成功,那么直接跳轉到登錄頁面;

這個時候,我們就可以使用高階組件來完成鑒權操作:

// 定義一個高階組件, 用于鑒權的操作
function loginAuth(WrapperCpn) {
  return props => {
    // 從本地存儲中獲取token, token有值表示已登錄, 沒有值表示未登錄
    const token = localStorage.getItem("token")
    if(token) {
      return <WrapperCpn {...props}/>
    } else {
      return <h2>請先登錄, 再跳轉到對應的頁面中</h2>
    }
  }
}

const Cart = loginAuth(function() {
  return <h2>購物車頁面</h2>
})

export class App extends PureComponent {
  render() {
    return (
      <div>
        <Cart/>
      </div>
    )
  }
}

高階組件的意義

我們會發(fā)現(xiàn)利用高階組件可以針對某些React代碼進行更加優(yōu)雅的處理。

其實早期的React有提供組件之間的一種復用方式是mixin,目前已經(jīng)不再建議使用:

Mixin 可能會相互依賴,相互耦合,不利于代碼維護;

不同的Mixin中的方法可能會相互沖突;

Mixin非常多時,組件處理起來會比較麻煩,甚至還要為其做相關處理,這樣會給代碼造成滾雪球式的復雜性;

當然,HOC也有自己的一些缺陷:

HOC需要在原組件上進行包裹或者嵌套,如果大量使用HOC,將會產(chǎn)生非常多的嵌套,這讓調(diào)試變得非常困難;

HOC可以劫持props,在不遵守約定的情況下也可能造成沖突;

Hooks的出現(xiàn),是開創(chuàng)性的,它解決了很多React之前的存在的問題

比如this指向問題、比如hoc的嵌套復雜度問題等等;

后續(xù)我還會專門來學習講解hooks相關的知識;文章來源地址http://www.zghlxwxcb.cn/news/detail-789732.html

到了這里,關于React的高階組件詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • React 高階組件(HOC)

    React 高階組件(HOC)

    高階組件不是 React API 的一部分,而是一種用來復用組件邏輯而衍生出來的一種技術。 高階組件就是一個函數(shù),且該函數(shù)接受一個組件作為參數(shù),并返回一個新的組件?;旧?,這是從 React 的組成性質派生的一種模式,我們稱它們?yōu)椤凹儭苯M件, 因為它們可以接受任何動態(tài)

    2024年02月12日
    瀏覽(16)
  • react-高階組件

    react-高階組件

    高階組件( Higher-Order Component,HOC )是一個以 組件作為參數(shù) ,返回一個 新組件 的 函數(shù) 。 高階組件最大的特點就是 復用組件邏輯 高階組件本身并不是 React 的 API,而是React組件的一種設計模式,一種組件重用的 高級技巧 高階組件是一個 函數(shù) ,接收要包裝的組件,返回增

    2024年02月07日
    瀏覽(27)
  • React:高階組件|ref轉發(fā)

    ? ? ? ? 參考文檔:高階組件 – React (reactjs.org) ????????高階組件(Higher-Order Components,簡稱? HOC )是React中用于復用組件邏輯的一種高級技巧。具體而言: 高階組件是參數(shù)為組件,返回值為新組件的函數(shù) 。 ????????組件是將 props 轉換為 UI,而高階組件是將組件轉換

    2024年02月21日
    瀏覽(27)
  • React - 你使用過高階組件嗎

    React - 你使用過高階組件嗎

    難度級別:初級及以上 ????????????????????????????????提問概率:55%? 高階組件并不能單純的說它是一個函數(shù),或是一個組件,在React中,函數(shù)也可以做為一種組件。而高階組件就是將一個組件做為入?yún)?,被傳入一個函數(shù)或者組件中,經(jīng)過一定的加工處理,最

    2024年04月16日
    瀏覽(21)
  • React組件間數(shù)據(jù)傳遞(彈框和高階組件(HOC)特性實現(xiàn))

    React組件間數(shù)據(jù)傳遞(彈框和高階組件(HOC)特性實現(xiàn))

    在現(xiàn)代前端開發(fā)中,React 已經(jīng)成為了最受歡迎的 JavaScript 庫之一。而在復雜的應用中,不同組件之間的數(shù)據(jù)傳遞問題顯得尤為關鍵。在本文中,我們將探討一種高效的方法,即如何利用彈框和高階組件特性來實現(xiàn) React 組件間的數(shù)據(jù)傳遞。我們將通過一個具體的業(yè)務場景來深入

    2024年02月11日
    瀏覽(24)
  • React Native Ref轉發(fā)/Memo緩存/HOC高階組件/Context上下文

    React Native Ref轉發(fā)/Memo緩存/HOC高階組件/Context上下文

    1、使用自定義組件時,實現(xiàn)外層組件對原始組件(TextInput)的操作 外層組件使用 ref 屬性 子組件使用 forwardRef 包裹 2、函數(shù)式組件對外暴露實例方法(cusomFocus) 子組件 父組件如圖一所示 1 、 避免多余渲染 問題:每次點擊按鈕都會導致 InfoView 組件發(fā)生重繪,即使每次 setI

    2024年01月21日
    瀏覽(25)
  • JavaScript 框架比較:Angular、React、Vue.js

    在 Web 開發(fā)領域,JavaScript 提供大量技術??晒┻x擇。其中最典型的三套組合,分別是 MERN、MEAN 和 MEVN。這些首字母相同的選項各自代表不同的技術加工具組合。為了在這些技術棧中做出明智選擇,讓我們先從核心組件聊起,再對各自前端框架(React、Angular 和 Vue)進行簡化比

    2024年01月20日
    瀏覽(36)
  • 前端react入門day02-React中的事件綁定與組件

    前端react入門day02-React中的事件綁定與組件

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動力,如果看完對你有幫助,請留下您的足跡) 目錄 React中的事件綁定 React 基礎事件綁定 使用事件對象參數(shù)? 傳遞自定義參數(shù)? 同時傳遞事件對象和自定義參數(shù)? React中的組件? 組件是什么 React組件 useState? 修改狀態(tài)的規(guī)

    2024年02月06日
    瀏覽(24)
  • 前端react入門day03-react獲取dom與組件通信

    前端react入門day03-react獲取dom與組件通信

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動力,如果看完對你有幫助,請留下您的足跡) 目錄 受控表單綁定? React中獲取DOM 組件通信 父傳子? 父傳子-基礎實現(xiàn) 父傳子-props說明 父傳子 - 特殊的prop children 子傳父? 使用狀態(tài)提升實現(xiàn)兄弟組件通信 使用Context機制跨

    2024年02月01日
    瀏覽(23)
  • 從javascript到vue再到react:前端開發(fā)框架的演變

    從javascript到vue再到react:前端開發(fā)框架的演變

    目錄 JavaScript: 動態(tài)語言的基礎 JavaScript:Web開發(fā)的起點 Vue.js: 漸進式框架的興起 Vue.js:簡潔、高效的前端框架 React.js: 聲明式UI的革新 React.js:強大、靈活的前端框架 演變之路與未來展望 演變過程 當提到前端開發(fā)中的框架時,JavaScript、Vue.js和React.js是三個最常見的名詞。它

    2024年02月07日
    瀏覽(34)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包