重學React(一):描述UI

背景:React現在已經更新到19了,文檔地址也做了全面的更新,上一次系統性的學習還是在16-17的大版本更新。所以,現在就開始重新學習吧~

學習內容:

  1. React官網教程:https://zh-hans.react.dev/learn/describing-the-ui
  2. 其他輔助資料(看到再補充)
    補充說明:這次學習更多的是以學習筆記的形式記錄,看到哪記到哪
1. 基礎知識

React 應用是由被稱為 組件 的獨立 UI 片段構建而成。React 組件本質上是可以任意添加標簽的 JavaScript 函數
React 允許你將標簽、CSS 和 JavaScript 組合成自定義“組件”,即 應用程序中可復用的 UI 元素
React 組件是一段可以使用標簽進行擴展 的 JavaScript 函數,組件的名稱必須以大寫字母開頭(React的語法規定,這樣它才能分清是React組件還是正常的html標簽)

// export default 導出聲明
// function Profile 定義函數,function名必須首字母大寫export default function Profile() {
// return 如果換行,就必須用()將內容包裹
// 沒有括號包裹的話,任何在 return 下一行的代碼都將被忽略!return (<imgsrc="https://i.imgur.com/MK3eW3Am.jpg"alt="Katherine Johnson"/>)// 或者 標簽只有一行的時候括號可以省略return <img src="https://i.imgur.com/MK3eW3Am.jpg" alt="Katherine Johnson" />)
}// 你可以只定義組件一次,然后按需多處和多次使用
export default function Gallery() {return (<section><h1>了不起的科學家</h1><Profile /><Profile /><Profile /></section>);
}// 組件不建議嵌套組件定義,不然會很慢并且可能會有bug產生
export default function Gallery() {// 🔴 永遠不要在組件中定義組件function Profile() {// ...}// ...
}// 使用時可以import './Gallery.js' 或者 './Gallery',在 React 里都能正常使用,只是前者更符合 原生 ES 模塊
import Gallery from './Gallery';
import Gallery from './Gallery.js';
導出方式

默認導出 vs 具名導出
一個文件里有且僅有一個 默認 導出,但是可以有任意多個 具名 導出
當使用默認導入時,可以在 import 語句后面進行任意命名。比如 import Banana from ‘./Button.js’。相反,對于具名導入,導入和導出的名字必須一致。
同一文件中,有且僅有一個默認導出,但可以有多個具名導出

語法導出語句導入語句
默認export default function Button() {}import Button from ‘./Button.js’;
具名export function Button() {}import { Button } from ‘./Button.js’;
JSX
  1. 只能返回一個根元素
    在一個組件中包含多個元素,需要用一個父標簽把它們包裹起來,如果不想添加新的dom元素,可以使用<>...</>(Fragment),React Fragment 允許將子元素分組,而不會在 HTML 結構中添加額外節點
    原因:JSX 雖然看起來很像 HTML,但在底層其實被轉化為了 JavaScript 對象,你不能在一個函數中返回多個對象,除非用一個數組把他們包裝起來
  2. 標簽必須閉合
    這是強制規定,要么自閉合(<img />),要么添加閉合標簽(<li>...</li>)
  3. 使用駝峰式命名法給大部分屬性命名
    JSX 最終會被轉化為 JavaScript,而 JSX 中的屬性也會變成 JavaScript 對象中的鍵值對。組件經常會遇到需要用變量的方式讀取這些屬性的時候。但 JavaScript 對變量的命名有限制,所以需要避開這些限制
    1. 變量名稱不能包含 - 符號,所以屬性大部分用駝峰
    2. 變量不能用保留字如class,所以在jsx中用className代替
    3. 由于歷史原因,aria-* 和 data-* 屬性是以帶 - 符號的 HTML 格式書寫的

需要將一個字符串屬性傳遞給 JSX 時,把它放到單引號或雙引號

// "" 引號中的內容按照字符串的形式處理,單引號雙引號都可以,但使用雙引號會多點
// {} 大括號中的內容會被動態引用,直接在標簽中使用 JavaScript,可以在其他地方聲明,在使用的時候直接讀取js對應的值
// 大括號內的任何 JavaScript 表達式都能正常運行
export default function Avatar() {
const alt = "Gregorio Y. Zara"
//return (<imgclassName="avatar"src="https://i.imgur.com/7vQD0fPs.jpg"alt={alt}/>);
}

