React的基本語法和原理

3. React條件渲染

    1. 某些情況下,姐妹的內容會根據不同的情況顯示不同的內容,或者決定是否渲染某部分內容:
    • 在React中,所有的條件判斷和普通的JavaScript代碼一致;
    1. 常見的條件渲染的方式有哪些?
    • 方式一: 條件判斷語句

      • 適合邏輯較多的情況
    • 方式二: 三元運算符

      • 適合邏輯比較簡單
    • 方式三: 與運算符&&

      • 適合如果條件成立,渲染某一個組件;如果條件不成立,什么內容也不渲染
    • v-show的效果

      • 主要是控制display屬性是否為none
    • 示例代碼如下:

      <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
      </head>
      <body><div id="root"></div><script src="../lib/react.js"></script><script src="../lib/react-dom.js"></script><script src="../lib/babel.js"></script><script type="text/babel">// 1.定義App根組件class App extends React.Component {constructor () {super()this.state = {message: 'hello world',isReady: false,friend: undefined}}render () {const  { isReady, friend } = this.state// 1.條件判斷方式一: 使用if進行條件判斷let showElement = nullif(isReady) {showElement = <h2>準備開始比賽吧</h2>} else {showElement = <h2>請提前做好準備!</h2>}return  (<div>{ /* 1. 方式一: 根據條件給變量賦值不同的內容 */ }<div>{ showElement }</div>{ /* 2. 方式二: 三元運算符 */ }<div>{ isReady ? <button>開始戰斗!</button> : <h3> 趕緊準備 </h3> }</div>{ /* 3. 方式三: && 邏輯與運算符 */ } { /* 場景: 當某一個值, 有可能為undefined時,使用&&進行條件判斷 */  }{/* 轉成Boolean值時不顯示的 */}<div>{ friend && <div>{ friend.name + ' ' + friend.desc }</div> }</div></div>)}}// 2. 創建root并且渲染App組件const root = ReactDOM.createRoot(document.querySelector('#root'))root.render(<App/>)</script>
      </body>
      </html>

4. React列表渲染

    1. 真實開發中會從服務器請求大量的數據,數據會以列表的形式存儲:
    • 比如歌曲、歌手、排行榜列表的數據;
    • 比如商品、購物車、評論列表的數據;
    • 比如好友消息、動態、聯系人列表的數據;
    1. 在React中沒有像Vue模板語法中的v-for指令,而是需要通過Javascript代碼的方式組織數據,轉成JSX;
    • 很多從Vue轉到React的非常不習慣,認為Vue的方式更賤簡潔明了;
    • 但是React中的JSX正式因為和Javascript無縫的銜接,讓他可以更加的靈活;
    • React是真正可以提高我們編寫代碼能力的一種方式;
    1. 如何展示列表
    • 在React中,展示列表最多的方式就是使用數組的map方法
    1. 很多時候在展示一個數組中的數據之前,需要先對他進行一些處理;
    • 比如過濾掉一些內容:filter函數
    • 比如截取數組中的一部分內容: slice函數
    • 示例代碼如下:
      <!DOCTYPE html>
      <html lang="en">
      <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.item {border: 1px solid orange;margin: 10px;padding: 0 20px;}</style>
      </head>
      <body><div id="root"></div><script src="../lib/react.js"></script><script src="../lib/react-dom.js"></script><script src="../lib/babel.js"></script><script type="text/babel">// 1.定義App根組件class App extends React.Component {constructor () {super()this.state = {students: [{ id: 111, name: 'why', score: 199 },{ id: 112, name: 'kobe', score: 98 },{ id: 113, name: 'james', score: 199  },{ id: 114, name: 'curry', score: 188 }]}}render () {const  { students } = this.state// 分數大于100的學生進行展示const filterStudents = students.filter( item => item.score > 100)// 分數大于100,只展示兩個人信息// slice(start, end): [start, end)const sliceStudents = students.slice(0,2)return  (<div><h2>學生列表數據</h2><div className="list">{students.filter(item => item.score> 100).slice(0, 2).map(item => {return (<div className="item"><h2>學號:{item.id}</h2>  <h3>姓名:{item.name}</h3>  <h1>分數:{item.score}</h1>  </div>  )})}</div></div>)}}// 2. 創建root并且渲染App組件const root = ReactDOM.createRoot(document.querySelector('#root'))root.render(<App/>)</script>
      </body>
      </html>
      
    1. 列表中的key
    • 在前面的代碼中只要展示列表都會有報一個警告:
      • 警告:Warning: Each child in a list should have a unique “key” prop.
      • 翻譯:在一個列表中每個子元素都應該有唯一的"key"屬性
      • 作用:在某些情況下(例如:插入)提高diff算法的效率
      • 警告如圖:外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
      • 添加key屬性后警告不提示:外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
    • 這個警告是告訴需要再列表展示的jsx中添加一個key
      • key主要的作用是為了提高diff算法的效率
      • 具體內容后續再進行寫筆記

