亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

React 深入系列2:組件分類(lèi)

fizz / 2830人閱讀

摘要:無(wú)狀態(tài)組件和有狀態(tài)組件無(wú)狀態(tài)組件和有狀態(tài)組件,劃分依據(jù)是根據(jù)組件內(nèi)部是否維護(hù)。展示型組件和容器型組件展示型組件和容器型組件,劃分依據(jù)是根據(jù)組件的職責(zé)。

React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對(duì)React的理解,以及在項(xiàng)目中更加靈活地使用React。

React 組件有很多種分類(lèi)方式,常見(jiàn)的分類(lèi)方式有函數(shù)組件和類(lèi)組件,無(wú)狀態(tài)組件和有狀態(tài)組件,展示型組件和容器型組件。好吧,這又是一篇咬文嚼字的文章。但是,真正把這幾組概念咬清楚、嚼明白后,對(duì)于頁(yè)面的組件劃分、組件之間的解耦是大有裨益的。

函數(shù)組件和類(lèi)組件

函數(shù)組件(Functional Component )和類(lèi)組件(Class Component),劃分依據(jù)是根據(jù)組件的定義方式。函數(shù)組件使用函數(shù)定義組件,類(lèi)組件使用ES6 class定義組件。下面是函數(shù)組件和類(lèi)組件的簡(jiǎn)單示例:

// 函數(shù)組件
function Welcome(props) {
  return 

Hello, {props.name}

; } // 類(lèi)組件 class Welcome extends React.Component { render() { return

Hello, {this.props.name}

; } }

上面的兩種寫(xiě)法是等價(jià)的,但函數(shù)組件的寫(xiě)法要比類(lèi)組件簡(jiǎn)潔,不過(guò)類(lèi)組件比函數(shù)組件功能更加強(qiáng)大。類(lèi)組件可以維護(hù)自身的狀態(tài)變量,即組件的state,類(lèi)組件還有不同的生命周期方法,可以讓開(kāi)發(fā)者能夠在組件的不同階段(掛載、更新、卸載),對(duì)組件做更多的控制。

類(lèi)組件有這么多優(yōu)點(diǎn),是不是我們?cè)陂_(kāi)發(fā)中應(yīng)該首選使用類(lèi)組件呢?其實(shí)不然。函數(shù)組件更加專(zhuān)注和單一,承擔(dān)的職責(zé)也更加清晰,它只是一個(gè)返回React 元素的函數(shù),只關(guān)注對(duì)應(yīng)UI的展現(xiàn)。函數(shù)組件接收外部傳入的props,返回對(duì)應(yīng)UI的DOM描述,僅此而已。當(dāng)然,如上面例子所示,使用只包含一個(gè)render方法的類(lèi)組件,可以實(shí)現(xiàn)和函數(shù)組件相同的效果。但函數(shù)組件的使用可以從思想上迫使你在設(shè)計(jì)組件時(shí)多做思考,更加關(guān)注邏輯和顯示的分離,設(shè)計(jì)出更加合理的頁(yè)面上組件樹(shù)的結(jié)構(gòu)。實(shí)際操作上,當(dāng)一個(gè)組件不需要管理自身狀態(tài)時(shí),可以把它設(shè)計(jì)成函數(shù)組件,當(dāng)你有足夠的理由發(fā)現(xiàn)它需要“升級(jí)”為類(lèi)組件時(shí),再把它改造為類(lèi)組件。因?yàn)楹瘮?shù)組件“升級(jí)”為類(lèi)組件是有一定成本的,這樣就會(huì)要求你做這個(gè)改造前更認(rèn)真地思考其合理性,而不是僅僅為了一時(shí)的方便就使用類(lèi)組件。

無(wú)狀態(tài)組件和有狀態(tài)組件

無(wú)狀態(tài)組件(Stateless Component )和有狀態(tài)組件(Stateful Component),劃分依據(jù)是根據(jù)組件內(nèi)部是否維護(hù)state。無(wú)狀態(tài)組件內(nèi)部不使用state,只根據(jù)外部組件傳入的props返回待渲染的React 元素。有狀態(tài)組件內(nèi)部使用state,維護(hù)自身狀態(tài)的變化,有狀態(tài)組件根據(jù)外部組件傳入的props和自身的state,共同決定最終返回的React 元素。

很容易知道,函數(shù)組件一定是無(wú)狀態(tài)組件,類(lèi)組件則既可以充當(dāng)無(wú)狀態(tài)組件,也可以充當(dāng)有狀態(tài)組件。但如上文所述,當(dāng)一個(gè)組件不需要管理自身狀態(tài)時(shí),也就是無(wú)狀態(tài)組件,應(yīng)該優(yōu)先設(shè)計(jì)為函數(shù)組件。

展示型組件和容器型組件

展示型組件(Presentational Component)和容器型組件(Container Component),劃分依據(jù)是根據(jù)組件的職責(zé)。

