亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
ES6 語法備忘單
箭頭函數(shù)
不帶參數(shù)的函數(shù)
具有單一參數(shù)的函數(shù)
具有多個參數(shù)的函數(shù)
函數(shù)式程式設(shè)計中的柯里化
傳播語法
函數(shù)呼叫中的擴(kuò)充語法
陣列文字中的擴(kuò)充語法
物件文字中的擴(kuò)充語法
#React 中的擴(kuò)充運算子
高階函數(shù)
高階組件
摘要
首頁 CMS教程 &#&按 React 中高階組件的友善介紹

React 中高階組件的友善介紹

Sep 04, 2023 pm 02:01 PM

高階元件(HOC)是 React 中一項有趣的技術(shù),用於重構(gòu)共享幾乎相同邏輯的類似元件。我知道這聽起來很抽象而且很高級。然而,它是一種並非特定於 React 的架構(gòu)模式,因此您可以使用該方法來做很多事情。

例如,您可以使用它向某個組件添加載入指示器,而無需調(diào)整原始組件,或者您可以隱藏組件的屬性以使其不那麼冗長。應(yīng)用程式有很多,我試圖在本教程中介紹其中的大部分。

還有其他幾個教程可以教您有關(guān) HOC 的知識,但其中大多數(shù)都是針對高級 React 開發(fā)人員的。當(dāng)我開始學(xué)習(xí) React 時,我很難理解高階元件的概念以及如何將 HOC 合併到我的專案中以編寫更好的程式碼。本文將解釋您需要了解的 HOC 從頭到孵化的所有內(nèi)容。

概述

本教程分為三個部分。第一部分將介紹高階組件的概念。在這裡,我們將討論在查看高階函數(shù)和 HOC 之前需要了解的語法。第二部分是本系列中最令人興奮的部分,您將看到 HOC 的實際範(fàn)例。我們將使用 HOC 來建立表單、授權(quán)和許多其他事情。

在本教程的第三部分中,我們將更專注於最佳實踐以及實現(xiàn)高階元件時需要考慮的事項。我們也將簡要介紹 React 中程式碼共享的替代模式,例如 Render props。

在開始之前,最好先看看有狀態(tài)元件與無狀態(tài)元件的教學(xué)課程,以便更能理解 React 的元件架構(gòu)。

ES6 語法備忘單

我們很快就會動手。但在此之前,我認(rèn)為您應(yīng)該了解一些事情。我喜歡盡可能使用 ES6 語法,它與 HOC 配合得很好。作為初學(xué)者,HOC 有意義,但某些 ES6 文法卻沒有意義。因此,我建議您先瀏覽一遍本節(jié),稍後您可以再回來參考。

箭頭函數(shù)

箭頭函數(shù)是常規(guī)函數(shù)表達(dá)式,但語法較短。它們最適合非方法函數(shù),這也是我們特別感興趣的。以下是一些幫助您入門的範(fàn)例:

不帶參數(shù)的函數(shù)

/* Functions without parameters */
function () {
    return "This is a function expression";
}

// is equivalent to

() => {
 return "This is an arrow function expression"
}

// or 

() => "Arrow with a shorter syntax"

具有單一參數(shù)的函數(shù)

/* Function with a single parameter */

function (param) {
  return { title: "This function accepts a parameter and returns an object",
          params: param}
}

// is syntax-equivalent to 

param => {
    return { title: "This arrow function accepts a single parameter",
        params: param }
}

具有多個參數(shù)的函數(shù)

/* Function with multiple parameters */

function (param1, param2) {
  return { title: "This function accepts multiple parameters",
          params: [param1,param2]}
}

// is syntax-equivalent to 

(param1, param2) => {
    return {title: "Arrow function with multiple parameters",
    params: [param1, param2]
    }
}

// or

(param1, param2) => ({
      title: "Arrow function with multiple parameters",
    params: [param1, param2]
    })

函數(shù)式程式設(shè)計中的柯里化