5. JSX的本質

    1. 實際上,jsx僅僅只是React.createElement(component, props, …children)函數的語法糖;
    • 所有的jsx最終都會被轉換成React.createElement的函數調用。
    1. createElement需要傳遞三個參數:
    • 參數一:type
      • 當前ReactElement的類型
      • 如果是標簽元素,那么就使用字符串表示
      • 如果是組件元素,那么就直接使用組件的名稱
    • 參數二:config
      • 所有jsx中的屬性都在config中以對象的屬性和值的形式存儲
      • 比如傳入className作為元素的class;
    • 參數三: children
      • 存放在標簽中的內容,以children數組的方式進行存儲;
      • 當然,如果是多個元素呢? React內部有對他們進行處理,處理的源碼在下放
        外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
    1. babel官網查看
    • 默認jsx是通過babel幫我進行語法轉換的,所以之前寫的jsx代碼都需要依賴babel。
    • 可以子啊babel的官網中快速查看轉換的過程:https://babeljs.io/repl#?browsers=react
      外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
    1. 自己編寫React.createElement代碼:
    • 沒有通過jsx來書寫,姐妹依然是可以正常的渲染;
    • 另外,在這樣的情況下,不需要babel相關的依賴
      • 所以,type="text/babel"可以刪掉
      • 所以,可以刪除掉了;
      • React.createElement代碼如下:
          React.createElement("div",null,
      
    /#PURE/ React.createElement(
    “div”,
    {
    className: “header”
    },
    “Header”
    ),
    /#PURE/ React.createElement(
    “div”,
    {
    className: “Content”
    },
    /#PURE/ React.createElement(“div”, null, “Banner”),
    /#PURE/ React.createElement(
    “ul”,
    null,
    /#PURE/ React.createElement(
    “li”,
    null,
    “\u5217\u8868\u6570\u636E1”
    ),
    /#PURE/ React.createElement(
    “li”,
    null,
    “\u5217\u8868\u6570\u636E2”
    ),
    /#PURE/ React.createElement(
    “li”,
    null,
    “\u5217\u8868\u6570\u636E3”
    ),
    /#PURE/ React.createElement(
    “li”,
    null,
    “\u5217\u8868\u6570\u636E4”
    ),
    /#PURE/ React.createElement(“li”, null, “\u5217\u8868\u6570\u636E5”)
    )
    ),
    /#PURE/ React.createElement(
    “div”,
    {
    className: “footer”
    },
    “Footer”
    )
    );

