React入門-JSX和虛擬dom

来源:https://www.cnblogs.com/zlforever-young/archive/2019/09/19/11545488.html
-Advertisement-
Play Games

1.JSX理解 舉例: 這被稱為 JSX,是一個 JavaScript 的語法擴展。建議在 React 中配合使用 JSX,JSX 可以生成 React “元素”,而且JSX 可以很好地描述 UI 應該呈現出它應有交互的本質形式。JSX 可能會使人聯想到模版語言,但它具有 JavaScript 的全 ...


1.JSX理解

舉例:

const element = <h1>Hello, world!</h1>;

這被稱為 JSX,是一個 JavaScript 的語法擴展。建議在 React 中配合使用 JSX,JSX 可以生成 React “元素”,而且JSX 可以很好地描述 UI 應該呈現出它應有交互的本質形式。JSX 可能會使人聯想到模版語言,但它具有 JavaScript 的全部功能。

為什麼用JSX?

React 認為渲染邏輯本質上與其他 UI 邏輯內在耦合,比如,在 UI 中需要綁定處理事件、在某些時刻狀態發生變化時需要通知到 UI,以及需要在 UI 中展示準備好的數據。

React 並沒有採用將標記與邏輯進行分離到不同文件這種人為地分離方式,而是通過將二者共同存放在稱之為“組件”的鬆散耦合單元之中,來實現關註點分離

React 不強制要求使用 JSX,但是大多數人發現,在 JavaScript 代碼中將 JSX 和 UI 放在一起時,會在視覺上有輔助作用。它還可以使 React 顯示更多有用的錯誤和警告消息。

在 JSX 中嵌入表達式

下麵的例子聲明瞭一個名為 name 的變數,然後在 JSX 中使用它,並將它包裹在大括弧中:

const name = 'Josh Perez';
const element = <h1>Hello, {name}</h1>;

ReactDOM.render(
  element,
  document.getElementById('root')
);

在 JSX 語法中,你可以在大括弧內放置任何有效的 JavaScript 表達式。例如,2 + 2user.firstName 或 formatName(user) 都是有效的 JavaScript 表達式。

 

下麵的示例調用 JavaScript 函數 formatName(user) 的結果,並將結果嵌入到 <h1> 元素中。

function formatName(user) {
  return user.firstName + ' ' + user.lastName;
}

const user = {
  firstName: 'Harper',
  lastName: 'Perez'
};

const element = (
  <h1>
    Hello, {formatName(user)}!
  </h1>
);

ReactDOM.render(
  element,
  document.getElementById('root')
);

JSX 也是一個表達式

在編譯之後,JSX 表達式會被轉為普通 JavaScript 函數調用,並且對其取值後得到 JavaScript 對象。也就是說,你可以在 if 語句和 for 迴圈的代碼塊中使用 JSX,將 JSX 賦值給變數,把 JSX 當作參數傳入,以及從函數中返回 JSX。示例如下:

function getGreeting(user) {
  if (user) {
    return <h1>Hello, {formatName(user)}!</h1>;
  }
  return <h1>Hello, Stranger.</h1>;
}

JSX 具有特定屬性

可以通過使用引號,來將屬性值指定為字元串字面量:

const element = <div tabIndex="0"></div>;

也可以使用大括弧,來在屬性值中插入一個 JavaScript 表達式:

const element = <img src={user.avatarUrl}></img>;

在屬性中嵌入 JavaScript 表達式時,不要在大括弧外面加上引號。應該僅使用引號(對於字元串值)或大括弧(對於表達式)中的一個,對於同一屬性不能同時使用這兩種符號。

註意:

因為 JSX 語法上更接近 JavaScript 而不是 HTML,所以 React DOM 使用 camelCase(小駝峰命名)來定義屬性的名稱,而不使用 HTML 屬性名稱的命名約定。

例如,JSX 里的 class 變成了 className,而 tabindex 則變為 tabIndex

使用 JSX 指定子元素

假如一個標簽裡面沒有內容,你可以使用 /> 來閉合標簽,就像 XML 語法一樣:

const element = <img src={user.avatarUrl} />;

JSX 標簽里能夠包含很多子元素:

const element = (
  <div>
    <h1>Hello!</h1>
    <h2>Good to see you here.</h2>
  </div>
);

JSX 表示對象

Babel 會把 JSX 轉譯成一個名為 React.createElement() 函數調用。以下兩種示例代碼完全等效:

const element = (
  <h1 className="greeting">
    Hello, world!
  </h1>
);
const element = React.createElement(
  'h1',
  {className: 'greeting'},
  'Hello, world!'
);

React.createElement() 會預先執行一些檢查,以幫助你編寫無錯代碼,但實際上它創建了一個這樣的對象:

// 註意:這是簡化過的結構
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world!'
  }
};

這些對象被稱為 “React 元素”。它們描述了你希望在屏幕上看到的內容。React 通過讀取這些對象,然後使用它們來構建 DOM 以及保持隨時更新。

註意:元素是構成react應用的最小磚塊。

接下來介紹將 React 元素渲染為 DOM。

2.虛擬DOM

什麼是虛擬DOM?

在 React 中,render 執行的結果得到的並不是真正的 DOM 節點,結果僅僅是輕量級的 JavaScript 對象,我們稱之為 virtual DOM。