雖然這個名字暗示它與流行的印度美食中的一道異國菜餚有關(guān),但事實並非如此??吕锘蓞f(xié)助您將接受多個參數(shù)的函數(shù)分解為一系列一次接受一個參數(shù)的函數(shù)。這是一個例子:

//Usual sum function
const sum = (a, b) => a + b

//Curried sum function 
const curriedSum = function (a) {
    return function (b) {
        return a+b
    }

//Curried sum function using arrow syntax
const curriedSum = a => b => a+b

curriedSum(5)(4)
//9

函數(shù)只接受一個參數(shù),並傳回一個接受另一個參數(shù)的函數(shù),這種情況會持續(xù)到滿足所有參數(shù)為止。

curriedSum
// (a) => (b) => a+b

curriedSum(4)

// (b) => 4+b

curriedSum(4)(5)

//4+5

一個密切相關(guān)的術(shù)語稱為「部分應(yīng)用」。部分應(yīng)用程式透過預(yù)先填入現(xiàn)有函數(shù)的一些參數(shù)來建立新函數(shù)。新建立的函數(shù)的元數(shù)(即參數(shù)數(shù)量)將小於原始函數(shù)的元數(shù)。

傳播語法

擴(kuò)充運算子擴(kuò)充數(shù)組、字串或物件表達(dá)式的內(nèi)容。以下是您可以使用傳播運算子執(zhí)行的操作的清單

函數(shù)呼叫中的擴(kuò)充語法

/*Spread Syntax in Function Calls */
const add = (x,y,z) => x+y+z

const args = [1,2,3]

add(...args) 
// 6

陣列文字中的擴(kuò)充語法

/* Spread in Array Literals */

const twoAndThree = ['two', 'three']; 
const numbers = ['one', ...twoAndThree, 'four', 'five']; 
// ["one", "two", "three", "four", "five"]

物件文字中的擴(kuò)充語法

/* Spread in Object Literals */

const contactName = {
  name: {
    first: "Foo",
    middle: "Lux",
    last: "Bar"
  }
}
const contactData = {
  email: "fooluxbar@example.com",
  phone: "1234567890"
}

const contact = {...contactName, ...contactData}
/* { 
    name: {
        first: "Foo",
        middle: "Lux",
        last: "Bar"
    }
    email: "fooluxbar@example.com"
    phone: "1234567890"
  }
  
*/
        

我個人喜歡三個點可以讓您更輕鬆地將現(xiàn)有道具傳遞給子組件或創(chuàng)建新道具的方式。

#React 中的擴(kuò)充運算子

const ParentComponent = (props) => {
  const newProps = { foo: 'default' };
  
  return (
      <ChildComponent 
  		{...props} {...newProps} 
  	/>
  )
}

現(xiàn)在我們已經(jīng)了解了建構(gòu) HOC 的基本 ES6 語法,讓我們看看它們是什麼。

高階函數(shù)

什麼是高階函數(shù)?維基百科有一個簡單的定義:

在數(shù)學(xué)和計算機(jī)科學(xué)中,高階函數(shù)(也稱為泛函、函數(shù)形式或函子)是一種接受一個或多個函數(shù)作為參數(shù)或返回一個函數(shù)作為其結(jié)果或兩者兼而有之的函數(shù)。

您可能之前以某種形式在 JavaScript 中使用過高階函數(shù),因為這就是 JavaScript 的工作方式。將匿名函數(shù)或回呼作為參數(shù)傳遞或傳回另一個函數(shù)的函數(shù) - 所有這些都屬於高階函數(shù)。下面的程式碼建立了一個本質(zhì)上更高階的計算器函數(shù)。

const calculator = (inputFunction) => 
    	(...args) => {
        
       const resultValue = inputFunction(...args);
       console.log(resultValue);
          
       return resultValue;
        }

const add = (...all) => {
	return all.reduce( (a,b) => a+b,0)	;
  
	}
  
 
const multiply = (...all) => {
  return all.reduce((a,b)=> a*b,1);
 
  }

讓我們更深入地了解這一點。 calculator() 接受一個函數(shù)作為輸入並傳回另一個函數(shù)-這完全符合我們對高階函數(shù)的定義。因為我們使用了剩餘參數(shù)語法,所以傳回的函數(shù)將其所有參數(shù)收集在一個陣列中。

然後,使用傳遞的所有參數(shù)呼叫輸入函數(shù),並將輸出記錄到控制臺。所以計算器是柯里化的高階函數(shù),你可以像這樣使用計算機(jī):

calculator(multiply)(2,4);
// returns 8

calculator(add)(3,6,9,12,15,18); 
// returns 63

插入一個函數(shù),例如 add()multiply() 和任意數(shù)量的參數(shù),以及 calculator()將從那里拿走它。所以計算器是一個擴(kuò)展了 add()multiply() 功能的容器。它使我們能夠在更高或更抽象的層面上處理問題。乍一看,這種方法的好處包括:

  1. 代碼可以在多個函數(shù)中重復(fù)使用。
  2. 您可以在容器級別添加所有算術(shù)運算通用的額外功能。
  3. 更具可讀性,并且能更好地表達(dá)程序員的意圖。

現(xiàn)在我們對高階函數(shù)有了一個很好的了解,讓我們看看高階組件的能力。

高階組件

高階組件是一個接受組件作為參數(shù)并返回該組件的擴(kuò)展版本的函數(shù)。

(InputComponent) => {
    return ExtendedComponent 
    }
    
// or alternatively

InputComponent => ExtendedComponent

擴(kuò)展組件 組成 InputComponent。 ExtendedComponent 就像一個容器。它呈現(xiàn) InputComponent,但因為我們返回一個新組件,所以它添加了一個額外的抽象層。您可以使用此層添加狀態(tài)、行為甚至樣式。如果您愿意,您甚至可以決定根本不渲染 InputComponent — HOC 能夠做到這一點以及更多。

下面的圖片應(yīng)該可以消除混亂(如果有的話)。

React 中高階組件的友好介紹

理論已經(jīng)講完了,讓我們開始看代碼。下面是一個非常簡單的 HOC 示例,它將輸入組件包裝在 <div> 標(biāo)記周圍。從這里開始,我將把 InputComponent 稱為 WrappedComponent,因為這是慣例。不過,您可以隨意命名它。

/* The `with` prefix for the function name is a naming convention.
You can name your function anything you want as long as it's meaningful 
*/

const withGreyBg = WrappedComponent => class NewComponent extends Component {
  
  const bgStyle = {
  		backgroundColor: 'grey',
	};
    
  render() {
    return (
      <div className="wrapper" style={bgStyle}>

        <WrappedComponent {...this.props} />
      </div>
    );
  }
};

const SmallCardWithGreyBg = withGreyBg(SmallCard);
const BigCardWithGreyBg = withGreyBg(BigCard);
const HugeCardWithGreyBg = withGreyBg(HugeCard);

class CardsDemo extends Component {
    render() {
        <SmallCardWithGreyBg {...this.props} />
        <BigCardWithGreyBg {...this.props} />
        <HugeCardWithGreyBg {...this.props />
    }
}

withGreyBg 函數(shù)將一個組件作為輸入并返回一個新組件。我們不是直接組合 Card 組件并將樣式標(biāo)簽附加到每個單獨的組件,而是創(chuàng)建一個 HOC 來實現(xiàn)此目的。高階組件包裝原始組件并在其周圍添加 <div> 標(biāo)簽。需要注意的是,這里你必須手動將 props 分兩層傳遞下去。我們沒有做任何花哨的事情,但這就是正常的 HOC 的樣子。下圖更詳細(xì)地演示了 withGreyBg() 示例。

React 中高階組件的友好介紹

雖然這目前看起來不是特別有用,但好處并不小??紤]這種情況。您正在使用 React 路由器,并且需要保護(hù)某些路由 - 如果用戶未經(jīng)過身份驗證,則對這些路由的所有請求都應(yīng)重定向到 /login。我們可以使用 HOC 來有效管理受保護(hù)的路由,而不是重復(fù)身份驗證代碼。好奇想知道怎么做嗎?我們將在下一個教程中介紹這一點以及更多內(nèi)容。

注意:ECMAScript 中提出了一個稱為裝飾器的功能,可以輕松使用 HOC。但是,它仍然是一個實驗性功能,因此我決定不在本教程中使用它。如果您使用的是 create-react-app,則需要先彈出才能使用裝飾器。如果您運行的是最新版本的 Babel (Babel 7),您所需要做的就是安裝 <em>babel-preset-stage-0</em> 然后將其添加到 webpack.config.dev.js 的插件列表中,如下所示。

// Process JS with Babel.
        {
            test: /\.(js|jsx|mjs)$/,
            include: paths.appSrc,
            loader: require.resolve('babel-loader'),
            options: {
              
              // This is a feature of `babel-loader` for webpack (not Babel itself).
              // It enables caching results in ./node_modules/.cache/babel-loader/
              // directory for faster rebuilds.
              cacheDirectory: true,
              presets: ['stage-0']
        },

摘要

在本教程中,我們學(xué)習(xí)了 HOC 的基本概念。 HOC 是構(gòu)建可重用組件的流行技術(shù)。我們首先討論基本的 ES6 語法,以便您更容易習(xí)慣箭頭函數(shù)并編寫現(xiàn)代 JavaScript 代碼。

然后我們了解了高階函數(shù)及其工作原理。最后,我們接觸了高階組件并從頭開始創(chuàng)建了 HOC。

接下來,我們將通過實際示例介紹不同的 HOC 技術(shù)。在那之前請繼續(xù)關(guān)注。在評論部分分享你的想法。

以上是React 中高階組件的友善介紹的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
如何診斷WordPress引起的高CPU使用 如何診斷WordPress引起的高CPU使用 Jul 06, 2025 am 12:08 AM

WordPress導(dǎo)致服務(wù)器CPU使用率飆升的主要原因包括插件問題、數(shù)據(jù)庫查詢效率低、主題代碼質(zhì)量差或流量激增。 1.首先通過top、htop或控制面板工具確認(rèn)是否為WordPress引起的高負(fù)載;2.進(jìn)入故障排查模式逐步啟用插件排查性能瓶頸,使用QueryMonitor分析插件執(zhí)行情況並刪除或替換低效插件;3.安裝緩存插件、清理冗餘數(shù)據(jù)、分析慢查詢?nèi)照I以優(yōu)化數(shù)據(jù)庫;4.檢查主題是否存在過度加載內(nèi)容、複雜查詢或缺乏緩存機(jī)制等問題,建議用標(biāo)準(zhǔn)主題測試對比並優(yōu)化代碼邏輯。按照上述步驟逐一排查可定位並解

如何在WordPress中縮小JavaScript文件 如何在WordPress中縮小JavaScript文件 Jul 07, 2025 am 01:11 AM

MinifyingJavaScript文件可通過刪除空白、註釋和無用代碼來提升WordPress網(wǎng)站加載速度。 1.使用支持合併壓縮的緩存插件如W3TotalCache,在“Minify”選項中啟用並選擇壓縮模式;2.使用專用壓縮插件如FastVelocityMinify,提供更精細(xì)控制;3.手動壓縮JS文件並通過FTP上傳,適用於熟悉開發(fā)工具的用戶。注意部分主題或插件腳本可能與壓縮功能衝突,啟用後需徹底測試網(wǎng)站功能。

如何以編程方式防止評論垃圾郵件 如何以編程方式防止評論垃圾郵件 Jul 08, 2025 am 12:04 AM

防止評論垃圾信息最有效的方式是通過程序化手段自動識別並攔截。 1.使用驗證碼機(jī)制(如GooglereCAPTCHA或hCaptcha)可有效區(qū)分人類與機(jī)器人,尤其適合公眾網(wǎng)站;2.設(shè)置隱藏字段(Honeypot技術(shù)),利用機(jī)器人自動填寫特性識別垃圾評論,不影響用戶體驗;3.檢查評論內(nèi)容關(guān)鍵詞黑名單,通過敏感詞匹配過濾垃圾信息,需注意避免誤判;4.判斷評論頻率與來源IP,限制單位時間內(nèi)的提交次數(shù)並建立黑名單;5.使用第三方反垃圾服務(wù)(如Akismet、Cloudflare)提升識別準(zhǔn)確性??筛鶕?jù)網(wǎng)站

