国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

React 18 state 狀態(tài)更新函數(shù)

這篇具有很好參考價值的文章主要介紹了React 18 state 狀態(tài)更新函數(shù)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

參考文章

把一系列 state 更新加入隊列

設(shè)置組件 state 會把一次重新渲染加入隊列。但有時可能會希望在下次渲染加入隊列之前對 state 的值執(zhí)行多次操作。為此,了解 React 如何批量更新 state 會很有幫助。

React 會對 state 更新進行批處理

在下面的示例中,可能會認為點擊 “+3” 按鈕會使計數(shù)器遞增三次,因為它調(diào)用了 setNumber(number + 1) 三次:

import { useState } from 'react';

export default function Counter() {
  const [number, setNumber] = useState(0);

  return (
    <>
      <h1>{number}</h1>
      <button onClick={() => {
        setNumber(number + 1);
        setNumber(number + 1);
        setNumber(number + 1);
      }}>+3</button>
    </>
  )
}

但是,每一次渲染的 state 值都是固定的,因此無論調(diào)用多少次 setNumber(1),在第一次渲染的事件處理函數(shù)內(nèi)部的 number 值總是 0

setNumber(0 + 1);
setNumber(0 + 1);
setNumber(0 + 1);

但是這里還有另外一個影響因素需要討論。React 會等到事件處理函數(shù)中的 所有 代碼都運行完畢再處理 state 更新。 這就是為什么重新渲染只會發(fā)生在所有這些 setNumber() 調(diào)用 之后 的原因。

這讓你可以更新多個 state 變量——甚至來自多個組件的 state 變量——而不會觸發(fā)太多的 重新渲染。但這也意味著只有在事件處理函數(shù)及其中任何代碼執(zhí)行完成 之后,UI 才會更新。這種特性也就是 批處理,它會使 React 應(yīng)用運行得更快。它還會幫你避免處理只更新了一部分 state 變量的令人困惑的“半成品”渲染。

React 不會跨 多個 需要刻意觸發(fā)的事件(如點擊)進行批處理——每次點擊都是單獨處理的。請放心,React 只會在一般來說安全的情況下才進行批處理。這可以確保,例如,如果第一次點擊按鈕會禁用表單,那么第二次點擊就不會再次提交它。

在下次渲染前多次更新同一個 state

這是一個不常見的用例,但是如果想在下次渲染之前多次更新同一個 state,可以像 setNumber(n => n + 1) 這樣傳入一個根據(jù)隊列中的前一個 state 計算下一個 state 的 函數(shù),而不是像 setNumber(number + 1) 這樣傳入 下一個 state 值。這是一種告訴 React “用 state 值做某事”而不是僅僅替換它的方法。

現(xiàn)在嘗試遞增計數(shù)器:

import { useState } from 'react';

export default function Counter() {
  const [number, setNumber] = useState(0);

  return (
    <>
      <h1>{number}</h1>
      <button onClick={() => {
        setNumber(n => n + 1);
        setNumber(n => n + 1);
        setNumber(n => n + 1);
      }}>+3</button>
    </>
  )
}

在這里,n => n + 1 被稱為 更新函數(shù)。當將它傳遞給一個 state 設(shè)置函數(shù)時:

  1. React 會將此函數(shù)加入隊列,以便在事件處理函數(shù)中的所有其他代碼運行后進行處理。
  2. 在下一次渲染期間,React 會遍歷隊列并給你更新之后的最終 state。
setNumber(n => n + 1);
setNumber(n => n + 1);
setNumber(n => n + 1);

下面是 React 在執(zhí)行事件處理函數(shù)時處理這幾行代碼的過程:

  1. setNumber(n => n + 1)n => n + 1 是一個函數(shù)。React 將它加入隊列。
  2. setNumber(n => n + 1)n => n + 1 是一個函數(shù)。React 將它加入隊列。
  3. setNumber(n => n + 1)n => n + 1 是一個函數(shù)。React 將它加入隊列。

當在下次渲染期間調(diào)用 useState 時,React 會遍歷隊列。之前的 number state 的值是 0,所以這就是 React 作為參數(shù) n 傳遞給第一個更新函數(shù)的值。然后 React 會獲取上一個更新函數(shù)的返回值,并將其作為 n 傳遞給下一個更新函數(shù),以此類推:

更新隊列 n 返回值
n => n + 1 0 0 + 1 = 1
n => n + 1 1 1 + 1 = 2
n => n + 1 2 2 + 1 = 3

React 會保存 3 為最終結(jié)果并從 useState 中返回。

這就是為什么在上面的示例中點擊“+3”正確地將值增加“+3”

如果在替換 state 后更新 state 會發(fā)生什么

這個事件處理函數(shù)會怎么樣?你認為 number 在下一次渲染中的值是什么?

import { useState } from 'react';

export default function Counter() {
  const [number, setNumber] = useState(0);

  return (
    <>
      <h1>{number}</h1>
      <button onClick={() => {
        setNumber(number + 5);
        setNumber(n => n + 1);
      }}>增加數(shù)字</button>
    </>
  )
}