6. 虛擬DOM創建的過程

    1. 通過React.createElement做種創建出來一個ReactElement對象;
    • return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
    1. 這個ReactElement對象是什么作用? React為什么要創建它
    • 原因是React利用ReactElement對象組成了一個Javascript的對象樹
    • Javascript的對象樹就是虛擬DOM(Virtual DOM)
    1. 如何查看ReactElement對象
    • 可以將之前的jsx返回結果進行打印;
    • 注意下面代碼中jsx的打印;
      外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
      外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
      外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
    1. 而ReactElement最終形成的樹結構就是Virtual DOM;
    1. jsx -> 虛擬DOM -> 真實DOM
    • 編寫相應的jsx代碼,jsx代碼轉換完之后會變成對應的React.createElement()這樣的一個函數調用,當函數執行完之后,會形成ReactElement對象;
      并且這個對象也會有嵌套,有自己的children, 它也會形成一個嵌套,形成嵌套的話它就形成就是一個虛擬DOM,而虛擬DOM的話再經過渲染最后就變成真實的DOM;
    • jsx代碼 -> ReactElement對象 -> 真實DOM
    • div -> React.createElement('div', null, {}) -> ReactElement對象 -> 虛擬DOM -> 真實DOM
    • jsx代碼外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
    • ReactElement對象外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
    • 真實DOM外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
    • 類比Vue:是template解析 -> render函數 -> h函數 -> vnode -> 虛擬dom -> 真實dom
    • 類比Vue解析,Vue解析時沒有React直觀的,Vue結項相對來說麻煩一點,有各種指令
    1. 虛擬DOM的作用:
      1. 在更新數據時,沒有必要重新把整個一段代碼給重新渲染,只需要更新數據,然后重新渲染對應的數據即可
      • 例如:當依賴一個數據message, 當message數據改變時,會重新調用render函數,一旦調用render函數就會形成一個新的結構, 重新執行時會在次調用createElement,就會形成一個新的虛擬DOM結構,然后還有一個舊的虛擬DOM結構,會在新舊虛擬DOM之間做一個diff算法,比較新舊虛擬DOM之間的不同,如果只是數據發生改變時,只需要更新數據就可以了。
      • 總結:可以在更新的時候進行diff算法,然后決定更新那里(可以在js對象里面快速進行diff算法來決定哪些東西更新,那些東西不更新)
      1. 跨平臺,可以做跨平臺應用程序
      1. 虛擬DOM幫助我們從命令式編程轉到了聲明式編程的模式;
  • 聲明式編程

      1. 虛擬DOM幫助我們從命令式編程轉到了聲明式編程的模式;
      1. React官方的說法:Virtual DOM 是一種編程理念
      • 在這個理念中,UI以一種理想化或者虛擬化的方式保存在內存中,并且它是一個相對簡單的Javascript對象;
      • 可以通過root.render()讓虛擬DOM和真實ODM同步起來,這個過程叫做協調(Reconciliation)
      • 協調:div -> ReactElement對象 -> 虛擬DOM -> 真實DOM
      1. 這種編程方式賦予React聲明式的API:
      • 只需要告訴React希望讓UI是什么狀態;
      • React來確保DOM和這些狀態是匹配的;
      • 不需要直接進行DOM操作,就可以從手動更改DOM、屬性操作、事件處理中解放出來;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917062.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917062.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917062.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何在 Gradle 項目中添加依賴?(以添加 AndroidX 版本的 RecyclerView 為例)

1. 確保項目已啟用 AndroidX RecyclerView 的現代版本屬于 AndroidX 庫&#xff0c;需確保項目已啟用 AndroidX&#xff1a; 在 gradle.properties 中應有以下配置&#xff08;通常新建項目默認開啟&#xff09;&#xff1a;android.useAndroidXtrue android.enableJetifiert…

深度學習與圖像處理 | 基于PaddlePaddle的梯度下降算法實現(線性回歸投資預測)

演示基于PaddlePaddle自動求導技術實現梯度下降&#xff0c;簡化求解過程。01、梯度下降法梯度下降法是機器學習領域非常重要和具有代表性的算法&#xff0c;它通過迭代計算來逐步尋找目標函數極小值。既然是一種迭代計算方法&#xff0c;那么最重要的就是往哪個方向迭代&#…

