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

React如何創(chuàng)建組件

 更新時(shí)間:2021年06月27日 15:29:34   作者:小和山的菜鳥們  
本文我們將介紹 React中組件的類別,以及如何創(chuàng)建和使用組件。具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

這節(jié)我們將介紹 React 中組件的類別,以及如何創(chuàng)建和使用組件。

本文會向你介紹以下內(nèi)容:

  • 創(chuàng)建類組件
  • 創(chuàng)建函數(shù)組件
  • 渲染組件
  • 合成組件
  • 提取組件
  • Props 是只讀的

組件介紹

組件(Components) 讓你可以將用戶界面分成獨(dú)立的,可復(fù)用的小部件,并可以對每個(gè)部件進(jìn)行單獨(dú)的設(shè)計(jì)。

從定義上來說, 組件就像JavaScript的函數(shù)。組件可以接收任意輸入(稱為”props”), 并返回 React 元素,用以描述屏幕顯示內(nèi)容。

Props , 即屬性(Property), 在代碼中寫作 props,故可用 props 指代 properties。
react中有兩種組件:類組件(class components)、函數(shù)組件(function components)

創(chuàng)建類組件

類組件的定義有如下要求:

  • 類組件需要繼承自 React.Component
  • 類組件必須實(shí)現(xiàn)render函數(shù)

在ES6之前,可以通過create-react-class 模塊來定義類組件,但是目前官網(wǎng)建議我們使用ES6的class類定義。

使用class定義一個(gè)組件:

class App extends Component {
  constructor() {
    super()
    this.state = {}
  }

  render() {
    return <h2>Hello App</h2>
  }
}

我們來詳細(xì)分析一下類組件有哪幾個(gè)部分

  • constructor:這是類組件的構(gòu)造函數(shù),是可選的,我們通常在constructor中初始化一些數(shù)據(jù);
  • this.state:我們在constructor中給類組件加入state屬性,你可以理解為組件中有一個(gè)state對象,其中包含著各種屬性,用于維護(hù)組件內(nèi)部的數(shù)據(jù)。同時(shí)你可以通過this.state.<屬性名>訪問該屬性;
  • render(): 該方法是 class 組件中唯一必須實(shí)現(xiàn)的方法,類組件通過render()返回組件的顯示內(nèi)容;

關(guān)于 state

我們可以通過this.state給類組件添加數(shù)據(jù)對象,我們可以通過this.state.<屬性名>去訪問我們setState中的屬性。

constructor(props) {
    super(props);
    this.state = {
      name:"xhs-rookies"
    }
  }

render(){
    return <h2>{this.state.name}</h2>
  }

但是我們想要修改上述例子中的name屬性的時(shí)候,則必須通過react給我們規(guī)定好的setState()方法,去給state添加或者修改其中的數(shù)值。

this.state.name = 'new xhs-rookies' //錯(cuò)誤的方式,不允許采用
this.setState({ name: 'new xhs-rookies' }) //正確的方式

簡單點(diǎn)來說,在 react 中頁面是通過數(shù)據(jù)進(jìn)行渲染,使用setState()更新的數(shù)據(jù),react 會幫我們執(zhí)行render()去更新頁面,從而將頁面中用到 state 中的數(shù)據(jù)全部更新。

關(guān)于 render

當(dāng) render 被調(diào)用時(shí),它會檢查 this.props 和 this.state 的變化并返回很多類型,很多時(shí)候我們選擇讓該方法返回 React 元素,然后交由 React 去渲染展示:

React 元素:

  • 通常通過 JSX 創(chuàng)建。
  • 例如,<div/> 會被 React 渲染為 DOM 節(jié)點(diǎn),<MyComponent/> 會被 React 渲染為自定義組件;
  • 無論是 <div/> 還是 <MyComponent/> 均為 React 元素。

詳細(xì)關(guān)于 render() 方法的內(nèi)容請見React.Component - Render)

創(chuàng)建函數(shù)組件

函數(shù)組件是使用 function 來進(jìn)行定義的函數(shù),只是這個(gè)函數(shù)會返回和類組件中 render 函數(shù)返回一樣的內(nèi)容。

跟類組件相比,函數(shù)組件有自己的特點(diǎn):

  • 沒有生命周期,也會被更新并掛載,但是沒有生命周期函數(shù);
  • 沒有 this(組件實(shí)例);
  • 沒有內(nèi)部狀態(tài)(state);

我們來定義一個(gè)函數(shù)組件:

export default function App() {
  return <div>xhs rookies</div>
}

渲染組件

在前幾篇中, 我們只遇到代表 DOM 標(biāo)簽的 React 元素:

const element = <div />

然而,元素也可以代表用戶定義的組件:

const element = <Welcome name="xhs rookies" />

