組件和組件庫框架

来源:https://www.cnblogs.com/hubert-style/archive/2023/11/22/17849897.html
-Advertisement-
Play Games

所謂天才,就是努力的力量。 React 組件由 DOM 結構,樣式和 Javascript 邏輯組成。 1. ES6 中的類 class People { constructor() { this.name = "hubert" this.age = 29 } printName() { conso ...


所謂天才,就是努力的力量。

React 組件由 DOM 結構,樣式和 Javascript 邏輯組成。

1. ES6 中的類

class People {
  constructor() {
    this.name = "hubert"
    this.age = 29
  }

  printName() {
    console.log(this.name)
  }

  printAge() {
    console.log(this.age)
  }
}

var people = new People()
people.printName()
people.printAge()

2. 類式組件

類式組件是基於使用 class 定義的類,需要繼承自 React.Component;另外,類式組件中必須實現 render 函數。

import React from "react";

class AppClassComponent extends React.Component {
  render() {
    return <div>hello {this.props.name}</div>
  }
}

export default AppClassComponent

3. 函數式組件

函數式組件是基於使用 function 定義的函數,通常接受一個 props 參數,返回一個 JSX 元素或者 null。函數式組件和普通函數最主要的區別在調用的時候,函數式組件在渲染的時候沒有被人為顯式調用,而是由 React 內部去調用。

// React 16.8 之前函數式組件是無狀態的
// React 16.8 之後引入 react hooks,我們可以讓函數式組件有狀態了。hooks 讓函數式組件有狀態了。
function AppFuncConponent(props) {
  return (
    <div>hello function conponent</div>
  )
}

// ES6 箭頭函數
const AppfuncComponent1 = (props)=>{
  return <div>箭頭函數組件</div>
}

export default AppFuncConponent

4. TypeScript 函數式組件

函數式組件通常接受一個 props 參數,返回一個 JSX 元素或者 null。當我們需要使用 TypeScript 去定義一個函數式組件時,除了基礎對函數式寫法外,我們還可以使用以下方式來實現。

4.1)使用 React.FC

由於 React 不是使用 TypeScript 開發的,使用的是社區開發的 @type/react 包提供的類型,裡面有一個通用類型 FC ,允許我們為函數組件添加參數類型

type FCProps = { text: string };
// 這裡的 React.FC 是 React.FunctionComponent 的簡寫
const FCComponent: React.FC<FCProps> = ({ text = "" })=> <div>{text}</div>;

當組件包含子元素,TypeScript 會提示警告,現在已經不推薦使用這種方式了

type FCProps = { text: string };
const FCComponent: React.FC<FCProps> = ({ text = "" }) => <div>{text}</div>;

function App() {
  return (
    <div className="App">
        <FCComponent text="Hello Chris1993.">
            <span>children</span>
        </FCComponent>
    </div>
  );
}

提示警告內容:

Type '{ children: string; text: string; }' is not assignable to type 'IntrinsicAttributes & FCProps'.
  Property 'children' does not exist on type 'IntrinsicAttributes & FCProps'.

4.2)直接定義完整類型

由於 React 組件包含子元素時,會隱式傳遞一個 children 屬性,導致定義的參數類型出錯,因此我們可以直接定義一個完整的參數介面,包含了 children 屬性的類型:

type FCProps = { text: string; children?: any };
const FCComponent: React.FC<FCProps> = ({ text = "" }) => <div>{text}</div>;

function App() {
  return (
    <div className="App">
        <FCComponent text="Hello Chris1993.">
            <span>children</span>
        </FCComponent>
    </div>
  );
}

4.3)使用 React.PropsWithChildren

上面這種方法每次都要手動寫一個 children 屬性類型比較麻煩,這時候我們就可以使用 React.PropsWithChildren 類型,它本身封裝了 children 的類型聲明:

// react/index.d.ts
type PropsWithChildren<P> = P & { children?: ReactNode };

因此,使用 React.PropsWithChildren 類型定義函數式組件,就不用去處理 children 的類型了:

