【React】React18 Hooks之useState

目錄

  • useState
    • 案例1(直接修改狀態)
    • 案例2(函數式更新)
    • 案例3(受控表單綁定)
    • 注意事項1:set函數不會改變正在運行的代碼的狀態
    • 注意事項2:set函數自動批量處理
    • 注意事項3:在下次渲染之前多次更新同一狀態
  • 最后

在這里插入圖片描述

React官方文檔

useState

useState在組件的頂層調用來聲明和操作狀態變量。用法:

const [state, setState] = useState(initialState)

useState返回一個包含兩個值的數組:

  • state:當前狀態。在第一次渲染時,它將匹配initialState傳遞的數據。
  • setState:該set函數可將狀態更新為不同的值并觸發重新渲染。set函數沒有返回值
  • initialState:狀態的初始值,它可以是任何類型的值,如果是函數,則將函數返回值作為初始值

案例1(直接修改狀態)

import {useState} from 'react'
function App(){const [count,setCount] = useState(0);return (<><div>count:{count}</div><button onClick={()=>setCount(1)}>+</button></>)
} 
export default App

點擊加號,頁面中count變成1,繼續點擊加號,count值不變

案例2(函數式更新)

import {useState} from 'react'
function App(){const [count,setCount] = useState(0)const handlerClick = ()=>{setCount(count+1)}return (<><div>count:{count}</div><button onClick={handlerClick}>+</button></>)
} export default App

點擊加號按鈕,可以看到頁面中數據改變,并且hooks中的State狀態也隨之改變
在這里插入圖片描述

案例3(受控表單綁定)

import {useState} from 'react'
function App(){// 1 先聲明一個react 狀態const [value,setValue] = useState('')//2 核心// (1)通過value屬性綁定react狀態// (2)綁定onChange事件,通過事件參數e拿到輸入框的最新的值,反向修改react狀態return (<><div><input type='text'value={value}onChange={(e)=>setValue(e.target.value)}></input></div></>)
} export default App

在輸入框中輸入“張三”,hooks中的State也隨之改變
在這里插入圖片描述
要點一:set函數是異步的,調用set函數后,不能立即獲取最新的值

const [count,setCount] = useState(0)
const handlerClick = () => {setCount(count+1)console.log(count)//打印為0
}
const getCount = ()=>{console.log(count,"count")
}return (<><div>count:{count}</div><button onClick={handlerClick}>+</button><button onClick={getCount}>獲取set之后數據</button></>)

先點擊加號按鈕,會打印出“0”,隨后點擊獲取set之后數據按鈕,打印出count為1,說明點擊獲取set之后數據按鈕時獲取到了最新值。

注意事項1:set函數不會改變正在運行的代碼的狀態

set函數是異步的,調用set函數后,不能立即獲取最新的值。


const [count,setCount] = useState(0)function handleClick() {console.log(count);  // 0setCount(count + 1); // 重新渲染console.log(count);  // 打印 0!setTimeout(() => {console.log(count); // 打印 0!}, 5000);
}return (<div>count:{count}</div><button onClick={handleClick}>+</button>
)

這是因為狀態的行為類似于快照。更新狀態會請求使用新狀態值進行另一次渲染,但不會影響count已在運行的事件處理程序中的 JavaScript 變量。

狀態變量可能看起來像您可以讀取和寫入的常規 JavaScript 變量。但是,狀態的行為更像是快照。設置它不會更改已有的狀態變量,而是觸發重新渲染。

如果需要更新后的狀態,可以提前設置一個變量。

const nextCount = count + 1;
setCount(nextCount);console.log(count);     // 0
console.log(nextCount); // 1

注意事項2:set函數自動批量處理

React 18之前只會在只在合成事件與鉤子函數中自動批量處理,在promise、setTimeout或js原生事件中,都不會進行批處理。

React 18之后,默認所有的更新都會自動批量處理,只渲染一次。**更新多個狀態變量(甚至來自多個組件),不會觸發太多重新渲染,在事件處理程序及其中的任何代碼完成后,UI 才會更新。

設置狀態只會在下一次渲染時更改它。在第一次渲染期間,info 為{ name: “張三”, age: 1 },這就是為什么在該渲染的onClick處理程序中,即使調用了setInfo,info的值依然為{ name: “張三”, age: 1 }

