国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

react有哪些方法改變state

藏色散人
發(fā)布: 2023-01-06 09:18:14
原創(chuàng)
2827人瀏覽過
react改變state的方法有:1、通過“this.setState({title:'React'});”方法修改state;2、通過“this.setState((preState, props)=>counter:preState.quantity+1)”方法修改state;3、通過“replaceState”方法改變組件的狀態(tài)。

react有哪些方法改變state

本教程操作環(huán)境:Windows10系統(tǒng)、react18.0.0版、Dell G3電腦。

react有哪些方法改變state?

在react中正確修改state

一,在react中可以通過this.state.{屬性}的方式直接獲取state,但當(dāng)我們想要修改state的時(shí)候有許多的坑需要注意,以下 為三種常見的陷阱:

不能直接修改state。

組件直接修改state,并不會(huì)重新觸發(fā)render。列如:

this.state.title='React';
登錄后復(fù)制

正確修改方式是:

this.setState({title:'React'});
登錄后復(fù)制
state的更新是異步的

調(diào)用setState時(shí),組件state并不會(huì)立即改變,而是把要修改的狀態(tài)放入事件隊(duì)列中,而react優(yōu)化了真正的執(zhí)行時(shí)機(jī),并且出于本身性能原因,可能會(huì)將多次setState的狀態(tài)修改合并成一次狀態(tài)修改。因此不要依靠當(dāng)前的state計(jì)算下一個(gè)state,因?yàn)楫?dāng)真正執(zhí)行狀態(tài)修改時(shí),有時(shí)候依賴的this.state并不能保證是最新的state,因?yàn)閞eact本身會(huì)把多次state合并成一次,這時(shí)this.state還是舊state,因此也不能依賴當(dāng)前的props計(jì)算下一個(gè)狀態(tài),因?yàn)閜rops的更新也是異步。如:對(duì)于react常用的列子中有一個(gè)點(diǎn)擊加號(hào)數(shù)值增加一的操作,點(diǎn)擊一次+,數(shù)量會(huì)加1,如果連續(xù)點(diǎn)擊兩次,還是會(huì)加1,這是在react合并修改為一次的情況下,相當(dāng)與執(zhí)行了如下代碼:

Object.assign(
previousState,
{quantity:this.state.quantity+1},
{quantity:this.state.quantity+1},
)
登錄后復(fù)制

于是后面覆蓋前面的操作,最終數(shù)值只加1,此時(shí)可以使用另一個(gè)函數(shù)作為參數(shù)的setState,這個(gè)函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是本次組件修改前的狀態(tài),第二個(gè)參數(shù)是當(dāng)前最新的props。

正確修改方式是:

this.setState((preState, props)=>counter:preState.quantity+1)
登錄后復(fù)制
state的更新是一個(gè)合并的過程

?

當(dāng)調(diào)用ssetState修改組件的狀態(tài)時(shí),只需要傳入發(fā)生改變的state,而不是完整的state,因?yàn)榻M件state的更新時(shí)一個(gè)合并的過程,列如,一個(gè)組件的狀態(tài)為:

this.state={

title:'React',

content:'React is an wondeful JS library'

}
登錄后復(fù)制

注:當(dāng)只需要修改title時(shí),將修改的title傳給setState即可:

?

this.setState({title:'ReactJs'});
登錄后復(fù)制

react會(huì)合并最新的title到原來的狀態(tài),同時(shí)保留原來狀態(tài)的content,最終合并state為:

this.state={
title:'ReactJs,
content:''React is an wondeful Js library
}
登錄后復(fù)制

?

二,state與不可變對(duì)象

react官方把state當(dāng)成不可變對(duì)象,一方面直接修改this.state,組件并不會(huì)重新render;另一方面,state中包含的所有狀態(tài)都應(yīng)該是不可變的對(duì)象,當(dāng)state當(dāng)中的某一個(gè)狀態(tài)發(fā)生變化時(shí),應(yīng)該重新創(chuàng)建這個(gè)狀態(tài)對(duì)象,而不是直接修改原來的state狀態(tài),那么當(dāng)狀態(tài)發(fā)生變化時(shí),如何去創(chuàng)建新的狀態(tài)呢,我們根據(jù)狀態(tài)類型可以分為下面三種情況:

?

狀態(tài)類型為不可變類型(number,string,bool,bull,undefined)

這種情況最簡(jiǎn)單,因?yàn)闋顟B(tài)是不可變類型,所以直接給要修改的狀態(tài)賦一個(gè)新值即可,列如下面我們要修改的count為number型,title(string),success(bool)三個(gè)狀態(tài):

