」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > React 的基本核心概念

React 的基本核心概念

發佈於2024-11-09
瀏覽:376

在快速发展的 Web 开发世界中,React 仍然是构建动态和高性能用户界面的基石。无论您是经验丰富的开发人员还是刚刚起步的开发人员,了解 React 的核心概念对于充分发挥其潜力至关重要。在本文中,我们将探讨 React 的基本原理,从它的库状态到 hooks 的强大功能,并为您提供增强 React 技能的清晰基础。让我们深入了解一下! ?

1. React 是框架还是库?

React 是一个 JavaScript 库,而不是一个框架。与提供一套全面的工具并强制执行构建应用程序的特定方式的框架不同,React 专注于一个特定的方面——UI 渲染。这使得 React 高度灵活和流行,因为它遵循 Unix 哲学,做一件事并做好它。

2.虚拟 DOM

DOM 代表文档对象模型,简单来说代表应用程序的 UI。每次我们更改 UI 时,DOM 都会更新以表示该更改。 DOM 表示为树形数据结构。当我们更改 UI 时,DOM 会重新渲染并更新其子项。 UI 的重新渲染使应用程序变慢。

对于此解决方案,我们使用虚拟 DOM。虚拟 DOM 只是 DOM 的虚拟表示。当应用程序的状态发生变化时,虚拟 DOM 而不是真实的 DOM 会被更新。

虚拟 DOM 每次都会创建一棵树,元素都表示为一个节点。如果任何元素发生变化,就会创建一个新的虚拟 DOM 树。然后将新树与前一树进行比较或“差异”

Fundamental Core Concepts of React

在此图中,红色圆圈代表已更改的节点。这些节点代表更改状态的 UI 元素。然后比较之前的树和当前改变的树。更新后的树然后批量更新到真实的 DOM。这使得 React 作为高性能 JavaScript 库脱颖而出。

总之:

  1. 整个虚拟 DOM 被更新。
  2. 虚拟 DOM 与更新之前的样子进行比较。 React 找出哪些对象发生了变化。
  3. 更改的对象,并且仅更改的对象,会在真实 DOM 上更新。
  4. 真实 DOM 的变化会导致屏幕发生变化。

3. JSX

JSX (JavaScript XML) 允许您在 React 中编写类似 HTML 的代码。它使用 React.createElement( component, props, …children) 函数将 HTML 标签转换为 React 元素。

例如:
JSX代码:


  Hello, Good Morning!

本例编译为:

React.createElement(
  MyText,
  { color: 'red' },
  'Hello, Good Morning!'
)

注意:用户定义的组件必须以大写字母开头。小写标签被视为 HTML 元素。

4. JSX 中的道具

在 JSX 中可以通过多种方式指定属性:

JavaScript 表达式作为 Props:

此处,props.sum 的计算结果为 6。

字符串文字:

上面的两个例子是等效的。

Props 默认为“True”
如果我们不传递 prop 的值,则默认为 true。

例如,

上面的两个例子是等效的。

5.类组件

React 中的组件可以定义为类或函数。以下是定义类组件的方法:

class Greetings extends React.Component {
  render() {
    return 

Hello, {this.props.name}

; } }

6。组件生命周期

组件具有生命周期方法,您可以重写这些方法以在特定阶段运行代码:

安装: 当组件被创建并插入到 DOM 中时。

  • 构造函数()
  • 使成为()
  • componentDidMount()

更新:当道具或状态改变时。

  • 使成为()
  • componentDidUpdate()

卸载:当组件从 DOM 中移除时。

  • componentWillUnmount()

7.类属性

defaultProps 允许您定义 props 的默认值:

class MyText extends React.Component {
  // Component code here
}

MyText.defaultProps = {
  color: 'gray'
};

如果没有提供 props.color,则默认为 'gray'。

8.道具类型

我们可以使用 prop-types 来检查组件传递的属性的类型。当它们不匹配时,它会给出错误。

import PropTypes from 'prop-types';

const studentPropTypes = {
  studentName: PropTypes.string,
  id: PropTypes.number
};

const props = {
  studentName: 'Asima',
  id: 'hi' // Invalid
};

PropTypes.checkPropTypes(studentPropTypes, props, 'prop', 'MyComponent');

这将警告 id 的类型不匹配。

9.优化性能

React 是为了性能而设计的,但你可以进一步优化它:

使用生产构建:

npm run build

这将创建一个经过优化的生产版本。