如何爭取古騰堡大塊的資產(chǎn) 如何爭取古騰堡大塊的資產(chǎn) Jul 09, 2025 am 12:14 AM

在開發(fā)Gutenberg塊時,正確enqueue資產(chǎn)的方法包括:1.使用register_block_type指定editor_script、editor_style和style的路徑;2.在functions.php或插件中通過wp_register_script和wp_register_style註冊資源,並設(shè)置正確的依賴和版本;3.配置構(gòu)建工具輸出合適的模塊格式,並確保路徑一致;4.通過add_theme_support或enqueue_block_assets控制前端樣式的加載邏輯,確保

如何向用戶添加自定義字段 如何向用戶添加自定義字段 Jul 06, 2025 am 12:18 AM

要添加自定義用戶字段需根據(jù)平臺選擇擴(kuò)展方式並註意數(shù)據(jù)驗證與權(quán)限控制。常見做法包括:1.利用數(shù)據(jù)庫額外表或鍵值對結(jié)構(gòu)存儲信息;2.在前端加入輸入框並與後端集成;3.對敏感數(shù)據(jù)進(jìn)行格式校驗和訪問權(quán)限限制;4.更新接口及模板以支持新字段展示與編輯,同時兼顧移動端適配和用戶體驗。

如何添加自定義重寫規(guī)則 如何添加自定義重寫規(guī)則 Jul 08, 2025 am 12:11 AM

