React組件化的封裝

1. 組件化封裝的結構

  • 1.1. 定義一個類(組件名必須是大寫,小寫會被認為是html元素), 繼續自React.Component
  • 1.2. 實現當前組件的render函數
    • render當中返回的jsx內容,就是之后React會幫助我們渲染的內容
  • 1.3. 結構圖如下:
      data 方法render() // 具體渲染的內容
    

2. 組件化-數據依賴

組件化問題:數據在那里定義

  • 2.1. 在組件中的數據,可以分成兩類:
    • 參與界面更新的數據:當數據變化時,需要更新組件渲染的內容
    • 不參與界面更新的數據:當數據變化時,不需要更新組件渲染的內容
  • 2.2. 參與姐妹更新的數據又稱為參與數據流,這個數據定義在當前對象的state
    • 在構造函數中this.state = { 定義的數據 }
    • 當數據發生變化時,可以調用this.setState({更新的數據})來更新數據,并且通知React進行update操作
      • 在進行update操作時,就會重新調用render函數,并且使用最新的數據,來渲染界面。

3. 組件化-事件綁定

  • 3.1. 組件化問題二: ·事件綁定中的this·
    • 類中直接定義一個函數,并且將這個函數綁定到元素的onClick事件上,當前這個函數的this指向是undefined
  • 3.2. 默認情況下是undefined:(因為在babel轉化成嚴格模式或者ES6語法中類是嚴格模式嚴格模式下,this指向undefined)
    • 很奇怪,居然是undefined
    • 因為在正常的DOM操作中,監聽點擊,監聽函數中的this指向其實節點對象(比如說button對象)
    • 這次因為React并不是直接渲染成真實的DOM編寫的button只是一個語法糖,它的本質是React的Element對象
    • 那么在這里發生監聽時,react在執行函數時并沒有綁定this, 默認情況下就是一個undefined
  • 3.3. 在綁定的函數中,可能想要使用當前對象,比如執行this.setState函數,就必須拿到當前對象的this
    • 就需要在傳入函數時,給這個函數綁定this
    • 類似于
      constructor(props) {super()this.state = {message: 'hello World'}// 對需要綁定的方法,提前綁定好thisthis.btnClick = this.btnClick.bind(this)}{/* 寫法一:bind(this) */}{/* <button onClick={this.btnClick.bind(this)}>修改文本</button> */}{/* 寫法二:統一在構造函數中綁定this, 函數調用的時候不用bind(this) */} <button onClick={this.btnClick}>修改文本</button>
      

4. React數據事件處理

  • 4.1. 如果原生DOM有一個監聽事件,我們可以如何操作
    • 方式一:獲取DOM原生,添加監聽事件
    • 方式二:在HTML原生中,直接綁定onclick;
  • 4.2. 在React中是如何操作呢?React的事件監聽,主要有兩點不同:
    • React事件的命名采用小駝峰式(camelCase), 而不是純小寫
    • 需要通過{}傳入一個事件處理函數,這個函數會在事件發生時被執行;

5. React組件的分類重構代碼

  • 5.1. 組件分為:類組件和函數組件
    • 類組件: class App extends React.Component

      •       class App extends React.Component {constructor () {super()this.state = {message: 'hello world',counter: 100}}render () {const  { message } = this.statereturn  (<div><h2>{ message }</h2></div>)}}```
    • 函數組件:

      •   function App() {return (<div className="App"><header className="App-header"><img src={logo} className="App-logo" alt="logo" /><p>Edit <code>src/App.js</code> and save to reload.</p><aclassName="App-link"href="https://reactjs.org"target="_blank"rel="noopener noreferrer">Learn React</a></header></div>);}export default App;  
        

5. 編寫Hello_React案例

  • 5.1. 第一步:在界面上通過React顯示一個Hello World
    • 注意:編寫React的script代碼中,必須添加type="text/babel", 作用是可以讓babel解析jsx的語法
    • 完整代碼如下:
      <script type="text/babel">const root = ReactDOM.createRoot(document.querySelector('#root'))// 將文本定義成變量let message = 'hello World'const root = ReactDOM.createRoot(document.querySelector('#root'))root.render(<h2>{message}/h2>)</script>
    
    • 5.2. ReactDOM.createRoot函數:用于創建一個React根,之后的渲染的內容會包含在這個根中。

      • 參數:將渲染的內容,掛載到哪個HTML元素上
        • 根元素id為root的元素
    • 5.3. root.render()

      • 參數:要渲染的根組件
    • 5.4. 完整代碼:

        <!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><!-- 1. CDN引入 --><script crossorigin src="https://unpkg.com/react@18/umd/react.development.js"></script><script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script><script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script><!-- 2. 編寫React代碼 --><script type="text/babel">const root = ReactDOM.createRoot(document.querySelector('#root'))// 將文本定義成變量let message = 'hello World'// 監聽按鈕的點擊function btnClick () {  // 1.1 修改數據message = '你好啊 李銀河'// 1.2. 重新渲染界面(原因:React默認情況下不會重新執行渲染界面的, React是沒有黑魔法的,黑魔法:所有東西都是可見的)rootRender()}// 3. 封裝一個渲染函數function rootRender () {// 使用()把所有的html括號包裹起來,代表的是一個整體root.render((<div><h1>{message}</h1><button onClick={btnClick}>修改文本</button>  </div>))}rootRender()</script></body></html>
      

6. 使用組件重構代碼

  • 6.1 完整代碼如下:
  •   <!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',counter: 100}}render () {const  { message } = this.statereturn  (<div><h2>{ message }</h2></div>)}}// 2. 創建root并且渲染App組件const root = ReactDOM.createRoot(document.querySelector('#root'))root.render(<App/>)</script></body></html>  
    

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

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

相關文章

嵌入式仿真教學的革新力量:深圳航天科技創新研究院引領高效學習新時代

嵌入式系統作為現代信息技術的核心基石&#xff0c;已深度融入工業控制、物聯網、智能終端等關鍵領域。高校肩負著培養嵌入式技術人才的重任&#xff0c;但傳統教學方式正面臨嚴峻挑戰&#xff1a;硬件實驗設備投入巨大、更新滯后、維護繁瑣、時空限制嚴格&#xff0c;難以滿足…

六、Linux核心服務與包管理

作者&#xff1a;IvanCodes 日期&#xff1a;2025年8月3日 專欄&#xff1a;Linux教程 要保證一個Linux系統穩定、安全、功能完備&#xff0c;有效管理其后臺服務和軟件包是至關重要的。本文將深入介紹現代Linux系統中四個核心的管理工具&#xff1a;systemctl (服務管理)&…

【數據結構】哈希表實現

目錄 1. 哈希概念 2 哈希沖突和哈希函數 3. 負載因子 4. 將關鍵字轉為整數 5. 哈希函數 5.1直接定址法 5.2 除法散列法/除留余數法 5.3 乘法散列法&#xff08;了解&#xff09; 5.4 全域散列法&#xff08;了解&#xff09; 5.5 其他方法&#xff08;了解&#xff09…

PostgreSQL面試題及詳細答案120道(21-40)

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

數據建模及基本數據分析

目錄 &#xff08;一&#xff09;數據建模 1.以數據預測為核心的建模 2.以數據聚類為核心的建模 &#xff08;二&#xff09;基本數據分析 1.Numpy 2. Pandas 3.實例 4.Matplotlib 資料自取&#xff1a; 鏈接: https://pan.baidu.com/s/1PROmz-2hR3VCTd6Eei6lFQ?pwdy8…

電動汽車DCDC轉換器的用途及工作原理

在電動汽車的電氣架構中&#xff0c;DCDC轉換器&#xff08;直流-直流轉換器&#xff09;是一個至關重要的部件&#xff0c;負責協調高壓動力電池&#xff08;通常300V~800V&#xff09;與低壓電氣系統&#xff08;12V/24V&#xff09;之間的能量流動。它的性能直接影響整車的能…

PyTorch 應用于3D 點云數據處理匯總和點云配準示例演示

PyTorch 已廣泛應用于 3D 點云數據處理&#xff0c;特別是在深度學習驅動的任務中如&#xff1a; 分類、分割、配準、重建、姿態估計、SLAM、目標檢測 等。 傳統 3D 點云處理以 PCL、Open3D 為主&#xff0c;深度學習方法中&#xff0c;PyTorch 是構建神經網絡處理點云的核心框…

ABP VNext + Quartz.NET vs Hangfire:靈活調度與任務管理

ABP VNext Quartz.NET vs Hangfire&#xff1a;靈活調度與任務管理 &#x1f680; &#x1f4da; 目錄ABP VNext Quartz.NET vs Hangfire&#xff1a;靈活調度與任務管理 &#x1f680;? TL;DR&#x1f6e0; 環境與依賴&#x1f527; Quartz.NET 在 ABP 中接入1. 安裝與模塊…

[硬件電路-148]:數字電路 - 什么是CMOS電平、TTL電平?還有哪些其他電平標準?發展歷史?

1. CMOS電平定義&#xff1a; CMOS&#xff08;Complementary Metal-Oxide-Semiconductor&#xff09;電平基于互補金屬氧化物半導體工藝&#xff0c;由PMOS和NMOS晶體管組成。其核心特點是低功耗、高抗干擾性和寬電源電壓范圍&#xff08;通常為3V~18V&#xff09;。關鍵參數&…

0基礎網站開發技術教學(二) --(前端篇 2)--

書接上回說到的前端3種主語言以及其用法&#xff0c;這期我們再來探討一下javascript的一些編碼技術。 一) 自定義函數 假如你要使用一個功能&#xff0c;正常來說直接敲出來便可。可如果這個功能你要用不止一次呢?難道你每次都敲出來嗎?這個時侯&#xff0c;就要用到我們的自…

前端 拼多多4399筆試題目

拼多多 3 選擇題 opacity|visibity|display區別 在CSS中&#xff0c;opacity: 0 和 visibility: hidden 都可以讓元素不可見&#xff0c;但它們的行為不同&#xff1a; ? opacity: 0&#xff08;透明度為0&#xff09; 元素仍然占據空間&#xff08;不移除文檔流&#xff0…

數琨創享:全球汽車高端制造企業 QMS質量管理平臺案例

01.行業領軍者的質量升級使命在全球汽車產業鏈加速升級的浪潮中&#xff0c;質量管控能力已成為企業核心競爭力的關鍵。作為工信部認證的制造業單項冠軍示范企業&#xff0c;萬向集團始終以“全球制造、全球市場、做行業領跑者”為戰略愿景。面對奔馳、寶馬、大眾等“9N”高端客…

GaussDB 約束的使用舉例

1 not null 約束not null 約束強制列不接受 null 值。not null 約束強制字段始終包含值。這意味著&#xff0c;如果不向字段添加值&#xff0c;就無法插入新記錄或者更新記錄。GaussDB使用pg_get_tabledef()函數獲取customers表結構&#xff0c;如&#xff1a;csdn> set sea…

自動駕駛中的傳感器技術13——Camera(4)

1、自駕Camera開發的方案是否歸一化對于OEM&#xff0c;或者自駕方案商如Mobileye如果進行Camera的開發&#xff0c;一般建議采用Tesla的系統化最優方案&#xff0c;所有Camera統一某個或者某兩個MP設計&#xff08;增加CIS議價權&#xff0c;減少Camera PCBA的設計維護數量&am…

開源利器:glTF Compressor——高效優化3D模型的終極工具

在3D圖形開發領域,glTF(GL Transmission Format)已成為Web和移動端3D內容的通用標準。然而,3D模型的文件體積和紋理質量往往面臨權衡難題。Shopify最新開源的glTF Compressor工具,為開發者提供了一套精細化、自動化的解決方案,讓3D模型優化既高效又精準。本文將深入解析這…

LeetCode Hot 100,快速學習,不斷更

工作做多了有時候需要回歸本心&#xff0c;認真刷題記憶一下算法。那就用我這練習時長兩年半的代碼農民工來嘗試著快速解析LeetCode 100吧 快速解析 哈希 1. 兩數之和 - 力扣&#xff08;LeetCode&#xff09; 這題很簡單啊&#xff0c;思路也很多 1. 暴力搜索&#xff0c;…

MySQL的子查詢:

目錄 子查詢的相關概念&#xff1a; 子查詢的分類&#xff1a; 角度1&#xff1a; 單行子查詢&#xff1a; 單行比較操作符&#xff1a; 子查詢的空值情況&#xff1a; 多行子查詢&#xff1a; 多行比較操作符&#xff1a; ANY和ALL的區別&#xff1a; 子查詢為空值的…

Python批處理深度解析:構建高效大規模數據處理系統

引言&#xff1a;批處理的現代價值在大數據時代&#xff0c;批處理&#xff08;Batch Processing&#xff09; 作為數據處理的核心范式&#xff0c;正經歷著復興。盡管實時流處理備受關注&#xff0c;但批處理在數據倉庫構建、歷史數據分析、報表生成等場景中仍不可替代。Pytho…

是德科技的BenchVue和納米軟件的ATECLOUD有哪些區別?

是德科技的BenchVue和納米軟件的ATECLOUD雖然都是針對儀器儀表測試的軟件&#xff0c;但是在功能設計、測試場景、技術架構等方面有著明顯的差異。BenchVue&#xff08;是德科技&#xff09;由全球領先的測試測量設備供應商開發&#xff0c;專注于高端儀器控制與數據分析&#…

線上redis的使用

一.String1.緩存玩家單個數據&#xff0c;但是我覺得還是用hash好2.結合過期時間&#xff0c;比如:某個東西結算了&#xff0c;redis記錄一下&#xff0c;并設置過期時間3.分布式鎖二.Hash1.緩存一個單位的數據&#xff0c;比如&#xff1a;聯盟信息2.被封禁的列表&#xff0c;…