最小化源代码:谨慎对待 React 源代码的更改。

代码分割:将 JavaScript 代码捆绑成块以根据需要加载。

10.反应钩子

Hooks 是允许您在函数组件中使用状态和其他 React 功能的函数。两个最受欢迎的钩子是:

useState: 向功能组件添加状态。

function Example() {
  const [count, setCount] = useState(0);

  return (
    

You clicked {count} times

); }

useEffect: 管理函数组件中的副作用。

function Example() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });

  return (
    

You clicked {count} times

); }

React 不断发展以满足现代 Web 开发的需求,掌握其核心概念对于构建高效、可扩展的应用程序至关重要。从理解 React 作为一个库如何脱颖而出,到利用功能组件的钩子的力量,这些基础知识将帮助您走上熟练 React 的道路。

当您继续在项目中探索和实施 React 时,请记住,及时了解最新的实践和功能将使您在不断变化的技术领域保持领先地位。如果您发现本文有价值,请不要忘记点赞并与渴望加深 React 知识的其他开发人员分享!

感谢您的阅读,祝您编码愉快! ?

版本聲明 本文轉載於:https://dev.to/asimachowdhury/fundamental-core-concepts-of-react-2lp3?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Mac OS X 上的 Python 專案創建
    Mac OS X 上的 Python 專案創建
    介紹 PyFabricate 是一款 Mac OS X 應用程序,可簡化 Python 專案的建立。 自從我創作它以來,顯然它是我認為 Python 專案應該是什麼樣子的一個固執己見的版本。 此外,我還有一個特定的工具集,可以用來編寫 Python Mac OS X 應用程式。...
    程式設計 發佈於2024-11-09
  • 如何修復 PHP 中的「嘗試取得非物件的屬性」錯誤?
    如何修復 PHP 中的「嘗試取得非物件的屬性」錯誤?
    解決PHP 中的“嘗試獲取非對象的屬性”錯誤使用PHP 時,您可能會遇到錯誤“嘗試獲取非物件的屬性」獲得非物體的財產。 「當嘗試存取尚未正確初始化或為null 的物件的屬性時,通常會發生此錯誤。 在提供的程式碼的情況下,問題在於從資料庫取得側邊選單資料。mysql_fetch_object() 函數...
    程式設計 發佈於2024-11-09
  • 大批
    大批
    方法是可以在物件上呼叫的 fns 數組是對象,因此它們在 JS 中也有方法。 slice(begin):將陣列的一部分提取到新數組中,而不改變原始數組。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index ...
    程式設計 發佈於2024-11-09
  • ## 如何修改 Python 原始碼,同時保留格式和註解?
    ## 如何修改 Python 原始碼,同時保留格式和註解?
    使用AST 修改Python 原始碼使用AST 修改Python 原始碼解析、修改和寫回Python 原始碼對於突變測試等任務來說是一項很突變測試等任務來說是一項很有價值的任務。雖然標準 Python 模組提供了解析和編譯程式碼的方法,但它們缺乏修改和重寫原始程式碼的能力。 為了滿足這一需求,一些庫...
    程式設計 發佈於2024-11-09
  • 如何使用 JavaScript 根據另一個下拉清單中的選擇填入下拉清單?
    如何使用 JavaScript 根據另一個下拉清單中的選擇填入下拉清單?
    使用JavaScript 根據另一個下拉列表中的選擇填充一個下拉列表當面臨根據另一個下拉列表中的選擇動態更新一個下拉列表中的選項的任務時,它是對於避免不必要的複雜性(例如資料庫查詢)至關重要。讓我們探索一個簡單的基於 JavaScript 的解決方案,無需 AJAX 呼叫即可完成此任務。 為了說明此...
    程式設計 發佈於2024-11-09
  • 如何從具有不同數組長度的字典創建 Pandas DataFrame?
    如何從具有不同數組長度的字典創建 Pandas DataFrame?
    從條目長度不均勻的字典建立 DataFrame在 Python 中,可以從每個條目保存一個 Numpy 陣列的字典建立 DataFrame。然而,當條目之間的數組長度不同時,就會出現挑戰。預設情況下,Pandas 需要統一長度的數組,從而導致類似“ValueError: arrays must al...
    程式設計 發佈於2024-11-09
  • Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta 中的列偏移發生了什麼事?
    Bootstrap 4 Beta:列偏移的刪除和恢復Bootstrap 4 在其Beta 1 版本中引入了重大更改柱子偏移了。然而,隨著 Beta 2 的後續發布,這些變化已經逆轉。 從 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    程式設計 發佈於2024-11-09
  • 在 Go 中使用 WebSocket 進行即時通信
    在 Go 中使用 WebSocket 進行即時通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    程式設計 發佈於2024-11-09
  • 為什麼在 Java 中使用相同的種子時會得到相同的隨機數?
    為什麼在 Java 中使用相同的種子時會得到相同的隨機數?
    具有固定種子的Java隨機數:為什麼輸出相同? 在您的程式碼中,您定義了一種使用以下命令產生隨機數的方法指定的種子。但是,您會注意到,當您提供相同的種子時,所有 100 個產生的數字都是相同的。 此行為是預期的,因為在 Random 建構函式中使用相同的種子會產生可預測的數字序列。種子是初始化隨機數...
    程式設計 發佈於2024-11-09
  • jQuery Chaining 如何簡化開發並提高程式碼效率?
    jQuery Chaining 如何簡化開發並提高程式碼效率?
    理解 jQuery 中的物件和方法連結在 jQuery 中,連結允許在單一語句中串聯多個 jQuery 方法。這使開發人員能夠簡化程式碼並輕鬆執行複雜的操作。 連結的基本原理涉及每個 jQuery 方法的回傳值。當呼叫 jQuery 方法時,它通常會傳回一個表示所選元素的 jQuery 物件。這允許...
    程式設計 發佈於2024-11-09
  • Hono.js 基準測試:Node.js、Deno 和 Bun — 哪個最快?
    Hono.js 基準測試:Node.js、Deno 和 Bun — 哪個最快?
    Deno 2.0 剛剛發布,並聲稱比 Bun 和 Node.js 更快,同樣,Bun 也聲稱更快。這引起了我的興趣,所以我決定測試它們的性能,看看它們在現實場景中的比較。 為了公平比較,我需要選擇一個與所有三種 JavaScript 執行時間環境(Node.js、Deno 和 Bun)相容的框架。...
    程式設計 發佈於2024-11-09
  • 何時應該使用 Tkinter 的 Entry Get 函數來有效檢索輸入?
    何時應該使用 Tkinter 的 Entry Get 函數來有效檢索輸入?
    Tkinter Entry 的Get 函數:深入探討其功能和用法在Tkinter 中,Entry 小部件通常用於收集用戶輸入以進一步收集使用者輸入然而,與Entry 關聯的get() 函數通常無法產生所需的結果,這可能會讓開發人員感到困惑。本文深入探討 get() 的概念,全面了解其執行與應用。 理...
    程式設計 發佈於2024-11-09
  • 如何克服 PHP 中日期表示的 2038 限制?
    如何克服 PHP 中日期表示的 2038 限制?
    PHP 中的日期表示:克服2038 年限制雖然PHP 的原生日期函數在2038 年有一個截止日期,但還有其他方法處理超出此限制的日期。其中一種方法是僅儲存年、月和日,而忽略小時、分鐘、秒和毫秒部分。 透過丟棄這些附加時間部分,可以顯著擴展可表示日期的範圍。這是因為這些元件中的每一個都佔用了 PHP ...
    程式設計 發佈於2024-11-09
  • 如何在 Go (Gorilla) 中向特定客戶端發送有針對性的 Websocket 更新?
    如何在 Go (Gorilla) 中向特定客戶端發送有針對性的 Websocket 更新?
    在Go (Gorilla) 中向特定客戶端發送Websocket 更新儘管是Go 新手,但您尋求有關實現Websocket 通信的指導您的預輸入項目。您已嘗試利用 Gorilla 的 GitHub 儲存庫中的範例,但在理解如何識別特定客戶端並針對 websocket 更新進行定位方面遇到了挑戰。 要...
    程式設計 發佈於2024-11-09
  • 使用swoole作為基於ESP6的腳本可程式控制器的雲端物聯網閘道框架
    使用swoole作為基於ESP6的腳本可程式控制器的雲端物聯網閘道框架
    腳本可程式控制器的本機功能基本上已完成,開始實現遠端相關功能。 遠端系統整體架構如下: 使用ESP8266的SDK實作tcp伺服器和tcp客戶端。 在tcp伺服器的基礎上編寫http協議解析程式碼,設計簡單的http伺服器,處理與瀏覽器的資料交互,包括內建網頁的下載,並使用ajax技術獲取狀態並...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3