最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React中狀態(tài)設(shè)置this.setState()的實(shí)現(xiàn)

 更新時(shí)間:2025年09月18日 10:37:47   作者:歪歪100  
本文對比了React中類組件和函數(shù)組件的狀態(tài)管理方式,前者合并更新,后者替換更新,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

React 中的狀態(tài)設(shè)置,即 setState。這是一個(gè)核心概念,但它在 類組件和 函數(shù)組件(使用 Hook) 中有不同的寫法和行為。

我會(huì)分兩部分來解釋。

第一部分:類組件中的setState

在類組件中,狀態(tài)是一個(gè)叫 this.state 的對象,而更新狀態(tài)的方法是 this.setState()。

1. 基本用法

setState 用于更新組件的狀態(tài)對象,并通知 React 需要重新渲染。

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }

  increment() {
    // 傳入一個(gè)新的對象來更新狀態(tài)
    this.setState({ count: this.state.count + 1 });
  }

  render() {
    return (
      <div>
        <p>You clicked {this.state.count} times</p>
        <button onClick={() => this.increment()}>
          Click me
        </button>
      </div>
    );
  }
}

2. 關(guān)鍵特性:異步與批處理

setState 是異步的!
當(dāng)你調(diào)用 setState 時(shí),React 不會(huì)立即更新組件。它會(huì)將多個(gè) setState 調(diào)用合并在一起(批處理 Batched Updates),然后進(jìn)行一次更新以提高性能。

這意味著你不能在調(diào)用 setState 后立刻依賴 this.state 來獲取最新值。

// ? 錯(cuò)誤的做法
increment() {
  this.setState({ count: this.state.count + 1 });
  console.log(this.state.count); // 這里打印的仍然是舊的值,不是 +1 后的值
}

3. 如何依賴前一個(gè)狀態(tài)?使用函數(shù)形式

為了解決異步問題并確保你基于最新的狀態(tài)進(jìn)行更新,setState 可以接受一個(gè)函數(shù)作為參數(shù),而不是一個(gè)對象。

這個(gè)函數(shù)會(huì)接收先前的狀態(tài)(prevState) 作為第一個(gè)參數(shù)。

increment() {
  this.setState((prevState) => {
    return { count: prevState.count + 1 }; // 基于之前的狀態(tài)計(jì)算新狀態(tài)
  });
}

這種形式在需要進(jìn)行多次連續(xù)狀態(tài)更新時(shí)尤其重要,因?yàn)樗鼙WC每次更新都基于最新且正確的前一個(gè)狀態(tài)。

4. 第二個(gè)參數(shù):回調(diào)函數(shù)

setState 的第二個(gè)參數(shù)是一個(gè)可選的回調(diào)函數(shù),它會(huì)在狀態(tài)更新完成并且組件重新渲染后執(zhí)行。你可以在這里執(zhí)行一些依賴于新狀態(tài) DOM 的操作。

increment() {
  this.setState(
    (prevState) => ({ count: prevState.count + 1 }),
    () => {
      console.log('狀態(tài)已更新,當(dāng)前count是:', this.state.count); // 這里可以拿到最新值
      // 可以在這里操作DOM,比如根據(jù)新的狀態(tài)設(shè)置焦點(diǎn)等
    }
  );
}

第二部分:函數(shù)組件中的setState(使用useStateHook)

在函數(shù)組件中,我們使用 useState Hook 來管理狀態(tài)。它返回一個(gè)狀態(tài)值和一個(gè)用于更新該狀態(tài)的函數(shù)(通常命名為 setXxx)。

1. 基本用法

import { useState } from 'react';

function Counter() {
  // useState 返回一個(gè)數(shù)組: [當(dāng)前狀態(tài)值, 更新狀態(tài)的函數(shù)]
  const [count, setCount] = useState(0);

  function increment() {
    // 直接傳入新的值
    setCount(count + 1);
  }

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={increment}>
        Click me
      </button>
    </div>
  );
}

2. 同樣具有異步和批處理特性

函數(shù)組件中的 setCount 也是異步的,并且也會(huì)被 React 批量處理。你不能在調(diào)用 setCount 后立刻讀取 count 的值,因?yàn)樗€沒有被更新。

// ? 錯(cuò)誤的做法
function increment() {
  setCount(count + 1);
  console.log(count); // 仍然是舊值
}

3. 如何依賴前一個(gè)狀態(tài)?同樣使用函數(shù)形式

與類組件類似,更新函數(shù)(如 setCount)也可以接受一個(gè)函數(shù)。這個(gè)函數(shù)接收先前的狀態(tài)值作為其唯一參數(shù)。

function increment() {
  setCount((prevCount) => prevCount + 1);
}

這是推薦的做法,尤其是在事件循環(huán)中可能會(huì)多次更新同一個(gè)狀態(tài)時(shí),它能保證你總是在最新的狀態(tài)基礎(chǔ)上進(jìn)行更新。

4. 與類組件setState的重大區(qū)別

特性類組件 this.setState函數(shù)組件 setXxx (Hook)
更新機(jī)制合并更新:傳入的對象會(huì)與舊 state 淺合并。替換更新:直接用新值替換舊狀態(tài)。不會(huì)自動(dòng)合并對象!
示例this.setState({ user }); 只會(huì)更新 state.user,不影響 state.posts。setUser(newUser) 會(huì)直接用 newUser替換掉整個(gè) user 狀態(tài)。