在WordPress中添加自定義重寫規(guī)則的關(guān)鍵在於使用add_rewrite_rule函數(shù)並確保規(guī)則正確生效。 1.使用add_rewrite_rule註冊規(guī)則,格式為add_rewrite_rule($regex,$redirect,$after),其中$regex是正則表達(dá)式匹配URL,$redirect指定實際查詢,$after控制規(guī)則位置;2.需通過add_filter添加自定義查詢變量;3.修改後必須刷新固定鏈接設(shè)置;4.建議將規(guī)則放在'top'以避免衝突;5.可藉助插件查看當(dāng)前規(guī)則便於

如何優(yōu)化WordPress機(jī)器人TXT 如何優(yōu)化WordPress機(jī)器人TXT Jul 13, 2025 am 12:37 AM

robots.txt對WordPress網(wǎng)站的SEO至關(guān)重要,能引導(dǎo)搜索引擎抓取行為,避免重複內(nèi)容並提升效率。 1.屏蔽如/wp-admin/、/wp-includes/等系統(tǒng)路徑,但避免誤封/uploads/目錄;2.添加Sitemap路徑如Sitemap:https://yourdomain.com/sitemap.xml以幫助搜索引擎快速發(fā)現(xiàn)站點地圖;3.限制/page/和帶參數(shù)的URL以減少爬蟲浪費,但需注意勿封重要歸檔頁;4.避免常見錯誤如誤封全站、緩存插件影響更新及忽略移動端與子域名配

如何介紹WordPress性能 如何介紹WordPress性能 Jul 07, 2025 am 12:43 AM

1.使用性能分析插件可快速定位問題,如QueryMonitor可查看數(shù)據(jù)庫查詢次數(shù)與PHP錯誤,BlackboxProfiler生成函數(shù)執(zhí)行報告,NewRelic提供服務(wù)器級分析;2.分析PHP執(zhí)行性能需檢查耗時函數(shù)、調(diào)試工具使用及內(nèi)存分配情況,如Xdebug生成火焰圖輔助優(yōu)化;3.監(jiān)控數(shù)據(jù)庫查詢效率可通過慢查詢?nèi)照I與索引檢查,QueryMonitor能列出所有SQL並按時間排序;4.結(jié)合GooglePageSpeedInsights、GTmetrix與WebPageTest等外部工具評估前端加

See all articles