負載均衡集群HAproxy

HAProxy 簡介HAProxy 是一款高性能的負載均衡器和代理服務器&#xff0c;支持 TCP 和 HTTP 應用。廣泛用于高可用性集群&#xff0c;能夠有效分發流量到多個后端服務器&#xff0c;確保服務的穩定性和可擴展性。HAProxy 核心功能負載均衡&#xff1a;支持輪詢&#xff08;round…

重生之我在10天內卷贏C++ - DAY 1

坐穩了&#xff0c;我們的C重生之旅現在正式發車&#xff01;請系好安全帶&#xff0c;前方高能&#xff0c;但絕對有趣&#xff01;&#x1f680; 重生之我在10天內卷贏C - DAY 1導師寄語&#xff1a;嘿&#xff0c;未來的編程大神&#xff01;歡迎來到C的世界。我知道&#x…

[mind-elixir]Mind-Elixir 的交互增強:單擊、雙擊與鼠標 Hover 功能實現

[mind-elixir]Mind-Elixir 的交互增強&#xff1a;單擊、雙擊與鼠標 Hover 功能實現 功能簡述 通過防抖&#xff0c;實現單擊雙擊區分通過mousemove事件&#xff0c;實現hover效果 實現思路 &#xff08;一&#xff09;單擊與雙擊事件 功能描述 單擊節點時&#xff0c;可以觸發…

c++-迭代器類別仿函數常用算法函數

C常用算法函數 1. 前置知識 1.1 迭代器的類別 C中&#xff0c;迭代器是 STL 容器庫的核心組件之一&#xff0c;具有舉足輕重的作用&#xff0c;它提供了一種 統一的方式來訪問和遍歷容器&#xff0c;而無需關心底層數據結構的具體實現。迭代器類似指針&#xff0c;但比指針更通…

Python深度學習框架TensorFlow與Keras的實踐探索

基礎概念與安裝配置 TensorFlow核心架構解析 TensorFlow是由Google Brain團隊開發的開源深度學習框架&#xff0c;其核心架構包含數據流圖&#xff08;Data Flow Graph&#xff09;和張量計算系統。數據流圖通過節點表示運算操作&#xff08;如卷積、激活函數&#xff09;&…

c# net6.0+ 安裝中文智能提示

https://github.com/stratosblue/IntelliSenseLocalizer 1、安裝tool dotnet tool install -g islocalizer 2、 安裝IntelliSense 文件&#xff0c;安裝其他net版本修改下版本號 安裝中文net6.0采集包 islocalizer install auto -m net6.0 -l zh-cn 安裝中英文雙語net6.0采集包…

【建模與仿真】二階鄰居節點信息驅動的節點重要性排序算法

導讀&#xff1a; 在復雜網絡中&#xff0c;挖掘重要節點對精準推薦、交通管控、謠言控制和疾病遏制等應用至關重要。為此&#xff0c;本文提出一種局部信息驅動的節點重要性排序算法Leaky Noisy Integrate-and-Fire (LNIF)。該算法通過獲取節點的二階鄰居信息計算節點重要性&…

指令微調Qwen3實現文本分類任務

參考文檔&#xff1a; SwanLab入門深度學習&#xff1a;Qwen3大模型指令微調 - 肖祥 - 博客園 vLLM&#xff1a;讓大語言模型推理更高效的新一代引擎 —— 原理詳解一_vllm 原理-CSDN博客 概述 為了實現對100個標簽的多標簽文本分類任務&#xff0c;前期調用gpt-4o進行prom…

【機器學習-3】 | 決策樹與鳶尾花分類實踐篇

0 序言 本文將深入探討決策樹算法&#xff0c;先回顧下前邊的知識&#xff0c;從其基本概念、構建過程講起&#xff0c;帶你理解信息熵、信息增益等核心要點。 接著在引入新知識點&#xff0c;介紹Scikit - learn 庫中決策樹的實現與應用&#xff0c;再通過一個具體項目的方式來…