?

this.setState({
count:1,
title:'React',
success:true
})
登錄后復(fù)制

?

狀態(tài)類型為數(shù)組

假如有一個(gè)數(shù)組類型的狀態(tài)books,當(dāng)想books中增加一本書時(shí),既可使用數(shù)組的concat方法或者es6的擴(kuò)展語法(apread syntax)

方法一:使用preState,concat創(chuàng)建新數(shù)組

?

 this.setState((preState)=>books:preState.books.concat(['React Guide']))
登錄后復(fù)制

?

方法二:ES6 spread syntax

?

this.setState(preState=>books:[...preState,''React Guide])
登錄后復(fù)制

?

當(dāng)我們從books中截取部分元素作為新狀態(tài)時(shí),可以用數(shù)組的slice方法:

?

this.setState(preState=>books:preState.books.slice(1,3))
登錄后復(fù)制

?

當(dāng)從books中過濾部分元素后,作為新狀態(tài)時(shí),可以使用filter方法:

?

 this.setState(preState => {
        books: preState.books.filter(item => {

        return item != 'React';

        })
    })
登錄后復(fù)制

?

注意:不要使用push,pop,shift,unshift,splice登方法修改數(shù)組類型的狀態(tài),因?yàn)檫@些方法都是在原數(shù)組的基礎(chǔ)上修改的,而concat,slice,filter會(huì)返回一個(gè)新的數(shù)組。

?

方法三:狀態(tài)的類型是普通對(duì)象(不包含:string,array)

?

使用es6的Object.assgin()方法

?

this.setState({

onwer:Object.assgin({},preState.onwer,{name:'Jason'});

})
登錄后復(fù)制

?

使用對(duì)象擴(kuò)展語法(Object spread properties):

this.setState(preState=>{
owner:{...preState.owner,name:'Jason'}
})
登錄后復(fù)制

?

總結(jié):

創(chuàng)建新的狀態(tài)的關(guān)鍵是,避免使用會(huì)直接修改原對(duì)象的方法而是使用可以返回一個(gè)新對(duì)象的方法,當(dāng)然可以使用Immutable的JS庫(kù)(Immutable.js)實(shí)現(xiàn)類似的效果。

?

思考:

為什么React推薦組件狀態(tài)的修改時(shí)不可變對(duì)象呢?

  1. 不可變對(duì)象的修改會(huì)返回一個(gè)新的對(duì)象,不用擔(dān)心原對(duì)象在不小心的情況下修改導(dǎo)致的錯(cuò)誤,方便程序的管理和調(diào)試
  2. 處于性能的考慮,對(duì)象組件的狀態(tài)是不可變對(duì)象時(shí),在組件的shouldComponentUpdate方法中僅需要比較前后兩次狀態(tài)對(duì)象的引用就可以判斷狀態(tài)是否真的改變,從而避免不必要的render調(diào)用

三:除了以上方法修改react組件的狀態(tài)之外,我們還經(jīng)常會(huì)用到replaceState改變組件的狀態(tài)

?

replaceState()方法與setState()類似,但是方法只會(huì)保留nextState中狀態(tài),原state不在nextState中的狀態(tài)都會(huì)被刪除。使用語法:

replaceState(object nextState,[, function callback])
登錄后復(fù)制

nextState,將要設(shè)置的新狀態(tài),該狀態(tài)會(huì)替換當(dāng)前的state。

callback,可選參數(shù),回調(diào)函數(shù)。該函數(shù)會(huì)在replaceState設(shè)置成功,且組件重新渲染后調(diào)用。

如:

 class App extends React.Component{

     constructor(props);

      this.state={

      count:1

      title:'數(shù)字計(jì)算'

      }

}

handleClick=()=>{

  this.replaceState({

    count:this.state.count+1

  })

}

render(){
    return(
      <button onClick={this.onClick}>點(diǎn)我</button>
      )
  }

}
登錄后復(fù)制

?

結(jié)果為:

?

{
count:1
}
登錄后復(fù)制
推薦學(xué)習(xí):《react視頻教程

以上就是react有哪些方法改變state的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件
最佳 Windows 性能的頂級(jí)免費(fèi)優(yōu)化軟件

每個(gè)人都需要一臺(tái)速度更快、更穩(wěn)定的 PC。隨著時(shí)間的推移,垃圾文件、舊注冊(cè)表數(shù)據(jù)和不必要的后臺(tái)進(jìn)程會(huì)占用資源并降低性能。幸運(yùn)的是,許多工具可以讓 Windows 保持平穩(wěn)運(yùn)行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)