useState() 的使用及場景

useState是 React提供的一個Hook函數,用于在函數組件中添加和管理狀態。它允許你在函數組件中定義一個可變的狀態,并在組件的生命周期中對狀態進行更新和訪問。

使用useState可以避免使用類組件時需要定義和管理繁瑣的constructorstatesetState。它簡化了狀態管理的過程,使得函數組件的寫法更加簡潔和易于理解。

useState的基本用法如下:

import React, { useState } from 'react';function MyComponent() {// 使用useState定義狀態和更新狀態的函數const [count, setCount] = useState(0);// 在組件中使用狀態return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increase</button><button onClick={() => setCount(count - 1)}>Decrease</button></div>);
}

使用useState定義了一個名為count的狀態變量和一個名為setCount的用于更新該狀態的函數。

useState返回一個數組,數組的第一個元素是當前狀態的值,而第二個元素是用于更新狀態的函數。使用數組解構賦值方式,將這兩個值分別賦給countsetCount

可以在組件內部使用count變量來展示當前的計數值,而通過調用setCount函數來更新計數值。每次狀態更新時,React會自動重新渲染組件以反映新的狀態值。

需要注意的是,在調用setCount函數時,我們可以傳遞一個新的值給它,也可以使用函數式更新的方式,接收到當前狀態的值并返回基于當前狀態計算出的新值。

這就是useState的,它是React函數組件中進行狀態管理的重要工具之一。

什么時候需要使用 useState()

在React函數組件中,有一些情況下你可能需要使用useState來管理狀態。

  1. 組件內部需要維護和更新數據:如果你的組件需要維護一些數據,并在用戶操作或其他事件觸發時更新這些數據,那么可以使用useState來定義并更新這些狀態。
  2. 需要在UI中顯示和使用組件的狀態:useState可以幫助你在組件的渲染過程中展示狀態的值,以便讓用戶看到這些數據。你可以將狀態的值直接插入到JSX中,實時地反映狀態的變化。
  3. 局部狀態管理:useState適用于組件內部的局部狀態管理,即只在當前組件中維護和使用狀態。如果你只需要在當前組件內部使用狀態,并不需要在其他組件間共享這些狀態,那么useState是個很好的選擇。
  4. 業務邏輯相對簡單:useState適合管理相對簡單的狀態。當狀態的邏輯較為復雜、需要依賴多個狀態或需要進行大量計算時,你可能需要考慮使用其他更適合的狀態管理方案,比如使用useReducer或使用全局狀態管理庫。

總之,當你需要在React函數組件中管理某個組件內部的局部狀態,并希望在UI中顯示和使用這些狀態時,可以使用useState來定義和更新狀態。它是React提供的一種簡單、輕量級的狀態管理方案。

示例:

挑戰:?修復卡住的輸入表單

State:組件的記憶 – React 中文文檔 (docschina.org)

當你輸入字段時,什么也沒有出現。這就像輸入值被空字符串給“卡住”了。第一個 <input>value 設置為始終匹配 firstName 變量,第二個 <input>value 設置為始終匹配 lastName 變量。這是對的。兩個輸入框都有 onChange 事件處理函數,它嘗試根據最新的用戶輸入(e.target.value)更新變量。但是,變量似乎并沒有在重新渲染時“記住”它們的值。通過使用 state 變量來解決此問題。

問題代碼:

export default function Form() {let firstName = '';let lastName = '';function handleFirstNameChange(e) {firstName = e.target.value;}function handleLastNameChange(e) {lastName = e.target.value;}function handleReset() {firstName = '';lastName = '';}return (<form onSubmit={e => e.preventDefault()}><inputplaceholder="First name"value={firstName}onChange={handleFirstNameChange}/><inputplaceholder="Last name"value={lastName}onChange={handleLastNameChange}/><h1>Hi, {firstName} {lastName}</h1><button onClick={handleReset}>Reset</button></form>);
}

答案:
首先,從 React 導入 useState。然后用 useState 聲明的 state 變量替換 firstNamelastName。最后,用 setFirstName(...) 替換每個 firstName = ... 賦值,并對 lastName 做同樣的事情。不要忘記更新 handleReset,以使重置按鈕生效。

  const [firstName, setFirstName] = useState('');const [lastName, setLastName] = useState('');

什么時候不需要使用 useState()

