react(基礎篇)

React由Meta公司研發,用于構建Web和原生交互界面的庫。

React 官方中文文檔

查看JSX

(一)React組件

  • 用戶界面的一部分,通俗的來講,最小的元素組成的單元,可以實現部分邏輯與功能

  • 房子的門就可以看成一個組件,由木板和木方組成,有一定功能和作用,多個組件組合就可以形成房子了。

  • 組件之間可以相互嵌套,重復使用

React組件

  • React中,組件就是一個首字母大寫的函數,內部存放組件的邏輯和視圖UI,使用組件只需將組件當成標簽寫即可

  • 組件也不能返回多個 JSX 標簽,必須將它們包裹到一個共享的父級中,比如 <div>...</div> 或使用空的 <>...</> 包裹:

  • 組件只負責自己的任務。 它不會更改在該函數調用前就已存在的對象或變量。

  • 組件輸入相同,則輸出相同。 給定相同的輸入,組件應該總是返回相同的 JSX。

function MyButton() {return(<button >點了我</button>);
}const App = () => {return <MyButton ></MyButton>;};

Hook(鉤子函數)

hook是特殊的函數,搭配函數組件一起使用,使其功能更強大

hook使用規則

  • 只能在頂層調用Hooks,不要在循環、條件判斷或者嵌套函數中調用。
  • 只能在React函數組件或自定義Hook中調用Hooks。

(二)useState

為組件設置state可以讓組件擁有記憶,完成交互

特點

  • State 變量 用于保存渲染間的數據。

  • State setter 函數 更新變量并觸發 React 再次渲染組件

  • 只能在組件或[自定義 Hook]的最頂層調用

快速入門

  1. 在文件頂部導入useState

    import { useState } from 'react';
    
  2. 創建一個useState

    const [index, setIndex] = useState(0);
    

    useState 的唯一參數是 state 變量的初始值

useState細節理解

  1. 狀態更新是異步的

    React 會將多個狀態更新合并,以提高性能。因此,狀態更新不會立即生效,而是會在下一次渲染時生效。

  2. 批量更新

    在 React 的事件處理函數中,多個狀態更新會被批量處理,只觸發一次重新渲染。

useState更新原理

State通過setState更新,實際上State只是可讀的,setState更新只是將原來的值替換掉,而并非修改原數據

  1. 更新State對象

    通過...對象展開符快速跟新對象

    const [user, setUser] = useState({ name: 'Alice', age: 25 });// 更新年齡
    const updateAge = () => {setUser(prev => ({ ...prev, age: 26 }));
    };
    
  2. 更新State數組

    注意:即使你拷貝了數組,你還是不能直接修改其內部的元素,因為數組拷貝是淺拷貝

    避免使用 (會改變原始數組)推薦使用 (會返回一個新數組)
    添加元素pushunshiftconcat[...arr] 展開語法
    刪除元素popshiftsplicefilterslice
    替換元素splicearr[i] = ... 賦值map
    排序reversesort先將數組復制一份,再排序

受控表單

使用react組件狀態控制表單

const App = () => {const [value, setValue] = useState('');return (<><inputvalue={value}onChange={(e)=>setValue(e.target.value)}type="text"/></>)
};

如何構建State

  1. 先根據react數據驅動視圖的特點,頁面哪些UI狀態改變會導致界面改變,就給它定義個State控制界面更新
  2. 然后根據構建State原則對State進行優化

構建State的原則

狀態提升

要從多個子組件收集數據,或讓兩個子組件相互通信,請改為在其父組件中聲明共享 state。父組件可以通過 props 將該 state 傳回給子組件。這使子組件彼此同步并與其父組件保持同步。

(三)props

React中使用props進行參數傳遞

//value=0進行默認賦值,當value=null就讀取默認值0
function Square({value=0, onSquareClick}) {return (<button className="square" onClick={onSquareClick}>{value}</button>);
}export default function App(){return(<div className="board-row"><Square value="1" onSquareClick={() => handleClick(0)}/><Square value="2" onSquareClick={() => handleClick(1)}/><Square value="3" onSquareClick={() => handleClick(2)}/></div>);
}

children屬性

props.children 是一個特殊的屬性,用于傳遞組件包裹的子元素(子節點)