大括號使用場景:

  1. 用作 JSX 標簽內的文本:<h1>{name}'s To Do List</h1> 是有效的,但是 <{tag}>Gregorio Y. Zara's To Do List</{tag}> 無效。
  2. 用作緊跟在 = 符號后的 屬性:src={avatar} 會讀取 avatar 變量,但是 src="{avatar}" 只會傳一個字符串 {avatar}

在JSX中還可以傳遞對象,對象也是用大括號表示,所以要引用對象的時候就需要使用兩個括號
JSX 是一種模板語言的最小實現,因為它允許你通過 JavaScript 來組織數據和邏輯

Props

React 組件使用 props 來互相通信。每個父組件都可以提供 props 給它的子組件,從而將一些信息傳遞給它,包括對象、數組和函數等

import { getImageUrl } from './utils.js';
// props是組件的唯一參數
// function里使用大括號獲取props是解構
// 也可以寫成這樣
// function Avatar(props) {
//	const person = props.person
//	const size = props.size
// }
// 如果你想在沒有指定值的情況下給 prop 一個默認值,可以通過在參數后面寫 = 和默認值來進行解構
// 默認值僅在缺少 size prop 或 size={undefined} 時生效,等于null都不行
function Avatar({ person, size=100 }) {
// person 和 size 是可訪問的return (<imgclassName="avatar"src={getImageUrl(person)}alt={person.name}width={size}height={size}/>);
}export default function Profile() {
// 這樣使用不同的參數,就能展示出兩個類似但是又獨立的組件,這就是組件復用一個很重要的意義return (<div><Avatarsize={100}person={{ name: 'Katsuko Saruhashi', imageId: 'YfeOqp2'}}/><Avatarsize={80}person={{name: 'Aklilu Lemma', imageId: 'OKS67lh'}}/></div>);
}// 還可以使用 JSX 展開語法傳遞 props 
// 像這個場景,props里面所有的內容都是需要傳遞到Avatar組件中時,就可以直接用展開語法傳遞
function Profile({ person, size, isSepia, thickBorder }) {return (<div className="card"><Avatarperson={person}size={size}isSepia={isSepia}thickBorder={thickBorder}/></div>);
}
// 可以寫成這樣
function Profile(props) {return (<div className="card"><Avatar {...props} /></div>);
}
// 假設Profile 中isSepia不需要傳遞,其他都需要,還可以寫成這樣
function Profile({isSepia, ...rest}) {return (<div className="card"><Avatar {...rest} /></div>);
}

當你將內容嵌套在 JSX 標簽中時,父組件將在名為 children 的 prop 中接收到該內容
通俗的來說就是某個組件標簽內容,在接收的時候會自動處理成children的props
<Aaa><div>里面是一系列的內容</div> </Aaa>,在聲明Aaa這個組件時,有一個隱藏props,children,表示的就是div及其包裹的內容

可以將帶有 children prop 的組件看作有一個“洞”,可以由其父組件使用任意 JSX 來“填充”
在這里插入圖片描述

import Avatar from './Avatar.js';function Card({ children }) {return (<div className="card">{children}</div>);
}export default function Profile() {return (<Card><Avatarsize={100}person={{ name: 'Katsuko Saruhashi',imageId: 'YfeOqp2'}}/></Card>);
}

props 是 不可變的。當一個組件需要改變它的 props(例如,響應用戶交互或新數據)時,它不得不“請求”它的父組件傳遞 不同的 props —— 一個新對象!它的舊 props 將被丟棄,最終 JavaScript 引擎將回收它們占用的內存
Props 是只讀的時間快照:每次渲染都會收到新版本的 props
你不能改變 props。當你需要交互性時,你可以設置 state。

渲染

在 React 中,你可以通過使用 JavaScript 的 if 語句、&& 和 ? : 運算符來選擇性地渲染 JSX

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

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

相關文章

AI大模型:(二)2.3 預訓練自己的模型

目錄 1.預訓練原理 2.預訓練范式 1.未標注數據 2.標注數據 3.有正確答案、也有錯誤答案 3.手撕transform模型 3.1.transform模型代碼 3.2.訓練數據集 3.3.預訓練 3.4.推理 4.如何選擇模型