這是事件處理函數(shù)告訴 React 要做的事情:

  1. setNumber(number + 5)number0,所以 setNumber(0 + 5)。React 將 “替換為 5 添加到其隊列中。
  2. setNumber(n => n + 1)n => n + 1 是一個更新函數(shù)。 React 將 該函數(shù) 添加到其隊列中。

在下一次渲染期間,React 會遍歷 state 隊列:

更新隊列 n 返回值
“替換為 5 0(未使用) 5
n => n + 1 5 5 + 1 = 6

React 會保存 6 為最終結(jié)果并從 useState 中返回。

注意:setState(x) 實際上會像 setState(n => x) 一樣運行,只是沒有使用 n!

如果在更新 state 后替換 state 會發(fā)生什么

讓我們再看一個例子。你認為 number 在下一次渲染中的值是什么?

import { useState } from 'react';

export default function Counter() {
  const [number, setNumber] = useState(0);

  return (
    <>
      <h1>{number}</h1>
      <button onClick={() => {
        setNumber(number + 5);
        setNumber(n => n + 1);
        setNumber(42);
      }}>增加數(shù)字</button>
    </>
  )
}

以下是 React 在執(zhí)行事件處理函數(shù)時處理這幾行代碼的過程:

  1. setNumber(number + 5)number0,所以 setNumber(0 + 5)。React 將 “替換為 5 添加到其隊列中。
  2. setNumber(n => n + 1)n => n + 1 是一個更新函數(shù)。React 將該函數(shù)添加到其隊列中。
  3. setNumber(42):React 將 “替換為 42 添加到其隊列中。

在下一次渲染期間,React 會遍歷 state 隊列:

更新隊列 n 返回值
“替換為 5 0(未使用) 5
n => n + 1 5 5 + 1 = 6
“替換為 42 6(未使用) 42

然后 React 會保存 42 為最終結(jié)果并從 useState 中返回。

總而言之,以下是可以考慮傳遞給 setNumber state 設(shè)置函數(shù)的內(nèi)容:

  • 一個更新函數(shù)(例如:n => n + 1)會被添加到隊列中。
  • 任何其他的值(例如:數(shù)字 5)會導(dǎo)致“替換為 5”被添加到隊列中,已經(jīng)在隊列中的內(nèi)容會被忽略。

事件處理函數(shù)執(zhí)行完成后,React 將觸發(fā)重新渲染。在重新渲染期間,React 將處理隊列。更新函數(shù)會在渲染期間執(zhí)行,因此 更新函數(shù)必須是 純函數(shù) 并且只 返回 結(jié)果。不要嘗試從它們內(nèi)部設(shè)置 state 或者執(zhí)行其他副作用。在嚴格模式下,React 會執(zhí)行每個更新函數(shù)兩次(但是丟棄第二個結(jié)果)以便幫助你發(fā)現(xiàn)錯誤。

命名慣例

通??梢酝ㄟ^相應(yīng) state 變量的第一個字母來命名更新函數(shù)的參數(shù):

setEnabled(e => !e);
setLastName(ln => ln.reverse());
setFriendCount(fc => fc * 2);

如果你喜歡更冗長的代碼,另一個常見的慣例是重復(fù)使用完整的 state 變量名稱,如 setEnabled(enabled => !enabled),或使用前綴,如 setEnabled(prevEnabled => !prevEnabled)。文章來源地址http://www.zghlxwxcb.cn/news/detail-645465.html

摘要

  • 設(shè)置 state 不會更改現(xiàn)有渲染中的變量,但會請求一次新的渲染。
  • React 會在事件處理函數(shù)執(zhí)行完成之后處理 state 更新。這被稱為批處理。
  • 要在一個事件中多次更新某些 state,可以使用 setNumber(n => n + 1) 更新函數(shù)。