當(dāng) React 遇到一個(gè)代表用戶定義組件的元素時(shí),它將 JSX 屬性以一個(gè)單獨(dú)對象的形式傳遞給相應(yīng)的組件。 我們將其稱為 “props” 對象。

比如, 以下代碼在頁面上渲染“xhs rookies”:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>
}

const element = <Welcome name="xhs rookies" />
ReactDOM.render(element, document.getElementById('root'))

我們簡單解釋一下上面這個(gè)例子:

  • 我們調(diào)用了 ReactDOM.render() 方法并向其中傳入了 <Welcome name="xhs rookies" /> 元素。
  • React 調(diào)用 Welcome 組件,并向其中傳入了 {name: 'xhs rookies'} 作為 props 對象。
  • Welcome 組件返回 <h1>xhs rookies</h1>。
  • React DOM 迅速更新 DOM ,使其顯示為 <h1>xhs rookies</h1>。

注意: 組件名稱總是以大寫字母開始。

舉例來說, <div/> 代表一個(gè) DOM 標(biāo)簽,而 <Welcome/> 則代表一個(gè)組件,并且需要在作用域中有一個(gè) Welcome 組件。

你可以深入 JSX閱讀更多關(guān)于這點(diǎn)背后的原因。

合成組件

組件可以在它們的輸出中引用其它組件。這使得我們可以使用同樣的組件來抽象到任意層級。一個(gè)按鈕,一個(gè)表單,一個(gè)對話框,一個(gè)屏幕:在 React 應(yīng)用中,所有這些都通常描述為組件。

例如,我們可以創(chuàng)建一個(gè) App 組件,并在其內(nèi)部多次渲染 Welcome:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>
}

function App() {
  return (
    <div>
      <Welcome name="rookie-Sara" />
      <Welcome name="rookie-Cahal" />
      <Welcome name="rookie-Edite" />
    </div>
  )
}

 
ReactDOM.render(<App />, document.getElementById('root'))

通常,新的 React apps 都有一個(gè)單獨(dú)的頂層 App 組件。然而,如果你在已有的應(yīng)用中整合 React,你可以需要由下至上地, 從類似于 Button 這樣的小組件開始, 逐漸整合到視圖層的頂層。

提取組件

不要害怕把一個(gè)組件分為多個(gè)更小的組件。

舉個(gè)例子,思考下名 Comment 組件:

function Comment(props) {
  return (
    <div className="Comment">
      <div className="UserInfo">
        <img className="Avatar" src={props.author.avatarUrl} alt={props.author.name} />
        <div className="UserInfo-name">{props.author.name}</div>
      </div>
      <div className="Comment-text">{props.text}</div>
      <div className="Comment-date">{formatDate(props.date)}</div>
    </div>
  )
}

它接受 author(一個(gè)對象),text(一個(gè)字符串)和 date(一個(gè)日期)作為 props。

這個(gè)組件修改起來很麻煩,因?yàn)樗潜磺短椎模液茈y復(fù)用其中的某個(gè)部分。讓我們從其中提取一些組件。

首先,提取頭像 Avatar:

function Avatar(props) {
  return <img className="Avatar" src={props.user.avatarUrl} alt={props.user.name} />
}

Avatar 組件不用關(guān)心它在 Comment 中是如何渲染的。這是為什么我們它的 prop 一個(gè)更通用的屬性名: user, 而不是 author 的原因。

我們建議從組件本身的角度來命名 props 而不是它被使用的上下文環(huán)境。

我們可以稍微簡化一下 Comment 組件:

function Comment(props) {
  return (
    <div className="Comment">
      <div className="UserInfo">
        <Avatar user={props.author} />
        <div className="UserInfo-name">{props.author.name}</div>
      </div>
      <div className="Comment-text">{props.text}</div>
      <div className="Comment-date">{formatDate(props.date)}</div>
    </div>
  )
}

接下來,我們提取用戶信息 UserInfo 組件, 用于將 Avatar 顯示在用戶名旁邊:

function UserInfo(props) {
  return (
    <div className="UserInfo">
      <Avatar user={props.user} />
      <div className="UserInfo-name">{props.user.name}</div>
    </div>
  )
}

這使我們可以進(jìn)一步簡化 Comment 組件:

function Comment(props) {
  return (
    <div className="Comment">
      <UserInfo user={props.author} />
      <div className="Comment-text">{props.text}</div>
      <div className="Comment-date">{formatDate(props.date)}</div>
    </div>
  )
}

提取組件可能看起來是一個(gè)繁瑣的工作,但是在大型的 Apps 中可以回報(bào)給我們的是大量的可復(fù)用組件。一個(gè)好的經(jīng)驗(yàn)準(zhǔn)則是如果你 UI 的一部分需要用多次 (Button,Panel,Avatar),或者本身足夠復(fù)雜(App,F(xiàn)eedStory,Comment),最好的做法是使其成為可復(fù)用組件。

Props 是只讀的

