背景:
constructor(props) {
super(props);
this.state = {
_TagList: []
}
}
onSelectCompany() {
console.log("this.state._TagList:",this.state._TagList);//[]
this.state._TagList.push('垃圾');
console.log("this.state._TagList:",this.state._TagList);//['垃圾']
}
問題:state如何被修改,state就是一個變量,任何修改變量的方法都可以修改它,這么理解對吧??如果對,state改變了并不會造成頁面數(shù)據(jù)更新,只有調(diào)用setState了再回刷新,是嗎??
首先要明確一個事情,我們所說的修改state,不僅僅是修改state本身的值,更是要引發(fā)頁面重新render,或者說修改state就是為了引發(fā)頁面重新render。
this.state._TagList.push('');這個并不是在真正的修改state,因為它不會引發(fā)頁面render,你此時去render函數(shù)里面輸出最新的值,是輸不出來的。真正的修改state一定是調(diào)用setState。
this.state._TagList是在取出state的值,就是個普通變量,任何修改變量的方法都可以修改它,也是對的,但是這不是在修改state。
關(guān)于正確地修改狀態(tài),官方文檔說了三點:
1.不要直接更新狀態(tài)。直接修改state,組件并不會重新渲染。
// 錯誤
this.state.name = 'React';
// 正確
this.setState({name: 'React'});
2.狀態(tài)更新可能是異步的。React可能會將多次setState修改合并成一次修改來提高性能。這可能導(dǎo)致真正狀態(tài)修改時,依賴的this.state并不能保證是最新的state,所以不要依賴當(dāng)前的state計算下個state。
// 錯誤
this.setState({
counter: this.state.counter + 1
});
// 正確
this.setState((prevState) => ({
counter: prevState.counter + 1
}));
3.狀態(tài)更新合并是淺合并。當(dāng)調(diào)用setState修改組件狀態(tài)時,只需要傳入發(fā)生改變的state,而不是組件全部的state。
// 原始狀態(tài)
this.state = {
name: 'React',
age: 3
}
// 修改狀態(tài)
this.setState({
name: 'React Native'
});北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。