5.6 react組件化開發基礎

react 組件開發基礎

  • 組件分類與組件使用

  • 組件傳參

    • 父傳子 【函數數據傳值 實參 形參對應關系】

    • 子傳父

    • 插槽

    • 透傳 useContext 上下文(作用域)

    • 跨層級調用方法 通過子組件的實例對象useRef 直接調用子組件的方法 和數據

  • 狀態管理(非常多) useReducer

    • redux

    • redux-toolkit 最佳實踐

    • mobx

    • dva

  • 路由 react-router-dom

    • 配置式 路由 router.jsx

    • 將路由的代碼 直接寫入到 父組件里面

  • UI 庫 :antd 管理系統 antd mobile 移動端 app nutUi+taro 小程序

1.組件分類與組件使用

組件分類:

? 頁面級組件

? 業務組件

? 公共組件

組件使用步驟: 1創 2導 3使用 4傳值、

組件名: 必須使用大駝峰

  • 父組件

  ?import React from 'react'// 導入import AppHeader from '@/components/appHeader/AppHeader'export default function App() {return (<><AppHeader/><AppHeader> </AppHeader></>)}?
  • 子組件

  import React from 'react'import './index.less'export default function AppHeader() {return (<div>AppHeader</div>)}?

2.組件通信【單向數據流】

1.父傳子 子傳父

react 的組件就是一個普通函數

父傳子

組件使用: 父函數 調用 子函數

父組件 寫入實參

子組件 通過形參接受數據

  • 父組件

父組件 寫入實參: 通過 靜態屬性 或動態屬性 傳遞

  import Child from '@/components/child/Child'?export default ()=>{return (<Child title="我是爸爸傳遞的數據" num={1000} ? obj={name="張麻子"}> </Child>)}??
  • 子組件

子組件通過形參 props 全部一次性接收父組件傳遞的數據

  export default (props)=>{let {num,title,obj} = props;if(typeof num !='Number'){return 'num的數據格式錯誤'}if(Object.prototype.toString.call(obj) !='[object Object]'){return 'obj數據格式錯誤!'}return (<><div>我是兒子組件</div>{props.num}{obj.name}</>)}

2.子傳父

將父組件的方法 傳遞給子組件

