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

React項目開發(fā)中函數(shù)組件與函數(shù)式編程關(guān)系

 更新時間:2023年11月22日 09:47:25   作者:卡頌  
函數(shù)組件和函數(shù)式編程究竟是什么關(guān)系呢?本文會圍繞這個話題展開講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

函數(shù)組件 和 函數(shù)式編程 有關(guān)系么?

長期使用React的同學(xué)應(yīng)該知道,React中存在兩種組件:

  • Class Component,類組件                                                                           
  • Function Component,函數(shù)組件

既然提到函數(shù),那么很自然的,我們會進(jìn)一步思考:

  • 類組件和OOP(面向?qū)ο缶幊蹋┯嘘P(guān)系么?
  • 函數(shù)組件和FP(函數(shù)式編程)有關(guān)系么?

畢竟,如果類組件和OOP有關(guān),那么OOP中的思想(繼承、封裝、多態(tài)...)也能指導(dǎo)類組件的業(yè)務(wù)開發(fā)(函數(shù)組件與FP的關(guān)系同理)。換言之,我們可以直接用這些編程范式的最佳實踐指導(dǎo)React項目開發(fā)。

編程范式與DSL

首先,我們應(yīng)該明確,框架語法本質(zhì)是一種DSL(領(lǐng)域相關(guān)語言),他是為了某個特定領(lǐng)域的開發(fā)量身定制的。

比如,React作為一款針對view開發(fā)DSL,雖然不同的view使用的框架不同,比如:

  • 對于web,框架為ReactDOM
  • 對于小程序,框架為Taro
  • 對于原生開發(fā),字節(jié)內(nèi)部有個叫React Lynx的框架

但這些框架都大體遵循同一套DSLReact語法),這套DSL并不屬于某一種編程范式,而應(yīng)該被視為不同編程范式中,更符合view開發(fā)的語言特性的集合。

所以,作為React DSL的一部分,函數(shù)組件可以體現(xiàn)OOP的思想,類組件也能體現(xiàn)FP的思想。只要這些思想有利于view開發(fā),就可以納入DSL的語法中。

比如,下面的函數(shù)組件Header,是由WelcomeMessageLogoutButton組件組合而成,這是OOP中的組合優(yōu)于繼承思想:

function Header(props) {
  return (
    <div>
      <WelcomeMessage name={props.name} />
      <LogoutButton onClick={props.onLogout} />
    </div>
  );
}

再比如,下面的類組件Cpn中,要改變狀態(tài)count,并不是通過突變(類似this.state.count++),而是調(diào)用this.setState,傳入不可變數(shù)據(jù):

class Cpn extends React.Component {
  // ...
  onClick() {
    const count = this.state.count;
    this.setState({count: count + 1});
  }
  render() {
    // ...
  }
}

使用不可變數(shù)據(jù)屬于FP中的思想。

所以,當(dāng)我們要深入了解某個React特性時,應(yīng)該以如下順序遞進(jìn)的思考:

  • React的開發(fā)理念是什么?
  • 為了實現(xiàn)這套理念,吸收了哪些編程范式中的思想
  • 這些思想如何在React中落地

如果我們用上述思考過程研究函數(shù)組件與函數(shù)式編程的關(guān)系,會發(fā)現(xiàn):

  • 函數(shù)組件屬于落地的產(chǎn)物(上述思考的第三步)
  • 函數(shù)式編程屬于編程范式(上述思考的第二步)

這就是兩者的關(guān)系 —— 函數(shù)組件屬于多種編程范式(主要是OOPFP)在React中最終的落地產(chǎn)物,其中借鑒了一部分FP的思想。

我們不應(yīng)該將函數(shù)組件單純視為FPReact中的具象體現(xiàn)。

那么,函數(shù)組件究竟是如何演進(jìn)而來的呢?

函數(shù)組件的演進(jìn)

讓我們按照上述三步演進(jìn)順序思考。首先,React的開發(fā)理念踐行了如下公式(即:UI是數(shù)據(jù)快照經(jīng)過函數(shù)映射而來):