React等待事件處理程序中的所有代碼運行完畢后再處理狀態更新。這就是為什么重新渲染只發生在所有這些setInfo()調用之后。

	const [info, setInfo] = useState({ name: "張三", age: 1 })const handlerClick = () => {setTimeout(() => {setInfo({ ...info, name: "里斯" })setInfo({ ...info, name: "1" })setInfo({ ...info, name: "2" })setInfo({ ...info, name: "3" })setInfo({ ...info, name: "4" })setInfo({ ...info, name: "5" })setInfo({ ...info, name: "6" })setInfo({ ...info, name: "7" })setInfo({ ...info, name: "8" })setInfo({ ...info, name: "9" })setInfo({ ...info, name: "10" })setInfo({ ...info, name: "11" })setInfo({ ...info, age: "12" })}, 0)}

頁面中顯示為name-張三 age-12,只有age改變,name沒有改變

注意事項3:在下次渲染之前多次更新同一狀態

傳遞一個根據隊列中的前一個狀態計算下一個狀態的函數setNumber(n => n + 1),比如。這是一種告訴 React “對狀態值做一些事情”而不是僅僅替換它的方法。
這里,n => n + 1稱為更新函數。當您將其傳遞給狀態設置器時:

React 將此函數排隊,以便在事件處理程序中的所有其他代碼運行完畢后進行處理。
在下一次渲染期間,React 會遍歷隊列并提供最終更新的狀態。

const [info, setInfo] = useState({ name: "張三", age: 1 })
setTimeout(() => {setInfo((n)=>({ ...n, name: "里斯" }))setInfo((n)=>({ ...n, age: 0 }))
}, 0)

頁面中顯示為name-里斯 age-0,name和age都改變

最后

ONLYOFFICE發布了一個插件比賽,面向所有人,為 ONLYOFFICE 開發適合中國用戶的插件,可贏取稅前5500 - 10000元的結項獎金與證書:https://mp.weixin.qq.com/s/DE1-n8fMli5PueCp4m-_KQ

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

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

相關文章

實現基于Spring Security的權限管理系統

實現基于Spring Security的權限管理系統 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代Web應用中&#xff0c;權限管理系統是至關重要的組成部分。通過…

[數據集][目標檢測]護目鏡檢測數據集VOC+YOLO格式888張1類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;888 標注數量(xml文件個數)&#xff1a;888 標注數量(txt文件個數)&#xff1a;888 標注類別…

ORB 特征點提取

FAST關鍵點 選取像素p&#xff0c;假設它的亮度為Ip&#xff1b; . 設置一個閾值T&#xff08;比如Ip的20%&#xff09;&#xff1b; 以像素p為中心&#xff0c;選取半徑為3的圓上的16個像素點&#xff1b; 假如選取的圓上&#xff0c;有連續的N個點的亮度大于IpT或小于…

Redis 八股文

標題 1. Redis主從同步原理&#xff1a;判斷下線的條件:故障轉移如何保證Sentinel高可用 1. Redis主從同步原理&#xff1a; 1、slave執行命令向master建立連接 2、master執行bgsave&#xff08;后臺存儲&#xff09;&#xff0c;生成rdb快照&#xff08;redis備份方式&#x…

FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的區別?

vTaskDelay 和 xTaskDelayUntil 是 FreeRTOS 提供的兩種不同任務延遲函數&#xff0c;各自有其適用的場景和優缺點。vTaskDelay 適用于簡單的延遲操作&#xff0c;而 xTaskDelayUntil 提供了精確的周期控制能力。在設計 FreeRTOS 應用程序時&#xff0c;根據任務的時間要求選擇…

日志自動分析-Web---360星圖GoaccessALBAnolog

目錄 1、Web-360星圖(IIS/Apache/Nginx) 2、Web-GoAccess &#xff08;任何自定義日志格式字符串&#xff09; 源碼及使用手冊 安裝goaccess 使用 輸出 3-Web-自寫腳本&#xff08;任何自定義日志格式字符串&#xff09; 4、Web-機器語言analog&#xff08;任何自定義日…

游戲AI的創造思路-技術基礎-強化學習(1)

我們“強化”一下機器的“學習”&#xff0c;讓機器變得更強~~~~ 目錄 1. 強化學習的定義 2. 發展歷史 3. 強化學習的基本概念和函數 3.1. 基本概念和函數 3.1.1. 基本概念和函數 3.1.2. Q函數 3.1.2.1. 定義與作用 3.1.2.2. 數學表示 3.1.2.3. 更新規則 3.1.2.4. 算…

AI時代算法面試:揭秘高頻算法問題與解答策略

三種決策樹算法的特點和區別 ID3算法&#xff1a;基本的決策樹算法&#xff0c;適用于簡單的分類問題C4.5算法&#xff1a;改進了ID3算法&#xff0c;適用于更復雜的分類問題&#xff0c;可以處理連續型數據和缺失值CART算法&#xff1a;更加通用的決策樹算法&#xff0c;適用于…

云服務器在 Web 應用程序中作用