展示型組件的職責(zé)是:組件UI長(zhǎng)成什么樣。展示型組件不關(guān)心組件使用的數(shù)據(jù)是如何獲取的,以及組件數(shù)據(jù)應(yīng)該如何修改,它只需要知道有了這些數(shù)據(jù)后,組件UI是什么樣子的即可。外部組件通過(guò)props傳遞給展示型組件所需的數(shù)據(jù)和修改這些數(shù)據(jù)的回調(diào)函數(shù),展示型組件只是它們的使用者。展示型組件一般是無(wú)狀態(tài)組件,不需要state,因?yàn)檎故拘徒M件不需要管理數(shù)據(jù),但當(dāng)展示型組件需要管理自身的UI狀態(tài)時(shí),例如控制組件內(nèi)部彈框的顯示與隱藏,是可以使用state的,這時(shí)的state屬于UI state。既然大部分情況下展示型組件不需要state,應(yīng)該優(yōu)先考慮使用函數(shù)組件實(shí)現(xiàn)展示型組件。

容器型組件的職責(zé)是:組件數(shù)據(jù)如何工作。容器型組件需要知道如何獲取子組件所需數(shù)據(jù),以及這些數(shù)據(jù)的處理邏輯,并把數(shù)據(jù)和邏輯通過(guò)props提供給子組件使用。容器型組件一般是有狀態(tài)組件,因?yàn)樗鼈冃枰芾眄?yè)面所需數(shù)據(jù)。

例如,下面的例子中,UserListContainer是一個(gè)容器型組件,它獲取用戶列表數(shù)據(jù),然后把用戶列表數(shù)據(jù)傳遞給展示型組件UserList,由UserList負(fù)責(zé)UI的展現(xiàn)。

class UserListContainer extends React.Component{
  constructor(props){
    super(props);
    this.state = {
      users: []
    }
  }
  
  componentDidMount() {
    var that = this;
    fetch("/path/to/user-api").then(function(response) {
      response.json().then(function(data) {
        that.setState({users: data})
      });
    });
  }

  render() {
    return (
      
    )
  }
}

function UserList(props) {
  return (
    
    {props.users.map(function(user) { return (
  • {user.name}
  • ); })}
) }

展示型組件和容器型組件是可以互相嵌套的,展示型組件的子組件既可以包含展示型組件,也可以包含容器型組件,容器型組件也是如此。例如,當(dāng)一個(gè)容器型組件承擔(dān)的數(shù)據(jù)管理工作過(guò)于復(fù)雜時(shí),可以在它的子組件中定義新的容器型組件,由新組件分擔(dān)數(shù)據(jù)的管理。展示型組件和容器型組件的劃分完全取決于組件所做的事情。

總結(jié)

通過(guò)上面的介紹,可以發(fā)現(xiàn)這三組概念有很多重疊部分。這三組概念都體現(xiàn)了關(guān)注點(diǎn)分離的思想:UI展現(xiàn)和數(shù)據(jù)邏輯的分離。函數(shù)組件、無(wú)狀態(tài)組件和展示型組件主要關(guān)注UI展現(xiàn),類(lèi)組件、有狀態(tài)組件和容器型組件主要關(guān)注數(shù)據(jù)邏輯。但由于它們的劃分依據(jù)不同,它們并非完全等價(jià)的概念。它們之間的關(guān)聯(lián)關(guān)系可以歸納為:函數(shù)組件一定是無(wú)狀態(tài)組件,展示型組件一般是無(wú)狀態(tài)組件;類(lèi)組件既可以是有狀態(tài)組件,又可以是無(wú)狀態(tài)組件,容器型組件一般是有狀態(tài)組件。

下篇預(yù)告:

React 深入系列3:State 和 Props

我的新書(shū)《React進(jìn)階之路》已上市,請(qǐng)大家多多支持!
鏈接:京東 當(dāng)當(dāng)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/95171.html

相關(guān)文章

  • React 深入系列2:組件分類(lèi)

    摘要:無(wú)狀態(tài)組件和有狀態(tài)組件無(wú)狀態(tài)組件和有狀態(tài)組件,劃分依據(jù)是根據(jù)組件內(nèi)部是否維護(hù)。展示型組件和容器型組件展示型組件和容器型組件,劃分依據(jù)是根據(jù)組件的職責(zé)。 文:徐超,《React進(jìn)階之路》作者授權(quán)發(fā)布,轉(zhuǎn)載請(qǐng)注明作者及出處 React 深入系列2:組件分類(lèi) React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對(duì)React的理解,以及在項(xiàng)目中更加靈活地使...

    Karrdy 評(píng)論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類(lèi)中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類(lèi) - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...

    jsbintask 評(píng)論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁(yè)面加載速度的方法隨筆分類(lèi)中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁(yè)性能管理詳解離線緩存簡(jiǎn)介系列編寫(xiě)高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問(wèn)性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁(yè)面加載速度的方法 隨筆分類(lèi) - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁(yè)性能管理詳解 HTML5 ...

    muddyway 評(píng)論0 收藏0
  • React 深入系列7:React 常用模式

    摘要:本篇是深入系列的最后一篇,將介紹開(kāi)發(fā)應(yīng)用時(shí),經(jīng)常用到的模式,這些模式并非都有官方名稱,所以有些模式的命名并不一定準(zhǔn)確,請(qǐng)讀者主要關(guān)注模式的內(nèi)容。 React 深入系列,深入講解了React中的重點(diǎn)概念、特性和模式等,旨在幫助大家加深對(duì)React的理解,以及在項(xiàng)目中更加靈活地使用React。 本篇是React深入系列的最后一篇,將介紹開(kāi)發(fā)React應(yīng)用時(shí),經(jīng)常用到的模式,這些模式并非都有...

    Chao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<