children 可以是以下任意類型:

  • 字符串:直接作為文本內容。
  • React 元素:如 <div>、自定義組件等。
  • 數組:多個子元素組成的數組。
  • 函數:通過函數模式實現動態渲染(即 Render Props 模式)。
  • 空值nullundefinedfalse(不會被渲染)。
<Child><h1>標題</h1><p>段落</p>
</Child>// Child 組件內部:
function Child(props) {return <div>{props.children}</div>; // 同時渲染標題和段落
}

(四)UseContext跨層傳遞參數

Context是一種跨組件層級傳遞數據的機制,適合全局數據(如用戶信息、主題、語言等),區別于props逐層傳遞。

  • Provider:通過 <MyContext.Provider value={data}> 向子組件樹傳遞數據。
  • Consumer:通過 useContext(MyContext) 直接獲取最近一層 Provider 提供的數據。

示例

假設有 3 層組件:ParentChildGrandchild,需要將用戶信息從 Parent 直接傳遞到 Grandchild,無需經過 Child 中轉。

// UserContext.js
import { createContext } from 'react';export const UserContext = createContext({ name: '默認用戶', age: 0 
});
// Parent.jsx
import { UserContext } from './UserContext';
import Child from './Child';const Parent = () => {const user = { name: "小明", age: 20 };return (<UserContext.Provider value={user}><div><h2>Parent 組件</h2><Child /> {/* 子組件不需要傳遞任何 props! */}</div></UserContext.Provider>);
};
// Child.jsx
import Grandchild from './Grandchild';const Child = () => {return (<div><h3>Child 組件</h3><Grandchild /> {/* 同樣無需傳遞 props */}</div>);
};
// Grandchild.jsx
import { useContext } from 'react';
import { UserContext } from './UserContext';const Grandchild = () => {const user = useContext(UserContext); // 直接獲取數據return (<div><h4>Grandchild 組件</h4><p>用戶名:{user.name}</p><p>年齡:{user.age}</p></div>);
};

(五)UseReducer集中狀態管理

useReducer – React 中文文檔

const [state, dispatch] = useReducer(reducer, initialState)

useReducer類似useState管理組件狀態,而UseReudcer集中狀態管理,管理方式類似“告訴reducer函數用戶進行了什么操作“

參數

  • initialState:初始化狀態
  • reducer函數:負責集中管理更新狀態(組件狀態更新就是在這里面)

返回值

  • state:目前狀態
  • dispatch函數:主要負責記錄用戶進行了什么操作并記錄值,比如點擊更新按鈕、點擊刪除按鈕等

如何將State狀態遷移至Reducer中

用State進行狀態管理的Todo清單

function TodoList() {const [todos, setTodos] = useState([]);const [input, setInput] = useState('');const addTodo = () => {setTodos([...todos, input]);setInput('');};return (<div><inputtype="text"value={input}onChange={(e) => setInput(e.target.value)}/><button onClick={addTodo}>Add Todo</button><ul>{todos.map((todo, index) => (<li key={index}>{todo}</li>))}</ul></div>);
}

用Reducer進行狀態管理的Todo清單

const initialState = {todos: [],input: '',
};function reducer(state, action) {switch (action.type) {case 'updateInput':return { ...state, input: action.payload };case 'addTodo':return { ...state, todos: [...state.todos, state.input], input: '' };default:return state;}
}function TodoList() {const [state, dispatch] = useReducer(reducer, initialState);return (<div><inputtype="text"value={state.input}onChange={(e) => dispatch({ type: 'updateInput', payload: e.target.value })}/><button onClick={() => dispatch({ type: 'addTodo' })}>Add Todo</button><ul>{state.todos.map((todo, index) => (<li key={index}>{todo}</li>))}</ul></div>);
}

(六)性能提升

React.memo

用memo包裹的組件擁有記憶緩存,當props沒有改變該組件不會重新渲染

React.memo(function MyComponent(props){},可選參數)

特點

  • props與上一次相同(是同一個),如果props是對象或者數組,重新創建一個相同的新的,React也會認為不同,所以通常useMemo、useCallback一起使用
  • useContext多層傳參也會導致Memo包裹的組件重新渲染,所以一般在外層接收作為props傳入

useMemo

useMemo(函數,依賴數組),useMemo組成通常是函數和依賴數組,可以在每次重新渲染緩存計算結果(函數的返回值)

  • 函數是任意不帶參的函數(一般用箭頭函數),可返回任意值

  • 依賴數組:一般是props或useState