到了這里,關(guān)于React 18 state 狀態(tài)更新函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • React 18 用 State 響應(yīng)輸入

    React 18 用 State 響應(yīng)輸入

    參考文章 React 控制 UI 的方式是 聲明式 的。不必直接控制 UI 的各個部分,只需要聲明組件可以處于的不同狀態(tài),并根據(jù)用戶的輸入在它們之間切換。這與設(shè)計師對 UI 的思考方式很相似。 當設(shè)計 UI 交互時,可能會去思考 UI 如何根據(jù)用戶的操作而響應(yīng) 變化 。想象一個允許用

    2024年02月12日
    瀏覽(19)
  • React 18 state 如同一張快照

    參考文章 也許 state 變量看起來和一般的可讀寫的 JavaScript 變量類似。但 state 在其表現(xiàn)出的特性上更像是一張快照。設(shè)置它不會更改已有的 state 變量,但會觸發(fā)重新渲染。 可能會認為用戶界面會直接對點擊之類的用戶輸入做出響應(yīng)并發(fā)生變化。在 React 中,它的工作方式與這

    2024年02月13日
    瀏覽(55)
  • React 18 在組件間共享狀態(tài)

    React 18 在組件間共享狀態(tài)

    參考文章 有時候,希望兩個組件的狀態(tài)始終同步更改。要實現(xiàn)這一點,可以將相關(guān) state 從這兩個組件上移除,并把 state 放到它們的公共父級,再通過 props 將 state 傳遞給這兩個組件。這被稱為“狀態(tài)提升”,這是編寫 React 代碼時常做的事。 在這個例子中,父組件 Accordion 渲

    2024年02月10日
    瀏覽(24)
  • React 18 遷移狀態(tài)邏輯至 Reducer 中

    參考文章 對于擁有許多狀態(tài)更新邏輯的組件來說,過于分散的事件處理程序可能會令人不知所措。對于這種情況,可以 將組件的所有狀態(tài)更新邏輯整合到一個外部函數(shù)中 ,這個函數(shù)叫作 reducer 。 隨著組件復(fù)雜度的增加,將很難一眼看清所有的組件狀態(tài)更新邏輯。例如,下面

    2024年02月10日
    瀏覽(17)
  • React Hook入門小案例 在函數(shù)式組件中使用state響應(yīng)式數(shù)據(jù)

    React Hook入門小案例 在函數(shù)式組件中使用state響應(yīng)式數(shù)據(jù)

    Hook是react 16.8 新增的特性 是希望在不編寫 class的情況下 去操作state和其他react特性 Hook的話 就不建議大家使用class的形式了 當然也可以用 這個他只是不推薦 我們還是先創(chuàng)建一個普通的react項目 我們之前寫一個react組件可以這樣寫 簡單說 就是聲明一個類對象 然后在里面 寫組

    2024年02月09日
    瀏覽(35)
  • 【前端】React快速入門+Redux狀態(tài)管理

    【前端】React快速入門+Redux狀態(tài)管理

    本文旨在記錄react的基礎(chǔ)內(nèi)容,幫助有需要的同學(xué)快速上手,需要進一步了解描述更加穩(wěn)妥和全面的信息,請查閱官方文檔 官方文檔點擊這里進行跳轉(zhuǎn) react框架 vue,react,angular這幾種主流前端框架使用頻率較高…本質(zhì)還是js庫。 React.js是一個用于構(gòu)建用戶界面的JavaScript庫。它由

    2024年02月12日
    瀏覽(60)
  • React突變狀態(tài),更新數(shù)據(jù)(對象或者數(shù)組),頁面數(shù)據(jù)不刷新的問題

    ? 剛開始開發(fā)時,我們可能會遇到這樣的問題,使用useState創(chuàng)建對象或者數(shù)組時,setState時,頁面未進行更新。這里其實是一個突變狀態(tài)的問題 什么是突變狀態(tài)? ? 當我們給 setState 一個基本數(shù)據(jù)類型時, state 值將會是 一個不可變的值 ? 更新時, state 的 原始值也不會被更

    2024年02月11日
    瀏覽(28)
  • React中的組件的渲染函數(shù)(Render Function)是什么?什么是React中的函數(shù)組件和類組件?如何在React中進行狀態(tài)管理?

    React中的組件可以有多種形式的渲染函數(shù),包括傳統(tǒng)的render()方法,以及近年來興起的函數(shù)組件和Hooks中的useState()和useEffect()。在這篇文章中,我將詳細介紹渲染函數(shù),以及如何在React中使用它們。 渲染函數(shù)(Render Function)是指組件在生命周期中的一個特殊方法,它的作用是根據(jù)

    2024年02月13日
    瀏覽(26)
  • React源碼解析18(5)------ 實現(xiàn)函數(shù)組件【修改beginWork和completeWork】

    React源碼解析18(5)------ 實現(xiàn)函數(shù)組件【修改beginWork和completeWork】

    經(jīng)過之前的幾篇文章,我們實現(xiàn)了基本的jsx,在頁面渲染的過程。但是如果是通過函數(shù)組件寫出來的組件,還是不能渲染到頁面上的。 所以這一篇,主要是對之前寫得方法進行修改,從而能夠顯示函數(shù)組件,所以現(xiàn)在我們在index.js文件中,修改一下jsx的寫法。修改成函數(shù)組件

    2024年02月13日
    瀏覽(20)
  • 前端react入門day04-useEffect與Hook函數(shù)

    前端react入門day04-useEffect與Hook函數(shù)

    (創(chuàng)作不易,感謝有你,你的支持,就是我前行的最大動力,如果看完對你有幫助,請留下您的足跡) 目錄 useEffect 的使用 useEffect 的概念理解 useEffect 依賴項參數(shù)說明 useEffect — 清除副作用 自定義Hook實現(xiàn) React Hooks使用規(guī)則 useEffect是一個React Hook函數(shù),用于在React組件中 創(chuàng)建不

    2024年01月22日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包