【數字投影】折幕影院都是沉浸式嗎?

折幕影院作為一種現代化的展示形式&#xff0c;其核心特點在于通過多塊屏幕拼接和投影融合技術&#xff0c;打造更具包圍感的視覺體驗。折幕影院設計通常采用多折幕結構&#xff0c;如三折幕、五折幕等&#xff0c;利用多臺投影機的協同工作&#xff0c;呈現無縫銜接的超大畫面…

數據結構——圖(三、圖的 廣度/深度 優先搜索)

一、廣度優先搜索(BFS)①找到與一個頂點相鄰的所有頂點 ②標記哪些頂點被訪問過 ③需要一個輔助隊列#define MaxVertexNum 100 bool visited[MaxVertexNum]; //訪問標記數組 void BFSTraverse(Graph G){ //對圖進行廣度優先遍歷&#xff0c;處理非連通圖的函數 for(int i0;i…

直擊WAIC | 百度袁佛玉:加速具身智能技術及產品研發,助力場景應用多樣化落地

7月26日&#xff0c;2025世界人工智能大會暨人工智能全球治理高級別會議&#xff08;WAIC&#xff09;在上海開幕。同期&#xff0c;由國家地方共建人形機器人創新中心&#xff08;以下簡稱“國地中心”&#xff09;與中國電子學會聯合承辦&#xff0c;百度智能云、中國聯通上海…

2025年人形機器人動捕技術研討會將在本周四召開

2025年7月31日愛迪斯通所主辦的【2025人形機器動作捕捉技術研討會】是攜手北京天樹探界公司線下活動結合線上直播的形式&#xff0c;會議將聚焦在“動作捕捉軟硬件協同&#xff0c;加速人形機器人訓練”&#xff0c;將深度講解多項核心技術&#xff0c;包含全球知名的慣性動捕大…

Apple基礎(Xcode①-項目結構解析)

要運行設備之前先選擇好設備Product---->Destination---->選擇設備首次運行手機提示如出現 “未受信任的企業級開發者” → 手機打開 設置 ? 通用 ? VPN與設備管理 → 信任你的 Apple ID 即可ContentView 是 SwiftUI 項目里 最頂層、最主界面 的那個“頁面”&#xff0…

微服務 02

一、網關路由網關就是網絡的關口。數據在網絡間傳輸&#xff0c;從一個網絡傳輸到另一網絡時就需要經過網關來做數據的路由和轉發以及數據安全的校驗。路由是網關的核心功能之一&#xff0c;決定如何將客戶端請求映射到后端服務。1、快速入門創建新模塊&#xff0c;引入網關依賴…

04動手學深度學習筆記(上)

04數據操作 import torch(1)張量表示一個數據組成的數組&#xff0c;這個數組可能有多個維度。 xtorch.arange(12) xtensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])(2)通過shape來訪問張量的形狀和張量中元素的總數 x.shapetorch.Size([12])(3)number of elements表…

MCU中的RTC(Real-Time Clock,實時時鐘)是什么?

MCU中的RTC(Real-Time Clock,實時時鐘)是什么? 在MCU(微控制器單元)中,RTC(Real-Time Clock,實時時鐘) 是一個獨立計時模塊,用于在系統斷電或低功耗狀態下持續記錄時間和日期。以下是關于RTC的詳細說明: 1. RTC的核心功能 精準計時:提供年、月、日、時、分、秒、…

Linux 進程調度管理

進程調度器可粗略分為兩類&#xff1a;實時調度器(kernel)&#xff0c;系統中重要的進程由實時調度器調度&#xff0c;獲得CPU能力強。非實時調度器(user)&#xff0c;系統中大部分進程由非實時調度器調度&#xff0c;獲得CPU能力弱。實時調度器實時調度器支持的調度策略&#…