UI = fn(snapshot)

要落地這個理念,有兩個要素需要實現(xiàn):

  • 數(shù)據(jù)快照
  • 函數(shù)映射

在這里,FP不可變數(shù)據(jù)更適合作為數(shù)據(jù)快照的載體,所以React中狀態(tài)是不可變的,因為狀態(tài)的本質(zhì)是快照。

函數(shù)映射的載體則沒有特殊要求。在React中,每次觸發(fā)更新,所有組件都會重新render,render的過程就是函數(shù)映射的過程,輸入是propsstate,輸出是JSX。

React相對的,Vue中組件則更符合OOP的理念,考慮如下App組件:

const App = {
  setup(initialProps) {
    const count = reactive({count: 0})
    const add = () => { count.value++ }
    return {count, add}
  }
  template: "...省略"
}

組件的setup方法只會在初始化時執(zhí)行一次,后續(xù)觸發(fā)更新時操作的都是同一個閉包中的數(shù)據(jù)。這里面的閉包就是OOP思想中的實例。

既然React函數(shù)映射的載體沒有特殊要求,那么類組件、函數(shù)組件都是可以的。

那為什么函數(shù)組件最終替代了類組件成為React開發(fā)的主流呢?很多同學(xué)認(rèn)為函數(shù)組件的Hooks可以更好的復(fù)用邏輯這一點,是函數(shù)組件優(yōu)于類組件的主要原因。

但實際上,基于裝飾器的類開發(fā)模式早已被驗證是優(yōu)秀的邏輯復(fù)用模式,類組件配合TS裝飾器的模式是行得通的。

主要原因還是 —— 函數(shù)組件能夠更好的落地UI = fn(snapshot)這一理念。

剛才說過,公式中的snapshot快照的含義。在React中,快照主要包括三類數(shù)據(jù):

  • state
  • props
  • context

對于同一個組件,根據(jù)公式UI = fn(snapshot),相同的快照輸入應(yīng)該獲得相同輸出(JSX)。

但狀態(tài)更新也可能觸發(fā)副作用,比如請求數(shù)據(jù)、操作DOM...

在類組件中,這些副作用邏輯被分散在各個生命周期鉤子函數(shù)中,React無法掌控。

而在函數(shù)組件中:

  • 副作用受限在useEffect中。每次render,React都會保證上次的副作用效果已經(jīng)被清除(通過useEffect回調(diào)的返回值函數(shù))
  • ref的傳播也需要借由forwardRef,這進(jìn)一步限制了ref可能的影響范圍
  • 數(shù)據(jù)請求的副作用被交給Suspense處理,考慮下面組件:
function UserList({id}) {
  // 異步請求數(shù)據(jù)
  const data = use(fetchUser(id));
  // ...
}

使用時:

<Suspense fallback={<div>加載中...</div>}>
  <UserList id={1}/>
</Suspense>

總而言之,使用函數(shù)組件時,所有副作用都處于一種受到管控的狀態(tài),可以盡可能保證每次更新時相同的快照輸入,獲得相同的JSX輸出,所以函數(shù)組件在React中才會發(fā)揚光大。

同時,這也契合了FP中的純函數(shù)思想。

總結(jié)

函數(shù)組件并不是函數(shù)式編程React中的具體實現(xiàn),而是React的設(shè)計理念UI = fn(snapshot)落地的最好載體。

React中,還吸收了其他編程范式中的優(yōu)秀思想。FP只是其中影響React最深的一種。畢竟,一切落地都是為了踐行最初的設(shè)計理念。