gradle可用的下載地址(免費)

這幾天接手一個老項目&#xff0c;想找gradle老版本的&#xff0c;但一搜&#xff0c;雖然在CSDN上搜索出來一堆&#xff0c;但都是收費&#xff0c;有些甚至要幾十積分(吃相有點難看了)。 我找了一個能訪問的地址&#xff0c;特地分享出來&#xff0c;有需要的自取&#xff01…

vue3新增特性

一、Vue 3 新增特性 1. Composition API 概述: Composition API 提供了一種更靈活和強大的方式來組織和復用邏輯。適用于復雜組件和邏輯復用場景。主要功能: setup 函數:組件的入口點,用于定義響應式數據、方法、生命周期鉤子等。響應式 API:ref 和 reactive 提供更細粒度…

前端性能優化全攻略:JavaScript 優化、DOM 操作、內存管理、資源壓縮與合并、構建工具及性能監控

1 為什么需要性能優化&#xff1f; 1.1 性能優化的核心價值&#xff1a;用戶體驗與業務指標 性能優化不僅是技術層面的追求&#xff0c;更是直接影響用戶體驗和業務成敗的關鍵因素。 用戶體驗&#xff08;UX&#xff09;&#xff1a; 響應速度&#xff1a;用戶期望頁面加載時…

【Unity筆記】Unity + OpenXR項目無法啟動SteamVR的排查與解決全指南

圖片為AI生成 一、前言 隨著Unity在XR領域全面轉向OpenXR標準&#xff0c;越來越多的開發者選擇使用OpenXR來構建跨平臺的VR應用。但在項目實際部署中發現&#xff1a;打包成的EXE程序無法正常啟動SteamVR&#xff0c;或者SteamVR未能識別到該應用。本文將以“Unity OpenXR …

Curl用法解析

Curl 用法解析 簡介 Curl 是一個強大的命令行工具&#xff0c;主要用于從服務器發送 HTTP 請求并獲取數據。它廣泛應用于調試 RESTful API、文件上傳下載、模擬用戶交互等多種場景。下面是一些基本用法及常見參數的分析&#xff1a; 基礎用法 curl [options] [URL]其中最基…

C語言教程(十一):C 語言中四種主要作用域及作用域嵌套遮蔽

一、引言 在 C 語言里&#xff0c;作用域指的是程序中變量、函數、類型等標識符能夠被使用的范圍。C 語言里有四種主要的作用域&#xff1a;塊作用域、函數作用域、文件作用域和原型作用域&#xff0c;下面為你展開介紹&#xff1a; 二、塊作用域 定義&#xff1a;塊作用域是 C…

初次嘗試Ghidra

最近看京東讀書上有本書叫《Ghidra權威指南》&#xff0c;竟然是美國國家安全局出品的逆向工具&#xff0c;我真是孤陋寡聞&#xff0c;第一次聽說。趕緊試試。 Release Ghidra 11.3.2 NationalSecurityAgency/ghidra GitHub 最新版本竟然是上周發布的&#xff0c;看來很活…

樂視系列玩機---樂視2 x620 x628等系列線刷救磚以及刷寫第三方twrp 卡刷第三方固件步驟解析

樂視2 x620 x628 x626等,搭載了Helio X20處理器,mtk6797芯片。 通過博文了解?????? 1??????-----詳細解析樂視2 x620系列黑磚線刷救磚的步驟 2??????----官方兩種更新卡刷步驟以及刷寫第三方twrp過程與資源 3??????----樂視2 mtk系列機型救磚 刷…

web原生API AbortController網絡請求取消方法使用介紹:防止按鈕重復點擊提交得最佳方案

在前端開發中&#xff0c;取消網絡請求是一個常見的需求&#xff0c;尤其是在用戶頻繁操作或需要中斷長時間請求的場景下。 AbortController 主要用于 ?優雅地管理和取消異步操作&#xff1a; 瀏覽器原生 API 一、代碼解析 1. ?創建 AbortController 實例 const controlle…

2025智能駕駛趨勢評估