useState是React中管理狀態的常見方式,但并不是在所有情況下都應該使用它。以下是一些情況下可以考慮不使用useState的情況:

  1. 不需要狀態管理:如果你的組件沒有需要更新和共享的狀態,或者只有一次性的操作,那么使用useState可能會顯得多余。在這種情況下,你可以簡單地使用函數組件來展示靜態內容。
  2. 使用其他狀態管理庫:如果你正在使用其他的狀態管理庫(如Redux或MobX),并且已經通過這些庫進行了全局狀態的管理,那么在一個局部的組件中使用useState可能會導致狀態的冗余和不一致。在這種情況下,你可以通過和狀態管理庫進行配合來管理組件的狀態。
  3. 需要共享狀態:如果你需要在多個組件之間共享狀態,而不僅僅是在單個組件內部使用,那么useState可能無法滿足需求。在這種情況下,你可以考慮使用更高級的狀態管理方案,如全局狀態管理庫或上下文(Context)來管理共享狀態。
  4. 需要復雜的狀態更新邏輯:如果你的狀態更新邏輯相對復雜,或者需要依賴于其他狀態的更新結果,那么僅使用useState可能會導致代碼變得混亂和難以維護。在這種情況下,你可以考慮自定義Hook或使用useReducer來更好地管理狀態更新邏輯。

總之,useState是React中一種常見的狀態管理方式,但它并不是適用于所有情況的唯一選擇。根據具體的場景和需求,你可以自由選擇適合的狀態管理方案。

示例代碼:

例如以下代碼是不需要使用 useState

import { useState } from 'react';export default function FeedbackForm() {const [name, setName] = useState('');function handleClick() {setName(prompt('What is your name?'));alert(`Hello, ${name}!`);}return (<button onClick={handleClick}>Greet</button>);
}

修改后:

直接 let 變量聲明即可


// import { useState } from 'react';export default function FeedbackForm() {// const [name, setName] = useState('');function handleClick() {const name = (prompt('What is your name?'));alert(`Hello, ${name}!`);}return (<button onClick={handleClick}>Greet</button>);
}

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

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

相關文章

HOT83-打家劫舍

leetcode原題鏈接&#xff1a;打家劫舍 題目描述 你是一個專業的小偷&#xff0c;計劃偷竊沿街的房屋。每間房內都藏有一定的現金&#xff0c;影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統&#xff0c;如果兩間相鄰的房屋在同一晚上被小偷闖入&#xff0c;系…

適配器模式(C++)

定義 將一個類的接口轉換成客戶希望的另一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。 應用場景 在軟件系統中&#xff0c;由于應用環境的變化&#xff0c;常常需要將“一些現存的對象 ”放在新的環境中應用&#xff0c;但是新環境要求…

【Golang】一文學完 Golang 基本語法

Golang 下載 安裝包鏈接&#xff1a;https://share.weiyun.com/InsZoHHu IDE 下載&#xff1a;https://www.jetbrains.com/go/ 第一個 golang 程序 package mainimport "fmt"func main() {fmt.Println("hello golang") }每個可執行代碼都必須包含 Pack…

Flutter 狀態管理 Provider

狀態管理必要性 Flutter基于聲明式構建UI&#xff0c;原生則是命令式&#xff0c;狀態管理是用于解決聲明式開發帶來的問題。 例&#xff1a;命令式的原生&#xff0c;數據更新需要拿到對應控件并更改其顯示值&#xff1b;而聲明式則需要更改數據值并通過setstate更新狀態&am…

sql高頻面試題-連續完成兩個指定動作的用戶統計

用戶行為分析 業務背景 某購物APP最近上線了一個新功能&#xff0c;用戶簽到后可以跳轉到大轉盤抽獎&#xff0c;抽獎獲得的獎金可以抵消購物的費用&#xff0c;以此來培養用戶使用app的習慣。 數據表介紹 現有一張用戶行為表action_log&#xff0c;主要字段如下&#xff0c…

springboot mongodb 配置多數據源

我想要的效果是&#xff0c;一個類統一管理多數據源&#xff0c;我傳個參數進去&#xff0c;它就能返回我對應的mongotemplate 但是根據"mongbodb 多數據源"的關鍵詞&#xff0c;找不到我想要的效果。 網上大多都是明確知道自己是幾個數據源&#xff0c;然后每個數…

Styletron: 面向組件的樣式設計工具包

styletron官網&#xff1a; styletron的GitHub鏈接&#xff1a; styletron-react 一. 介紹 Styletron是一個通用的component-oriented&#xff08;面向組件的&#xff09;樣式工具。它屬于css-in-js類別。Styletron可以很好地與React配合使用&#xff0c;但也可以與其他框架或…

docker復現nginx錯誤配置漏洞

目錄 一、nginx環境搭建 1.1搭建步驟 二、docker復現Nginx配置漏洞 2.1安裝docker 2.2復現過程 2.1CRLF(carriage return/line feed)注入漏洞 2.2.目錄穿越 一、nginx環境搭建 1.1搭建步驟 1.先創建Nginx的目錄并進入&#xff08;命令如下&#xff09; mkdir /soft &&…

Android Framework底層原理之WMS的啟動流程

