1. 程式人生 > >react 中的 setState

react 中的 setState

語法:setState(newState [,callback])

1、只要有入門基礎的同學都知道 setState({...}) 是更新元件中的 state 內容

2、但是,setState 是非同步的,倘若我們設定完就使用新的 state 就可能得不到我們想要的結果,例如:

this.state = {init:1}
this.setState({init:2})
console.log(this.state.init); // 輸出結果為:1
//----------但是,我們明明是想要結果為 2------so~~~回撥函式就解決了這個問題~~~-------
this.setState({init:2
}, ()=>{ console.log(this.state.init); // 輸出結果為:2 })

⚠️從上面的程式碼段可以看出,setState 中的回撥函式作用大致與 componnetDidUpdate生命週期函式相似

setState 方法將元件的更改排入佇列,並且告訴 React 使用更改後的狀態更新元件;而 React 會在必要的時候一起更新幾個元件,而不是每次都立即進行更新。所以,我們需要將 setState 視為請求,而不是一個立即執行函式。在官方文件中,建議使用 componentDidUpdate 代替回撥函式這種邏輯。

3、setState 內在隱患,由於 setState 是非同步的,並且有可能是同一週期同一批次進行處理,就會出現以下問題:

 後一個更改替代了前一個更改,原本為們是想要 quantity + 2,由於非同步批次處理,導致 quantity 最終只加 1

1 Object.assign(
2   previousState,
3   {quantity: state.quantity + 1},
4   {quantity: state.quantity + 1},
5   ...
6 )

 倘若下一個狀態取決於先前的狀態,,不建議寫作形式如下:

//wrong
this
.setState({ counter: this.state.counter + this.props.increment, });

  而是:

//correct
this.setState((prevState, props) => ({
  counter: prevState.counter + props.increment
}));

相關推薦

ReactsetState的更新策略

React中setState的更新策略 React中的setState有Batch模式(批量更新模式)和普通模式。 普通模式下,setState能夠即時更新state,重新呼叫 render 方法,然後把render方法所渲染的最新的內容顯示到頁面上。 Batch模式下,Re

ReactsetState修改深層物件

在React中經常會使用到setState,因為在react生態中,state就是一切.在開發過程中,時長會在state中遇到一些比較複雜的資料結構,類似下面這樣的: state = { list: { objA: { name: 'A',

詳解ReactsetState回撥函式

使用React過程中,中可以使用this.state來訪問需要的某些狀態,但是需要更新或者修改state時,一般而言,我們都會使用setState()函式,從而達到更新state的目的,setState()函式執行會觸發頁面重新渲染UI。但是呢,setState是非同步的!這就難

ReactsetState()方法的用法

在react中,我們一般都是通過建構函式中的this.state來儲存我們的資料,即初始化我們的資料, 在很多情況下,我們都需要改變初始值來達到我們想要的效果, 但是,this.state只能儲存我們的資料或接受外部的資料儲存起來,並不能改變我們的資料,那我們想要改變this.s

reactsetState第二個引數

初心-楊瑞超個人部落格誠邀您加入qq群(IT-程式猿-技術交流群):757345416 該函式會在setState函式呼叫完成並且元件開始重渲染的時候被呼叫,我們可以用該函式來監聽渲染是否完成,demo程式碼如下: this.setState( { link: 'h

ReactsetState非同步更新

前幾天面試web前端工作,被一道題問蒙了,面試官問React中setState的非同步更新如何控制為同步更新,當時懵的一批,畢竟面的第一家前端,心裡感覺本來就是非同步,怎麼會改成同步,這不扯呢嗎,事後才發現這件事無非就是一個非同步的協同問題,平時看了很多關於es6的Promi

React setState({key:value}) key值 動態變化,如何動態設定key的值。

state = { visible1: false, visible2: false, visible3: false } onShow = (key) => { this.setState({ key: true

ReactsetState學習總結

react中setState方法到底是非同步還是同步,其實這個是分在什麼條件下是非同步或者同步。 1.先來回顧一下react元件中改變state的幾種方式: import React, { Component } from 'react' class Index extends Component {

29.React ajaxsetState

cto func url com nbsp data his 元素 get $.ajax({ url: url, type: "POST", timeout : 6000000, //超時時間設置,單位毫

reactsetState使用遇到的問題

dir ret man 重復 prop length 根據 sync 函數 setState()更新的數據和自己預期的不一致 對 React 新手來說,使用 setState 是一件很復雜的事情。即使是熟練的 React 開發,也很有可能因為 React 的一些機制而產生一

reactsetState的使用和深入理解

      前端框架從MVC過渡到MVVM。從DOM操作到資料驅動,一直在不斷的進步著,提升著,       angular中用的是watcher物件,vue是觀察者模式,react就是state了,他們各有各的特點,沒有好壞之分,只有需求不同而選

React怎麼讓setState同步更新

  學過React,setState的寶寶們,都知道為了提高效能React將setState設定為批次更新,即非同步操作函式,不能以順序控制流的方式設定某些事件,不能依賴於this.state計算未來狀態,比如,我們希望拿到服務端來的資料後,再進行其他操作,在大型應用中,如果事件的觸發速度快於setState

react-native setState 之後的state值不能立即使用

前言:在react-native開發中;呼叫setState函式之後的state值不能立即使用,這個問題是我們經常遇到的。 原因是 setState之後,需要走完react-native生命週期,也就是走到render時,state的值才會變成setState設定時的值,如果需要立即使用st

react開發setState失效的問題

在react專案的開發中碰到一個奇怪的問題,setState失效。我這裡提到的失效不是說的setState由於非同步而造成的資料延遲問題,如果有這個問題的話,你可以通過this.forceUpdate()的方式去強制更新;言歸正傳,我碰到的問題是由於我的子元件使用了componentWillRe

React 使用this.setState方法

在React中會用到很多的區域性的全域性變數,此時就會用到this.setState。 有時候用this.setState之後就要立刻用改變之後的值,這時就會出現錯誤,這個值是沒有變化的。那麼問題來了 ,為什麼會這樣呢? 答案就是this.setState。它是一個一部的 那麼又有人要問

react setState

語法:setState(newState [,callback]) 1、只要有入門基礎的同學都知道 setState({...}) 是更新元件中的 state 內容 2、但是,setState 是非同步的,倘若我們設定完就使用新的 state 就可能得不到我們想要的結果,例如: this.state = {

React使用Redux

react修復遺留問題webpack.prod.config.js中缺少了對path庫的引用,執行構建npm run build:prod的時候失敗。在文件開始的地方引入node.js的path庫就可以了。package.json裏面定義了一個build:dev的腳本,這個腳本其實有點多余,不過有時候需要打包

react入門-----(jsx語法,在react獲取真實的dom節點)

rip opp blog alice code text fault 通過 cnblogs 1、jsx語法 1 var names = [‘Alice‘, ‘Emily‘, ‘Kate‘]; 2 <!-- HTML 語言直接寫在 JavaS

批量清除react的計時器小組件

cnblogs timer timers react 批量 img es2017 blog http 在Timers的父組件被卸載時,批量清除各個計時器。 批量清除react中的計時器小組件

React引入IScroll插件做滾動

操作 完成後 attr 在微信端 bar 我們 upd ppr 們的 最近做一個H5項目,數據交互量比較大,很多頁面都是從後臺拿過來數據做一個列表顯示,這自然就遇到了滾動。 剛開始我直接使用css做法,直接添加overflow: scroll;但在微信端用戶滑動會直接將整個