以上就是React項目開發(fā)中函數(shù)組件與函數(shù)式編程關(guān)系的詳細(xì)內(nèi)容,更多關(guān)于React函數(shù)組件函數(shù)式編程的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在React中實現(xiàn)分塊導(dǎo)出大量數(shù)據(jù)表格并壓縮成圖片的解決方案

    在React中實現(xiàn)分塊導(dǎo)出大量數(shù)據(jù)表格并壓縮成圖片的解決方案

    在現(xiàn)代Web開發(fā)中,處理和展示大量數(shù)據(jù)是一個常見的挑戰(zhàn),特別是在使用React框架時,我們經(jīng)常需要將這些數(shù)據(jù)以表格的形式展示,并提供導(dǎo)出功能,本文將介紹如何在React中實現(xiàn)一個高效、分塊導(dǎo)出大量數(shù)據(jù)表格,并將其壓縮為圖片的解決方案,需要的朋友可以參考下
    2024-12-12
  • React實現(xiàn)單向數(shù)據(jù)流的方法

    React實現(xiàn)單向數(shù)據(jù)流的方法

    本文主要介紹了React實現(xiàn)單向數(shù)據(jù)流的方法
    2023-04-04
  • reset.css瀏覽器默認(rèn)樣式表重置(user?agent?stylesheet)的示例代碼

    reset.css瀏覽器默認(rèn)樣式表重置(user?agent?stylesheet)的示例代碼

    這篇文章主要介紹了reset.css瀏覽器默認(rèn)樣式表重置(user?agent?stylesheet),本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-12-12
  • 基于React實現(xiàn)一個todo打勾效果

    基于React實現(xiàn)一個todo打勾效果

    這篇文章主要為大家詳細(xì)介紹了如何基于React實現(xiàn)一個todo打勾效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • react配置webpack-bundle-analyzer項目優(yōu)化踩坑記錄

    react配置webpack-bundle-analyzer項目優(yōu)化踩坑記錄

    這篇文章主要介紹了react配置webpack-bundle-analyzer項目優(yōu)化踩坑記錄,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • React中g(shù)etDefaultProps的使用小結(jié)

    React中g(shù)etDefaultProps的使用小結(jié)

    React中的getDefaultProps功能允許開發(fā)者為類組件定義默認(rèn)屬性,提高組件的靈活性和容錯性,本文介紹了getDefaultProps的作用、語法以及最佳實踐,并探討了其他替代方案,如函數(shù)組件中的默認(rèn)參數(shù)、高階組件和ContextAPI等,理解這些概念有助于提升代碼的可維護(hù)性和用戶體驗
    2024-09-09
  • React Fiber樹的構(gòu)建和替換過程講解

    React Fiber樹的構(gòu)建和替換過程講解

    React Fiber樹的創(chuàng)建和替換過程運用了雙緩存技術(shù),直接將舊的 fiber 樹替換成新的 fiber 樹,這樣做的好處是省去了直接在頁面上渲染時的計算時間,避免計算量大導(dǎo)致的白屏、卡頓,現(xiàn)在你一定還不太理解,下面進(jìn)行詳細(xì)講解,需要的朋友可以參考下
    2022-12-12
  • React Hooks與setInterval的踩坑問題小結(jié)

    React Hooks與setInterval的踩坑問題小結(jié)

    本文主要介紹了React Hooks與setInterval的踩坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • React18的useEffect執(zhí)行兩次如何應(yīng)對

    React18的useEffect執(zhí)行兩次如何應(yīng)對

    這篇文章主要給大家介紹了關(guān)于React18的useEffect執(zhí)行兩次如何應(yīng)對的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用React具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • React中項目路由配置與跳轉(zhuǎn)方法詳解

    React中項目路由配置與跳轉(zhuǎn)方法詳解

    這篇文章主要為大家詳細(xì)介紹了React中項目路由配置與跳轉(zhuǎn)方法的相關(guān)資料,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以了解一下
    2023-08-08

最新評論

中山市| 老河口市| 平和县| 西峡县| 梁河县| 会昌县| 太和县| 丰都县| 自贡市| 文化| 三台县| 田阳县| 昌图县| 红原县| 天祝| 沂水县| 夏河县| 南靖县| 都安| 广水市| 德令哈市| 葵青区| 乐山市| 周宁县| 潍坊市| 重庆市| 朝阳县| 大新县| 阳泉市| 桦南县| 慈溪市| 阿尔山市| 庆元县| 南城县| 涡阳县| 萍乡市| 东光县| 韩城市| 黑山县| 凤山县| 崇礼县|