虛擬 DOM 是 React 的一大亮點,具有 batching(批處理) 和高效的 Diff 演算法。這讓我們可以無需擔心性能問題而” 毫無顧忌” 的隨時“ 刷新” 整個頁面,由虛擬 DOM 來確保只對界面上真正變化的部分進行實際的 DOM 操作。在實際開發中基本無需關心虛擬 DOM 是如何運作的,但是理解其運行機制不僅有助於更好的理解 React 組件的生命周期,而且對於進一步優化 React 程式也會有很大幫助。

與瀏覽器的 DOM 元素不同,React 元素是創建開銷極小的普通對象。React DOM 會負責更新 DOM 來與 React 元素保持一致。

(個人理解:虛擬DOM是由javascript構建的文檔樹,而真實的DOM是由HTML繪製的文檔樹。傳統的頁面發生改變時,會引起DOM頁面的重繪,降低效率。而在react中,當內容發生改變時,會觸發對應javascript控制的樹節點對象的改變,從而控制局部頁面元素的刷新。更通俗的比較就是:傳統的頁面渲染是內容變化觸發頁面DOM的整體刷新,而react則是內容變化觸發javacript虛擬DOM對象改變,進而控制頁面DOM局部刷新)

將一個元素渲染為 DOM

 假設你的 HTML 文件某處有一個 <div>

<div id="root"></div>

其被稱為“根” DOM 節點,因為該節點內的所有內容都將由 React DOM 管理。

僅使用 React 構建的應用通常只有單一的根 DOM 節點。如果你在將 React 集成進一個已有應用,那麼你可以在應用中包含任意多的獨立根 DOM 節點。

如果想要將一個 React 元素渲染到根 DOM 節點中,只需把它們一起傳入 ReactDOM.render()

const element = <h1>Hello, world</h1>;
ReactDOM.render(element, document.getElementById('root'));

更新已渲染的元素

React 元素是不可變對象。一旦被創建,你就無法更改它的子元素或者屬性。一個元素就像電影的單幀:它代表了某個特定時刻的 UI。

根據我們已有的知識,更新 UI 唯一的方式是創建一個全新的元素,並將其傳入 ReactDOM.render()

 註意:在實踐中,大多數 React 應用只會調用一次 ReactDOM.render()

 React 只更新它需要更新的部分

React DOM 會將元素和它的子元素與它們之前的狀態進行比較,並只會進行必要的更新來使 DOM 達到預期的狀態。

 

react中文文檔:https://zh-hans.reactjs.org/docs/hello-world.html

react開發者工具:https://github.com/facebook/react-devtools

react小型表單庫:https://jaredpalmer.com/formik/docs/overview

javascript高階知識:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript

線上編寫react練習:https://codepen.io/pen/?&editable=true

!以上是學習react可能會用到的知識文檔,學習一門新技術的最好途徑就是閱讀官方文檔+實際動手操作

 


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

-Advertisement-
Play Games
更多相關文章
  • 首先在命令提示符下進入mysqldump.exe所在目錄(如果mysqldump.exe所在目錄已添加到系統path環境變數,可以省略此步驟) 備份mysqldump.exe --opt --add-drop-database --add-drop-table -hlocalhost -uroot ...
  • SELECT INTO 語句可用於創建表的備份復件。 SELECT INTO 語句 SELECT INTO 語句從一個表中選取數據,然後把數據插入另一個表中。 SELECT INTO 語句常用於創建表的備份復件或者用於對記錄進行存檔。 SQL SELECT INTO 語法 您可以把所有的列插入新表: ...
  • 本文鏈接: "Android mmap 文件映射到記憶體介紹" Android開發中,我們可能需要記錄一些文件。例如記錄log文件。如果使用流來寫文件,頻繁操作文件io可能會引起性能問題。 為了降低寫文件的頻率,我們可能會採用緩存一定數量的log,再一次性把它們寫到文件中。如果app異常退出,我們有可 ...
  • 關於小程式的載入快慢這可是一大學問,自古以來性能都是重點,所以下麵我淺談一下自己遇到的問題和解決方法吧 首先,先從網路請求network說起: 這裡基本不關前端的事情,但是這也是優化小程式的一大重點,後端響應我們請求數據的速度影響了整個頁面的速度,所以,把它拿到第一位 請求超過300ms就已經算是慢 ...
  • 最近項目要求,ui有很多有關於陰影的設計要求,網上找了些實現方式,但都不是很理想。現在閑下來了,就尋思著自己寫個陰影佈局耍耍,以備後用。先說道說道我找到的幾種陰影實現方式: 系統陰影 Andorid 系統自api 21之後就多了一個熟悉 android:elevation ,這是android最新引 ...
  • 原文作者: "Roman Elizarov" 原文地址: "Null is your friend, not a mistake" 譯者:秉心說 "Kotlin Island from Wikimedia by Pavlikhin, CC BY SA 4.0" 我使用 Java 語言編程已經很久很久 ...
  • jQuery 效果方法 下表列出了用於創建動畫效果的所有jQuery方法。 ...
  • 示例代碼托管在: "http://www.github.com/dashnowords/blogs" 博客園地址: "《大史住在大前端》原創博文目錄" 華為雲社區地址: "【你要的前端打怪升級指南】" [TOC] B站地址: "【編譯原理】" Stanford公開課: "【Stanford大學公開課 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...