函數(shù)組件中更新對象狀態(tài)的正確做法:
因?yàn)槟悴荒苤苯有薷臓顟B(tài),必須創(chuàng)建一個(gè)新對象。

const [user, setUser] = useState({ name: 'Alice', age: 25 });

function updateName(newName) {
  // ? 錯(cuò)誤:直接修改原對象
  // user.name = newName;
  // setUser(user); // 不會(huì)觸發(fā)重新渲染,因?yàn)橐脹]變

  // ? 正確:展開運(yùn)算符創(chuàng)建新對象
  setUser({
    ...user,      // 拷貝所有舊屬性
    name: newName // 用新值覆蓋其中的name屬性
  });
}

總結(jié)與最佳實(shí)踐

  1. 都是異步的:無論類組件還是函數(shù)組件,setState 都是異步操作,不要指望調(diào)用后能立刻拿到新值。
  2. 使用函數(shù)形式更新:當(dāng)你新的狀態(tài)依賴于舊的狀態(tài)時(shí)(如計(jì)數(shù)器、列表追加等),務(wù)必使用 setXxx(prevState => newState) 的函數(shù)形式。這是最安全、最可靠的做法。
  3. 理解更新差異
    • 類組件:合并更新。
    • 函數(shù)組件:替換更新。更新對象時(shí)記得使用展開運(yùn)算符 ...Object.assign() 來創(chuàng)建一個(gè)新對象。
  4. 副作用操作:在類組件中,使用 setState(updater, callback) 的第二個(gè)回調(diào)參數(shù)。在函數(shù)組件中,使用 useEffect Hook 來響應(yīng)狀態(tài)的變化。useEffect(() => { ... }, [count]);

到此這篇關(guān)于React中狀態(tài)設(shè)置this.setState()的文章就介紹到這了,更多相關(guān)React 狀態(tài)設(shè)置this.setState()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼

    React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼

    顏色選擇器是一個(gè)用于選擇和調(diào)整顏色的工具,它可以讓用戶選擇他們喜歡的顏色,本文主要介紹了React實(shí)現(xiàn)隨機(jī)顏色選擇器的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • react?中?mobx的使用案例詳解

    react?中?mobx的使用案例詳解

    這篇文章主要介紹了react?中?mobx的使用案例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • React路由監(jiān)聽/跳轉(zhuǎn)/守衛(wèi)的完整指南

    React路由監(jiān)聽/跳轉(zhuǎn)/守衛(wèi)的完整指南

    React Router 是 React 單頁應(yīng)用的核心路由庫,除了基礎(chǔ)的路由配置,日常開發(fā)中還會(huì)高頻用到路由監(jiān)聽、編程式跳轉(zhuǎn)、路由守衛(wèi)等進(jìn)階功能,本文從實(shí)戰(zhàn)角度拆解這三大核心能力,需要的朋友可以參考下
    2026-03-03
  • react中hooks使用useState的更新不觸發(fā)dom更新問題及解決

    react中hooks使用useState的更新不觸發(fā)dom更新問題及解決

    這篇文章主要介紹了react中hooks使用useState的更新不觸發(fā)dom更新問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 基于react hooks,zarm組件庫配置開發(fā)h5表單頁面的實(shí)例代碼

    基于react hooks,zarm組件庫配置開發(fā)h5表單頁面的實(shí)例代碼

    這篇文章主要介紹了基于react hooks,zarm組件庫配置開發(fā)h5表單頁面,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • react中useEffect函數(shù)的詳細(xì)用法(最新推薦)

    react中useEffect函數(shù)的詳細(xì)用法(最新推薦)

    useEffect是React中的一個(gè)Hook,用于在函數(shù)組件中處理副作用(如數(shù)據(jù)獲取、訂閱、手動(dòng)更改 DOM 等),useEffect屬于組件的生命周期方法,下面通過本文給大家分享react中useEffect函數(shù)的詳細(xì)用法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • React創(chuàng)建組件的三種方式及其區(qū)別

    React創(chuàng)建組件的三種方式及其區(qū)別

    本文主要介紹了React創(chuàng)建組件的三種方式及其區(qū)別,具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • redux工作原理講解及使用方法

    redux工作原理講解及使用方法

    這篇文章主要介紹了redux工作原理講解及使用方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-11-11
  • React Native AsyncStorage本地存儲(chǔ)工具類

    React Native AsyncStorage本地存儲(chǔ)工具類

    這篇文章主要為大家分享了React Native AsyncStorage本地存儲(chǔ)工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • 在create-react-app中使用sass的方法示例

    在create-react-app中使用sass的方法示例

    這篇文章主要介紹了在create-react-app中使用sass的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-10-10

最新評論

东港市| 永安市| 汝阳县| 南郑县| 阿拉善盟| 湖北省| 沙洋县| 逊克县| 阿巴嘎旗| 故城县| 边坝县| 醴陵市| 文成县| 灯塔市| 古浪县| 工布江达县| 潼南县| 图们市| 喀喇沁旗| 类乌齐县| 民乐县| 长岛县| 班玛县| 明水县| 綦江县| 沽源县| 平邑县| 浮山县| 盐边县| 英吉沙县| 商洛市| 谷城县| 黄平县| 濮阳市| 石首市| 江孜县| 偏关县| 龙泉市| 改则县| 琼中| 桃源县|