無論你用函數(shù)或類的方法來聲明組件, 它都無法修改其自身 props. 思考下列 sum (求和)函數(shù):

function sum(a, b) {
  return a + b
}

這種函數(shù)稱為 “純函數(shù)” ,因?yàn)樗鼈儾粫噲D改變它們的輸入,并且對于同樣的輸入,始終可以得到相同的結(jié)果。

反之, 以下是非純函數(shù), 因?yàn)樗淖兞俗陨淼妮斎胫担?/p>

function withdraw(account, amount) {
  account.total -= amount
}

雖然 React 很靈活,但是它有一條嚴(yán)格的規(guī)則:

注意: 所有 React 組件都必須是純函數(shù),并禁止修改其自身 props 。
當(dāng)然, 應(yīng)用 UI 總是動態(tài)的,并且隨時(shí)有可以改變。

如果我們想要動態(tài)改變 UI,那么就會涉及到我們上面說到的state(狀態(tài)) 。我們通過動態(tài)的改變state來渲染整個(gè)頁面,我們后面會提及,詳情見 深入理解 setState

到此這篇關(guān)于React如何創(chuàng)建組件的文章就介紹到這了,更多相關(guān)React 創(chuàng)建組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React使用Electron開發(fā)桌面端的詳細(xì)流程步驟

    React使用Electron開發(fā)桌面端的詳細(xì)流程步驟

    React是一個(gè)流行的JavaScript庫,用于構(gòu)建Web應(yīng)用程序,結(jié)合Electron框架,可以輕松地將React應(yīng)用程序打包為桌面應(yīng)用程序,本文詳細(xì)介紹了使用React和Electron開發(fā)桌面應(yīng)用程序的步驟,需要的朋友可以參考下
    2023-06-06
  • react中事件處理與柯里化的實(shí)現(xiàn)

    react中事件處理與柯里化的實(shí)現(xiàn)

    本文主要介紹了react中事件處理與柯里化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • React Native中TabBarIOS的簡單使用方法示例

    React Native中TabBarIOS的簡單使用方法示例

    最近在學(xué)習(xí)過程中遇到了很多問題,TabBarIOS的使用就是一個(gè),所以下面這篇文章主要給大家介紹了關(guān)于React Native中TabBarIOS簡單使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2017-10-10
  • 詳解React 服務(wù)端渲染方案完美的解決方案

    詳解React 服務(wù)端渲染方案完美的解決方案

    這篇文章主要介紹了詳解React 服務(wù)端渲染方案完美的解決方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-12-12
  • React 的調(diào)和算法Diffing 算法策略詳解

    React 的調(diào)和算法Diffing 算法策略詳解

    React的調(diào)和算法,主要發(fā)生在render階段,調(diào)和算法并不是一個(gè)特定的算法函數(shù),而是指在調(diào)和過程中,為提高構(gòu)建workInProcess樹的性能,以及Dom樹更新的性能,而采用的一種策略,又稱diffing算法
    2021-12-12
  • React 全自動數(shù)據(jù)表格組件——BodeGrid的實(shí)現(xiàn)思路

    React 全自動數(shù)據(jù)表格組件——BodeGrid的實(shí)現(xiàn)思路

    表格是在后臺管理系統(tǒng)中用的最頻繁的組件之一,相關(guān)的功能有數(shù)據(jù)的新增和編輯、查詢、排序、分頁、自定義顯示以及一些操作按鈕。這篇文章主要介紹了React 全自動數(shù)據(jù)表格組件——BodeGrid ,需要的朋友可以參考下
    2019-06-06
  • react組件傳值的四種方法

    react組件傳值的四種方法

    本文主要介紹了react組件傳值的四種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • React為什么需要Scheduler調(diào)度器原理詳解

    React為什么需要Scheduler調(diào)度器原理詳解

    這篇文章主要為大家介紹了React為什么需要Scheduler調(diào)度器原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • react?component?function組件使用詳解

    react?component?function組件使用詳解

    這篇文章主要為大家介紹了react?component?function組件的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React?Fiber構(gòu)建completeWork源碼解析

    React?Fiber構(gòu)建completeWork源碼解析

    這篇文章主要為大家介紹了React?Fiber構(gòu)建completeWork源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評論

迁西县| 紫阳县| 东莞市| 奈曼旗| 保山市| 台湾省| 伊通| 中西区| 嘉鱼县| 泸西县| 黑山县| 武山县| 兴和县| 哈巴河县| 将乐县| 富阳市| 兴国县| 偃师市| 张家港市| 兰考县| 固原市| 中西区| 界首市| 临沭县| 西乌珠穆沁旗| 郴州市| 镇远县| 怀集县| 枣庄市| 广平县| 札达县| 丰城市| 陆河县| 山丹县| 黔西| 来凤县| 广平县| 望江县| 横山县| 博兴县| 衡水市|