以下是對2025年智能駕駛趨勢的評估&#xff1a; 技術發展 ? 自動駕駛級別提升&#xff1a;2025年有望成為L3級自動駕駛的商用元年。L3級自動駕駛技術開始從高端車型向20萬元以下價格帶下沉&#xff0c;部分車企如江淮和華為合作的尊界S800、小鵬汽車等都在積極推進L3級自動駕駛…

Spring MVC DispatcherServlet 的作用是什么? 它在整個請求處理流程中扮演了什么角色?為什么它是核心?

DispatcherServlet 是 Spring MVC 框架的絕對核心和靈魂。它扮演著前端控制器&#xff08;Front Controller&#xff09;的角色&#xff0c;是所有進入 Spring MVC 應用程序的 HTTP 請求的統一入口點和中央調度樞紐。 一、 DispatcherServlet 的核心作用和職責&#xff1a; 請…

Linux 內核中 cgroup 子系統 cpuset 是什么?

cpuset 是 Linux 內核中 cgroup&#xff08;控制組&#xff09; 的一個子系統&#xff0c;用于將一組進程&#xff08;或任務&#xff09;綁定到特定的 CPU 核心和 內存節點&#xff08;NUMA 節點&#xff09;上運行。它通過限制進程的 CPU 和內存資源的使用范圍&#xff0c;優…

【MATLAB第115期】基于MATLAB的多元時間序列的ARIMAX的預測模型

【MATLAB第115期】基于MATLAB的多元時間序列的ARIMAX的預測模型 ?一、簡介 ARIMAX?&#xff08;Autoregressive Integrated Moving Average with eXogenous inputs&#xff09;模型是一種結合自回歸&#xff08;AR&#xff09;、差分&#xff08;I&#xff09;、移動平均&a…

數據庫對象與權限管理-視圖與索引管理

一、視圖&#xff08;View&#xff09;管理 1. 視圖的定義與本質 視圖&#xff08;View&#xff09;是Oracle數據庫中的邏輯表&#xff0c;它不直接存儲數據&#xff0c;而是通過預定義的SQL查詢動態生成結果集。視圖的本質可以理解為&#xff1a; 虛擬表&#xff1a;用戶可…

IPoIB驅動接收路徑深度解析:從數據包到協議棧

引言 在InfiniBand網絡中,IPoIB(IP-over-InfiniBand)協議通過封裝和模擬以太網行為,使得傳統IP應用能夠無縫運行。其接收路徑是性能優化的關鍵環節,涉及硬件中斷處理、內存管理、協議解析等多個復雜步驟。本文以Linux內核中ipoib_ib_handle_rx_wc_rss函數為核心,結合IPo…

Oracle高級語法篇-分析函數詳解

Oracle 分析函數詳解 在Oracle數據庫中&#xff0c;分析函數&#xff08;Analytical Functions&#xff09;是一類非常強大的工具&#xff0c;它們允許在查詢結果集上進行復雜的計算和分析&#xff0c;而無需使用自連接或子查詢等復雜操作。本文將詳細介紹Oracle分析函數的使用…

使用 Nacos 的注意事項與最佳實踐

&#x1f4f9; 背景 Nacos 憑借其強大&#x1f4aa;的服務發現、配置管理和服務管理能力&#xff0c;成為構建分布式系統的得力助手。然而&#xff0c;要充分發揮 Nacos 的優勢&#xff0c;實現系統的高性能、高可用&#xff0c;掌握其使用過程中的注意事項和最佳實踐至關…

解決Python與Java交互亂碼問題:從編碼角度優化數據流

在現代軟件開發中&#xff0c;跨語言系統的集成已經成為日常工作的一部分。特別是當Python和Java之間進行交互時&#xff0c;編碼問題往往會成為導致數據傳輸錯誤、亂碼以及難以調試的主要原因之一。 你是否曾遇到過這種情境&#xff1a;Python腳本通過標準輸出返回了正確的數…

AI大模型-window系統CPU版安裝anaconda以及paddle詳細步驟-親測有效

window系統CPU版安裝anaconda以及paddle詳細步驟-親測有效 一 安裝anaconda 下載地址:anaconda下載 下載成功后,選擇非C盤安裝,按提示安裝即可修改鏡像文件 安裝成功后,運行anaconda軟件,若提示更新則點擊更新,更新完后,修改鏡像文件 找到用戶目錄下的.condarc文件,覆…