const TodoList=useMemo(()=>todo(tab,list),[tab,list])

useCallback

useCallback用來緩存函數,當依賴數組不發生改變時,函數不變,效果類似useMemo

useCallback(fn,dependencies)

區別useMemo和useCallback

區別useMemouseCallback
主要用途用于記憶計算結果用于記憶定義函數
返回值返回計算結果返回記憶函數
使用場景避免昂貴的計算避免不必要的子組件重新渲染

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

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

相關文章

數據結構-哈希表(一)哈希函數、哈希表介紹、優缺點

哈希表 哈希函數哈希表使用了哈希函數來完成key到地址的快速映射&#xff0c;所以在了解哈希表之前&#xff0c;需要先明白哈希函數的概念和特點。 哈希函數的定義 哈希函數 哈希函數是一種將任意長度輸入的數據&#xff0c;轉換成固定長度輸出的算法哈希函數H可以表示為yH(x) …

Shader開發(一)什么是渲染

前言在現代游戲開發和計算機圖形學領域&#xff0c;渲染技術是連接虛擬世界與視覺呈現的關鍵橋梁。無論你是剛接觸圖形編程的新手&#xff0c;還是希望深入理解渲染原理的開發者&#xff0c;掌握渲染的核心概念都是必不可少的第一步。什么是渲染&#xff1f;渲染&#xff08;Re…

策略模式+工廠模式(案例實踐易懂版)

最近,可以說這2025年度,自己更文的次數都大大減少,主要最近大環境不景氣,自己職業也受到波及,學習的東西也是因為AI而變得更多, 沒辦法,你不學,總有人會學,關于AI的我也準備出個專輯,相信絕對幫助到大家 額,好像說多了,言歸正傳,我們看一下今天的主題:策略模式工廠模式 本文主要…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - snowNLP庫實現中文情感分析

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解snowNLP庫實現中文情感分析 視頻在線地址&…

大根堆,小根堆,雙指針

碼蹄集OJ-大約 #include<bits/stdc.h> using namespace std; priority_queue<int>max2,maxDel; priority_queue<int,vector<int>,std::greater<int>>min2,minDel; const int N1e51; int n,result0,a[N]; int main( ) {cin>>n;for(int i1…

RS485和Modbus

UART協議中&#xff0c;空閑狀態為高電平&#xff0c;也就是1,R25和R27&#xff0c;485收發器特性MAX485 (美信)SSP485 (國產替代)AZRS3080 (安格)供電電壓5V5V3.3V ~ 5.5V靜態電流300μA (接收模式)120μA (接收模式)150μA (接收模式)傳輸速率2.5Mbps10Mbps20Mbps總線負載能力…

【Android】交叉編譯faiss庫 | 問題解決

目錄 一 解決 FAISS 交叉編譯到 Android 時的 BLAS/MKL 依賴問題 二 交叉編譯faiss ■禁用 BLAS并交叉編譯faiss ■使用 OpenBLAS 的 Android 移植版本并交叉編譯faiss 三 報錯處理 ■報錯 ■SWIG 一 解決 FAISS 交叉編譯到 Android 時的 BLAS/MKL 依賴問題

《使用 IDEA 部署 Docker 應用指南》

使用 IDEA 部署 Docker 應用的詳細步驟 一、創建 Dockerfile 配置文件 在項目根目錄下創建Dockerfile文件&#xff0c;配置內容如下&#xff1a; # 使用官方的OpenJDK鏡像作為基礎鏡像 FROM openjdk:17-jdk-slim# 設置維護者信息(可選) LABEL maintainer"三木豪"# 設…

【Docker#3】Window 和 Linux 上 docker安裝 相關知識

前置了解&#xff1a; X86 高并發&#xff1a;基于 x86 架構的處理器&#xff0c;在高負載下處理大量并發請求的能力。ARM &#xff1a;使用 ARM 架構處理器的移動設備&#xff0c;具有低功耗和高性能的特點。 操作系統&#xff1a; CentOS&#xff1a;基于 Red Hat Enterprise…

一次 POI 版本升級踩坑記錄

前言 結論先行。 開發過程中由于可能涉及到二次開發&#xff0c;若原系統開發時間久遠&#xff0c;沒有達成一致規范設計&#xff0c;導致風格各異&#xff0c;確實滿足當時開發場景&#xff0c;但增大了后續的更新的難度&#xff0c;容易出現俄羅斯套娃現象&#xff0c;新的更…