一 概述 今天&#xff0c;我們介紹 WindowManagerService&#xff08;后續簡稱 WMS&#xff09;的啟動流程&#xff0c;WMS 是 Android 系統中&#xff0c;負責窗口顯示的的服務。在 Android 中它也起著承上啟下的作用。 如下圖&#xff0c;就是《深入理解 Android》書籍中的…

033_小馳私房菜_Qcom平臺8系列-Dump Jpeg Jpeg Exif信息修改

全網最具價值的Android Camera開發系列資料~ 作者:8年Android Camera開發,從Camera app一直做到Hal和驅動~ 歡迎訂閱,相信能擴展你的知識面,提升個人能力~ 平臺:高通8系列 jpeg相關代碼邏輯在camx/src/swl/jpeg/ 路徑下 一、Dump Jpeg 有時我們想把hal這邊拍照的jpe…

【C++】STL初識

1.STL的基本概念 2.vector存放內置數據類型 #include <iostream> using namespace std; #include <vector> #include <algorithm>void MyPrint(int val) {cout << val << endl; }void test01() {//創建vector容器對象&#xff0c;并且通過模板參…

Harbor企業鏡像倉庫部署(本地)

簡述&#xff1a; Docker 官方鏡像倉庫是用于管理公共鏡像的地方&#xff0c;大家可以在上面找到想要的鏡像&#xff0c;也可以把自己的鏡像推送上去。但是有時候服務器無法訪問互聯網&#xff0c;或者不希望將自己的鏡像放到互聯網上&#xff0c;那么就需要用到 Docker Regis…

越南的區塊鏈和NFT市場調研

越南的區塊鏈和NFT市場調研 基本介紹 https://zh.wikipedia.org/wiki/%E8%B6%8A%E5%8D%97 語言文字&#xff1a; 越南語&#xff0c; 文字以國語字&#xff08;越南羅馬字&#xff09;為主&#xff0c;漢喃文&#xff08;漢字&#xff09; 貨幣&#xff1a;越南盾 人口(2022…

Leetcode-每日一題【劍指 Offer 15. 二進制中1的個數】

題目 編寫一個函數&#xff0c;輸入是一個無符號整數&#xff08;以二進制串的形式&#xff09;&#xff0c;返回其二進制表達式中數字位數為 1 的個數&#xff08;也被稱為 漢明重量).&#xff09;。 提示&#xff1a; 請注意&#xff0c;在某些語言&#xff08;如 Java&…

如何安全地移動WSL 2 到另一個驅動器

當您擁有小型 SSD 并且適用于 Linux 的 Windows 子系統 (WSL) 的大小呈指數增長時&#xff0c;這真的很痛苦。沒有簡單的方法將 WSL 安裝移動到另一個驅動器。在這篇博客中&#xff0c;我將討論如何通過小步解決這個問題。 1.打開具有管理員訪問權限的 PowerShell或命令提示符…

【Docker】Windows下docker環境搭建及解決使用非官方終端時的連接問題

目錄 背景 Windows Docker 安裝 安裝docker toolbox cmder 解決cmder 連接失敗問題 資料獲取方法 背景 時常有容器方面的需求&#xff0c;經常構建調試導致測試環境有些混亂&#xff0c;所以想在本地構建一套環境&#xff0c;鏡像調試穩定后再放到測試環境中。 Windows …

多線程與高并發--------線程池

線程池 一、什么是線程池 在開發中&#xff0c;為了提升效率的操作&#xff0c;我們需要將一些業務采用多線程的方式去執行。 比如有一個比較大的任務&#xff0c;可以將任務分成幾塊&#xff0c;分別交給幾個線程去執行&#xff0c;最終做一個匯總就可以了。 比如做業務操…

Windows電腦快速搭建FTP服務教程

FTP介紹 FTP&#xff08;File Transfer Protocol&#xff09;是一種用于在計算機網絡上進行文件傳輸的標準協議。它提供了一種可靠的、基于客戶端-服務器模型的方式來將文件從一個主機傳輸到另一個主機。在本文中&#xff0c;我將詳細介紹FTP的工作原理、數據傳輸模式以及常見…

數據結構【第4章】——棧與隊列

隊列是只允許在一端進行插入操作、而在另-端進行刪除操作的線性表。 棧 棧與隊列&#xff1a;棧是限定僅在表尾進行插入和刪除操作的線性表。 我們把允許插入和刪除的一端稱為棧頂&#xff08;top&#xff09;&#xff0c;另一端稱為棧底&#xff08;bottom&#xff09;&…

VBA技術資料MF42:VBA_從Excel中上面的單元格復制公式

【分享成果&#xff0c;隨喜正能量】唯有夢想才配讓你不安&#xff0c;唯有行動才能解除你的不安.繩鋸木斷&#xff0c;水滴石穿。也許你現在做的事情很小&#xff0c;只要你能日積月累的堅持下去&#xff0c;才會發現意義非凡。所謂的成功&#xff0c;便是別人失敗的時候你還在…