背景:
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);//['垃圾']
}
問(wèn)題:state如何被修改,state就是一個(gè)變量,任何修改變量的方法都可以修改它,這么理解對(duì)吧??如果對(duì),state改變了并不會(huì)造成頁(yè)面數(shù)據(jù)更新,只有調(diào)用setState了再回刷新,是嗎??
首先要明確一個(gè)事情,我們所說(shuō)的修改state,不僅僅是修改state本身的值,更是要引發(fā)頁(yè)面重新render,或者說(shuō)修改state就是為了引發(fā)頁(yè)面重新render。
this.state._TagList.push('');這個(gè)并不是在真正的修改state,因?yàn)樗粫?huì)引發(fā)頁(yè)面render,你此時(shí)去render函數(shù)里面輸出最新的值,是輸不出來(lái)的。真正的修改state一定是調(diào)用setState。
this.state._TagList是在取出state的值,就是個(gè)普通變量,任何修改變量的方法都可以修改它,也是對(duì)的,但是這不是在修改state。
關(guān)于正確地修改狀態(tài),官方文檔說(shuō)了三點(diǎn):
1.不要直接更新狀態(tài)。直接修改state,組件并不會(huì)重新渲染。
// 錯(cuò)誤
this.state.name = 'React';
// 正確
this.setState({name: 'React'});
2.狀態(tài)更新可能是異步的。React可能會(huì)將多次setState修改合并成一次修改來(lái)提高性能。這可能導(dǎo)致真正狀態(tài)修改時(shí),依賴的this.state并不能保證是最新的state,所以不要依賴當(dāng)前的state計(jì)算下個(gè)state。
// 錯(cuò)誤
this.setState({
counter: this.state.counter + 1
});
// 正確
this.setState((prevState) => ({
counter: prevState.counter + 1
}));
3.狀態(tài)更新合并是淺合并。當(dāng)調(diào)用setState修改組件狀態(tài)時(shí),只需要傳入發(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)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過(guò)二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。