云服務器在Web應用程序中扮演著至關重要的角色&#xff0c;它不僅是現代Web應用程序的基石&#xff0c;還是推動業務發展和提升用戶體驗的關鍵技術之一。下面將詳細探討云服務器在Web應用程序中的重要作用及其優勢。 首先&#xff0c;云服務器為Web應用程序提供了高度可擴展的…

【postgresql】索引

見的索引類型&#xff1a; B-tree 索引&#xff1a;這是最常用的索引類型&#xff0c;適用于大多數查詢。B-tree索引可以高效地處理范圍查詢。 Hash 索引&#xff1a;適用于等值查詢&#xff0c;但不支持范圍查詢。 GiST 索引&#xff1a;通用搜索樹&#xff08;GiST&#xf…

Flask自定義命令

Flask自定義命令 一、老版Flask自定義命令 Flask 1.x 和 2.x 版本 在Flask的老版本中&#xff0c;可以通過 flask-script 擴展來添加自定義命令。 安裝所需庫&#xff1a; pip3 install Flask-Script2.0.3 pip3 install flask1.1.4 pip3 install markupsafe1.1.1在 Flask 應…

懷念舊的Windows聲音?以下是如何在Windows 11中恢復它們

如果你渴望舊的Windows聲音,希望能在Windows 11上再次聽到,那你就很幸運了。我們將向你展示如何下載必要的聲音包并創建復古的聲音方案。 如何獲取舊Windows聲音的聲音包 你需要做的第一件事是下載一個包含舊Windows版本聲音的聲音包。此外,請確保它包含的每個聲音都是WAV…

在 Vue 項目中使用 FullCalendar

1、先安裝依賴包&#xff0c;根據自己的需求安裝&#xff0c;建議使用cnpm安裝&#xff0c;不然會很慢有時候會出現安裝不上的情況。 npm i fullcalendar/vue --save npm i fullcalendar/core --save // 在月視圖或日視圖中操作事件 npm i fullcalendar/daygrid --save // 在…

記錄discuz修改用戶的主題出售價格

大家好&#xff0c;我是網創有方的站長&#xff0c;今天遇到了需要修改discuz的主題出售價格。特此記錄下 方法很簡單&#xff1a; 進入用于組-》選擇論壇-》批量修改

【shell編程小項目】

目錄 一、項目拓撲二、要求三、shell編程 一、項目拓撲 二、要求 環境準備&#xff1a; 準備兩個虛擬機&#xff0c;按照環境配置好對應的 IP 地址和對應的主機名和 SSH 密鑰登錄在 workstation.exam.com 節點實現如下需求&#xff1a; 1、編寫 Shell 腳本&#xff0c;要求代碼…

0803實操-Windows Server系統管理

Windows Server系統管理 系統管理與基礎配置 查看系統信息、更改計算機名稱 網絡配置 啟用網絡發現 Windows啟用網絡發現是指在網絡設置中啟用一個功能&#xff0c;該功能允許您的計算機在網絡上識別和訪問其他設備和計算機。具體來說&#xff0c;啟用網絡發現后&#xff…

Qt5.9.9 關于界面拖動導致QModbusRTU(QModbusTCP沒有測試過)離線的問題

問題鎖定 參考網友的思路&#xff1a; Qt5.9 Modbus request timeout 0x5異常解決 網友認為是Qt的bug&#xff0c; 我也認同&#xff1b;網友認為可以更新模塊&#xff0c; 我也認同&#xff0c; 我也編譯了Qt5.15.0的code并成功安裝到Qt5.9.9中進行使用&#xff0c;界面拖…

Laravel文件存儲:云端數據管理的藝術

標題&#xff1a;Laravel文件存儲&#xff1a;云端數據管理的藝術 Laravel框架提供了一個強大的文件存儲抽象層&#xff0c;允許開發者以一致的方式與本地磁盤或云存儲服務&#xff08;如Amazon S3&#xff09;進行交互。文件存儲系統簡化了文件上傳、下載、移動和刪除等操作&…

Java面試之Java多線程常見面試題

1、什么是線程&#xff1f; 定義&#xff1a;線程是程序中的執行路徑&#xff0c;是操作系統進行調度的基本單位。它允許程序并發執行多個任務&#xff0c;提高程序的響應速度和資源利用率。 2、為什么需要線程&#xff1f; 1、提高并發性&#xff1a;線程允許程序同時執行多…

Mybatis原生使用

一、MyBatis初次使用 2.1 環境搭建步驟 MyBatis 的 API &#xff1a; https://mybatis.org/mybatis-3/zh/getting-started.html 1.引入依賴包 2.準備核心配置件 db.properties drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://123.57.206.19:3306/demo?useUnicodetrue&am…