子組件調用這個方法 直接修改父組件的數據

  • 父組件

  import Child from '@/components/child/Child'?export default ()=>{const [num,setNum] = useState(1000)const changeNum=(newNum)=>{setNum(newNum)}return (<Child title="我是爸爸傳遞的數據" num={num} changeNum={changeNum} ? obj={name="張麻子"}> </Child>)}
  • 子組件

  ?export default (props)=>{const {num,title,obj,changeNum} = props;return (<><div>我是兒子組件</div>{props.num}{obj.name} ??<button οnclick={()=>changeNum(num+1) > +++</button></>)

3.插槽

父組件 將 html 代碼 傳遞給子組件

父組件 傳遞給子組件的html代碼 全部會自動的 放到 props.children

props.children 值

如果父組件沒有傳遞html代碼 ,children 的值 是 undefined

如果父組件只傳遞了 一行html代碼 ,children 的值 就是一個對象(描述傳遞過來的html jsx )

如果父組件傳遞了 多行html代碼,children的值 就是 一個數組(包含多個對象)

  • 父組件

  <h1>我是爸爸組件的html代碼</h1><hr /><Son ><div>我是爸爸組件傳遞給兒子組件的 html代碼</div><table><thead><tr><th>姓名</th><th>年齡</th><th>成績</th></tr></thead><tbody><tr><td>嘻嘻嘻</td><td>22</td><td>88</td></tr></tbody></table></Son>
  • 子組件

  import React from 'react'?export default function Son(props) {const {children} = propsreturn (<> ? ? ?{children[1]}<h1>我是兒子組件自己的html代碼</h1>{children[0]}</>)}?

4.透傳 useContext createContext 上下文(作用域)

爺爺組件 可以直接傳遞數據 給孫子組件

跨層級 不限制

vue2 $bus eventBus 中央事件總線

  • 爺爺組件

商品信息 傳遞 --商品列表 Goods.jsx

  import {createContext,useState} from 'react'import Info from '@/components/info/Info'//在頂級組件 暴露之前必須定義好 上下文export const GoodsContext = createContext(null);?export default  ()=>{const [goodsInfo,setGoodsInfo] = useState({id:1122,title:'華為收集 mate6',price:5000})const changeGoodsInfo = ()=>{let goods = {...goodsInfo}goods.price++setGoodsInfo(goods)}return (<><GoodsContext.Provider value={goodsInfo}><Info /></GoodsContext.Provider>?<button onClick={changeGoodsInfo}>+</button></>)}?
  • 爸爸組件 Info.jsx

商品詳情組件

  import Order from '@/components/order/Order'export default ()=>{return (<><div>爸爸組件自己的內容</div><Order /></>)}
  • 孫子組件 Order.jsx

下單組件

  import {useContext} from 'react'import {GoodsContext} from '@/App2'export default ()=>{const goodsInfo = ?useContext(GoodsContext)return (<><div> 價格:{goodsInfo.price} </div></>)}

5.子組件的實例對象useRef useImperativeHandle

父組件 需要拿子組件的數據

  • 父組件

  import Son1 from '@/components/son1/Son1'import {useRef,useEffect} from 'react'export default ()=>{const sonRef = useRef(null);useEffect(()=>{let res = ?sonRef.current.getData()console.log(res);},[])return (<><div >爸爸組件自己的內容</div><Son1 ref={sonRef} /></>)}
  • 子組件

useImperativeHandle : 通過hoos 將子組件 想要暴露給 父組件的 方法和數據 暴露出去

  import {useState,useImperativeHandle} from 'react'?export default ({ref})=>{const [num,setNum] = useState(100)const getData = ()=>{return '我是子組件的方法,獲取數據的方法'}const changeNum = ()=>{setNum(num+1)}//  需要子組件通脫useImperativeHandle(ref,()=>{return {num,getData,} })?return (<><div> 價格:{num} </div><button onClick={changeNum}>+ </button></>)}
  • localStorage sessionStorage

6.路由 react-router v7

react 19 ===router v7

react16.8--react 18 ====router v6

react13-react16.8 ===reouterv5

1.創 2配 router.jsx 3.占位 4.測試

  • 安裝

  pnpm install react-router 
  • 創建頁面

  • router/index.jsx

  import {createBrowserRouter} from "react-router";import Home from '@/pages/home/Home'import Coding from '@/pages/coding/Coding'import Pins from '@/pages/pins/Pins'import Course from '@/pages/course/Course'import App from '@/App.jsx'import Following from '@/pages/following/Following'import Frontend from "@/pages/frontend/Frontend";const router = createBrowserRouter([{path:'/',Component:App,children:[{Component:Home,children:[{index:true,Component:Following},{path:'frontend',Component:Frontend},]},{path: "coding",Component:Coding},{path: "pins",Component:Pins},{path: "course",Component:Course}]}]);?export default router
  • main.jsx

  ?import { createRoot } from 'react-dom/client'import './index.css'?import { RouterProvider} from "react-router";import router from './router'?createRoot(document.getElementById('root')).render(<RouterProvider router={router}> </RouterProvider>)?
  • 占位

App.jsx 給所有一級路由占位

  import React from 'react'import { Outlet } from 'react-router'export default function App() {return (<><div>我是頂部</div><Outlet/></>?)}?

Home.jsx 給 home子頁面占位

  import React from 'react'import { Outlet } from 'react-router'export default function Home() {return (<><div className="left">左側菜單</div><div className="content"><Outlet></Outlet></div><div className="toplist">排行榜</div></>)}?

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

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

相關文章

【SF順豐】順豐開放平臺API對接(Java對接篇)

對接前置篇&#xff1a; 【SF順豐】順豐開放平臺API對接&#xff08;注冊、API測試篇&#xff09;_順豐api接口對接指南-CSDN博客 1.實現效果展示 2.SF順豐開放平臺&#xff0c;JDK資源下載。 下載地址&#xff1a;順豐開放平臺 3.將下載的JDK放入項目中。 4.將JDK資源引入p…

我用cursor 搭建了臨時郵箱服務-Temp Mail 365

用業余時間搭建了一個臨時郵箱&#xff0c;對于后端程序員出身的我&#xff0c;對前端了解的不太多&#xff0c;有了cursor的幫助&#xff0c;補齊了自己的短板&#xff0c;搭建了這個服務&#xff0c;下面對臨時郵箱架構設計與安全性做一個分析。 https://temp-mail-365.com 臨…

破解工業3D可視化困局,HOOPS Visualize助力高效跨平臺協作與交互!

一、當前3D可視化面臨的痛點 &#xff08;1&#xff09;性能瓶頸 現有的許多3D可視化工具在處理大型復雜模型時往往力不從心。例如在航空航天、汽車制造等高端制造業&#xff0c;動輒涉及數以億計的三角面片和海量的紋理細節。這些超大規模的模型在渲染時常常出現卡頓、延遲&…

1、Kafka與消息隊列核心原理詳解

消息隊列&#xff08;Message Queue, MQ&#xff09;作為現代分布式系統的基礎組件&#xff0c;極大提升了系統的解耦、異步處理和削峰能力。本文以Kafka為例&#xff0c;系統梳理消息隊列的核心原理、架構細節及實際應用。 Kafka 基礎架構及術語關系圖 術語簡要說明 Produce…

2025年北京市職工職業技能大賽第六屆信息通信行業網絡安全技能大賽初賽-wp

- -考試當場沒做出來 后面做的 misc ? cd misc ? ls num.docx num.zip ? unzip num.docx Archive: num.docxinflating: [Content_Types].xmlinflating: _rels/.relsinflating: word/document.xmlinflating: word/_rels/document.xml.relsextracting: word/media/image1.jp…

JavaScript 到命令和控制 (C2) 服務器惡意軟件分析及防御

攻擊始于一個經過混淆的JavaScript文件,該文件從開源服務中獲取編碼字符串以執行PowerShell腳本。然后,該腳本從一個IP地址和一個URL縮短器下載一個JPG圖像和一個文本文件,這兩個文件都包含使用隱寫術嵌入的惡意MZ DOS可執行文件。這些有效載荷一旦執行,就會部署Stealer惡意…

【計網】ipconfig、ping、arp、tracert

目錄 ipconfig ping arp tracert cmd ipconfig ipcofig -all IPv4 物理地址 ping 檢測網絡連通情況&#xff0c;分析網絡速度 根據域名得到服務器IP 根據TTL判斷對方所使用的操作系統以及數據包經過路由器數量 byte數據包大小 time響應時間 TTLDNS記錄在DNS服務器上存在…

WiFi那些事兒(八)——802.11n

目錄 802.11n 技術簡介與測試項 一、802.11n 技術簡介 &#xff08;一&#xff09;標準概述 &#xff08;二&#xff09;關鍵技術特性 1. MIMO&#xff08;多輸入多輸出&#xff09;技術 2. 信道綁定&#xff08;Channel Bonding&#xff09; 3. 幀聚合&#xff08;Fram…

碼蹄集——直角坐標到極坐標的轉換、射線、線段

目錄 MT1052 直角坐標到極坐標的轉換 MT1066 射線 MT1067 線段 MT1052 直角坐標到極坐標的轉換 思路&#xff1a; arctan()在c中是atan()&#xff0c;結果是弧度要轉換為度&#xff0c;即乘與180/PI 拓展&#xff1a;cos()、sin()在c代碼中表示方式不變 #include<bits/…

深入解析 Linux/Unix 通信機制:從原理到觀測實踐

深入解析 Linux/Unix 通信機制&#xff1a;從原理到觀測實踐 配圖建議&#xff1a;Linux系統架構與通信機制全景示意圖 一、開篇&#xff1a;理解“一切皆文件”的哲學 Unix/Linux 操作系統的核心靈魂在于其獨特的設計哲學。當 Dennis Ritchie 和 Ken Thompson 在貝爾實驗室開…

spring上傳文件添加水印

1、實現 MultipartFile package com.pojo.common.core.domain;import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream;import org.springframework.lang.Nullable; import org.springframework.util.Assert; im…

嵌入式MCU語音識別算法及實現方案

在嵌入式MCU&#xff08;微控制器單元&#xff09;中實現語音識別&#xff0c;由于資源限制&#xff08;如處理能力、內存、功耗等&#xff09;&#xff0c;通常需要輕量級算法和優化技術。以下是常見的語音識別算法及實現方案&#xff1a; 一、傳統語音識別算法 動態時間規整&…

【論文閱讀】DETR+Deformable DETR

可變形注意力是目前transformer結構中經常使用的一種注意力機制&#xff0c;最近補了一下這類注意力的論文&#xff0c;提出可變形注意力的論文叫Deformable DETR&#xff0c;是在DETR的基礎上進行的改進&#xff0c;所以順帶著把原本的DETR也看了一下。 一、DETR DETR本身是…

大模型在宮頸癌診療全流程預測與應用研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 二、大模型預測宮頸癌術前風險 2.1 術前數據收集與預處理 2.2 預測模型構建與算法選擇 2.3 術前風險預測指標與案例分析 三、大模型輔助制定術中方案 3.1 術中風險動態監測與預測 3.2 基于預測的手術方案優化…

【Python 文件I/O】

Python 的文件 I/O 操作是數據處理的基礎技能&#xff0c;涉及文件的讀寫、路徑管理、異常處理等核心功能。以下是文件 I/O 的核心知識點&#xff1a; 一、基礎文件操作 1. 打開文件 # 通用模式&#xff1a;r(讀)/w(寫)/a(追加) b(二進制)/t(文本&#xff0c;默認) f open(…

Twin Builder 中的電池等效電路模型仿真

電池單元熱設計挑戰 電池熱管理的主要挑戰之一是確保溫度低于最大工作限值。較高的溫度會導致效率降低、加速老化和潛在的安全隱患。工程師必須了解電池產生的熱量&#xff0c;才能充分設計冷卻系統。 了解和預測電池模塊的熱行為需要將電池的熱損耗與電池單元的電氣機械特性…

一種基于條件生成對抗網絡(cGAN)的CT重建算法

簡介 簡介:該文提出了一種基于條件生成對抗網絡(cGAN)的CT重建算法,通過引入CBAM注意力機制增強網絡對關鍵特征的提取能力,有效解決了CT成像中因噪聲干擾導致的重建精度下降問題。實驗采用固體火箭發動機模擬件數據集,將正弦圖分為五組并添加不同程度的噪聲進行訓練。結…

【Redis篇】linux 7.6安裝單機Redis7.0(參數優化詳解)

&#x1f4ab;《博主主頁》&#xff1a; &#x1f50e; CSDN主頁 &#x1f50e; IF Club社區主頁 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(MongoDB)有了…

【BUG】‘DetDataSample‘ object has no attribute ‘_gt_sem_seg‘

問題&#xff1a; 使用mmdetection框架使用COCO格式訓練自定義數據集時&#xff0c;其中模型使用HTC模型時出現如下問題&#xff1a; AttributeError: ‘DetDataSample’ object has no attribute ‘_gt_sem_seg’. Did you mean: ‘gt_sem_seg’? results self(**data, mode…

Java日期格式化方法總結

在Java中&#xff0c;日期格式化主要涉及將 Date、LocalDate、LocalDateTime 等日期時間對象轉換為指定格式的字符串&#xff0c;或將字符串解析為日期對象。以下是兩種常用的日期格式化方式&#xff1a; 一、使用 SimpleDateFormat&#xff08;舊版API&#xff0c;Java 8之前&…