硬件設計學習DAY13——電源緩沖電路設計全解

每日更新教程&#xff0c;評論區答疑解惑&#xff0c;小白也能變大神&#xff01;" 目錄 一.緩沖電路介紹 1.1緩沖電路的作用 1.2寄生參數的來源 1.3緩沖電路的類型 1.4常見緩沖電路設計 1.5設計原則 二.吸收與緩沖 2.1吸收與緩沖的核心作用 2.2電壓尖峰與吸收措…

鴻蒙搜狐新聞如何在Native調用ArkTS方法

01前言鴻蒙作為一款新興的智能操作系統&#xff0c;現在適配鴻蒙系統的應用越來越多&#xff0c;同時會面臨三端兼容問題&#xff0c;如同一產品功能&#xff0c;需要維護iOS、Android、鴻蒙三端代碼。拿文件上傳、下載功能場景舉例&#xff0c;同時要適配iOS、Android、鴻蒙三…

Java行為型模式---中介者模式

中介者模式基礎概念中介者模式&#xff08;Mediator Pattern&#xff09;是一種行為型設計模式&#xff0c;其核心思想是通過一個中介對象來封裝一系列對象之間的交互&#xff0c;使各對象不需要顯式地相互引用&#xff0c;從而降低耦合度&#xff0c;并可以獨立地改變它們之間…

Python爬蟲實戰:研究Korean庫相關技術

一、引言 1.1 研究背景與意義 隨著韓流文化在全球的傳播,韓語網頁內容急劇增加。韓國在科技、娛樂等領域的信息具有重要研究價值。然而,韓語獨特的黏著語特性(如助詞體系、詞尾變化)給信息處理帶來挑戰。傳統爬蟲缺乏對韓語語言特點的針對性處理,本研究旨在開發一套完整…

表單校驗--數組各項獨立校驗

寫需求時遇到一個這樣的問題&#xff0c;就是校樣項是多個的&#xff0c;但是其字段名稱相同這時我們可以這樣校驗&#xff0c;注意字段之間的關聯性<div v-for"(item,index) in formData.hospitalDoctorList" :key"item.key || index"><el-form-…

基于SpringBoot和leaflet-timeline-slider的歷史敘事GIS展示-以哪吒2的海外國家上映安排為例

目錄 前言 一、哪吒2的海外之路 1、海外征戰歷程 2、上映國家空間查詢 二、后端接口的實現 1、模型層的實現 2、上映時間與國家 3、控制層的實現 三、基于leaflet-timeline-slider的前端實現 1、時間軸控件的引入及定義 2、時間軸綁定事件 3、成果展示 四、總結 前言…

tar 解壓:Cannot change ownership to uid 1000, gid 1000: Operation not permitted

tar 解壓 tar.gz 壓縮包報錯&#xff1a; # tar xzf $INPUT_FOLDER/archive.tar.gz -C /mnt/test-nas/[..] tar: xx.jpg: Cannot change ownership to uid 1000, gid 1000: Operation not permitted原因是用普通用戶執行的解壓縮腳本&#xff0c;用root用戶執行tar解壓縮&…

騰訊客戶端開發面試真題分析

以下是針對騰訊客戶端開發工程師面試問題的分類與高頻問題分析&#xff08;基于??105道問題&#xff0c;總出現次數118次??&#xff09;。按技術領域整合為??7大類別??&#xff0c;按占比排序并精選高頻問題標注優先級&#xff08;1-5&#x1f31f;&#xff09;&#x…

線上問題排查之【CPU飆高100%】

目錄 案例 發現問題 排查問題 步驟一 步驟二 步驟三 案例 import java.util.concurrent.TimeUnit;/*** 簡單寫一個CPU飆高的案例*/ public class CpuLoadUp {// 這里定義了一個標識private volatile static int flag 0;public static void main(String[] args) {// 執行…

c語言 進階 動態內存管理

動態內存管理1. 為什么存在動態內存分配2. 動態內存函數的介紹?2.1 malloc 和 freemalloc 函數free 函數2.2內存泄漏2.3 calloc2.4 realloc3. 常見的動態內存錯誤3.1 對NULL指針的解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放一塊…