type IProps = React.PropsWithChildren<{ text: string }>;
// 形式1
const PropsComponent = ({ text }: IProps) => <div>{text}</div>;
// 形式2
const PropsComponent:React.FC<IProps> = ({ text }) => <div>{text}</div>;

function App() {
  return (
    <div className="App">
        <PropsComponent text="Hello Chris1993.">
            <span>children</span>
        </PropsComponent>
    </div>
  );
}

4.4)使用 JSX.Element

使用 JSX.Element 類型作為函數式組件的返回值類型,當組件的返回值不是 JSX.Element 類型時,TypeScript 就會提示錯誤。

type FCProps = { text: string };
const ElementComponent = ({ text }: FCProps): JSX.Element => <div>{text}</div>;
function App() {
  return (
    <div className="App">
        <ElementComponent text="Hello Chris1993."></ElementComponent>
    </div>
  );
}

5. 組件嵌套使用

6. React UI 組件庫

Ant Design 是一個致力於提升『用戶!和『設計者』使用體驗的設計語言;旨在統一中台項目的前端 UI 設計,屏蔽不必要的設計差異和實現成本,解放設計和前端的研發資源;包含很多設計原則和配套的組件庫。

Ant Design(PC 端):https://ant.design/index-cn

Ant Design Mobile(移動端):https://mobile.ant.design/zh


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 環境說明:阿裡雲ECS,2核2G(新老用戶同享,僅需99/年),X86架構,CentOS 7.9操作系統。 準備工作 1.查看當前伺服器是否安裝了mariadb,如果有安裝需要先刪除,如下圖所示。 # 檢查當前伺服器是否安裝mariadb rpm -qa |grep mariadb # 卸載已安裝的 ...
  • 近日,CCF TF 舉辦了第 123 期分享活動,本期主題為“用戶體驗工程”。在活動中,來自火山引擎 AB 測試平臺的專家結合位元組跳動的 AB 實驗經驗,進行了《數據驅動的實驗文化》為主題的現場分享。 ...
  • 相信大家都認可一個觀點:不論是 To B 還是 To C,用戶是企業的核心資源,是互聯網產品中最重要的價值之一。因此,深入挖掘用戶價值成為現在大部分企業運營的關鍵。 之前我們為大家介紹過如何利用 RFM 模型讓企業聚焦於更有價值的用戶,本文將為大家詳細介紹用戶生命周期模型 APMDR,以及「袋鼠雲客 ...
  • FE層的架構都能在網上找到說明. 但BE層的架構模式、一致性保障、與FE層之間的請求邏輯,數據傳輸邏輯等,我個人暫時沒有找到相應的博客說明這些的。當然這些是我個人在學習與使用Doris過程中,對內部交互邏輯與實現感興趣才有這些疑問. 還好現在有GPT這類大模型,有了疑問,只要問題描述得當,大多可以解 ...
  • 簡介: 問題: C#,VS2022,mariadb-10.11.5-winx64,using MySql.Data.MySqlClient; 在執行connection.Open()時拋出異常:System.InvalidCastException:“Object cannot be cast fr ...
  • 基於React18+Electron27+ArcoDesign仿macOS桌面端系統框架ElectronMacOS。 electron-react-macOs 基於electron27.x+vite4+react18+arcoDesign+zustand等技術構建桌面版仿MacOs框架系統解決方案。 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 引言 居中是我們在前端佈局中經常會遇到的問題,其中包括水平居中和垂直居中。居中的方法很多,比如說水平居中可以使用text-align: center或者margin: 0 auto等等來實現,垂直居中則需要使用一些其它的特殊的技巧。比如說 ...
  • 前言 您是否曾經希望擁有一個神奇的工具包,可以讓您像超級英雄一樣控制 JavaScript 對象?向ReflectAPI 打個招呼吧,它是 ES6 中引入的一個新的全局對象 ,它能夠處理簡單的代碼操作。它是每個現代 JavaScript 開發人員都需要的瑞士軍刀!📜 本文的目標是幫助您更好地理解 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...