和props不同菇夸,一個組件的state可以隨時被改變共苛,這些狀態(tài)將保存到組件被銷毀判没。話雖如此,你應(yīng)該小心地改變組件的狀態(tài)不然你會遇到問題隅茎。
為什么要小心澄峰?好吧,你要知道改變一個組件的state或者props會自動調(diào)用重新渲染頁面辟犀,所以新的值會反映在界面中俏竞。意味著頻繁的更改將使你的代碼運(yùn)行緩慢,這會大大降低用戶體驗(yàn)堂竟。
React有特殊的更新state方法被稱為setState()它將新值合并到現(xiàn)有值中然后觸發(fā)重新渲染魂毁。所以修改我們的buttonClicked()方法使它在修改名字的同時保持國家不變:
src/pages/Detail.js
buttonClicked() {
const newState = {
name: chance.first()
};
this.setState(newState);
}
注意我已經(jīng)去掉了對 this.forceUpdate()
的調(diào)用 – 現(xiàn)在不需要了. 實(shí)際上,調(diào)用 forceUpdate()
只在React沒有察覺到一個深度state變化時調(diào)用,所以我們現(xiàn)在不需要它了跃捣。
新的代碼完全實(shí)現(xiàn)了我們的想法: 它創(chuàng)建一個新的狀態(tài) newState
它含有新的姓名, 然后通過調(diào)用 this.setState()
用來改變組件的state. 因?yàn)閟tate的改變自動出發(fā)重新渲染漱牵, 你會在每次點(diǎn)擊按鈕時看到一個新的名稱,但國家不變疚漆。
在極端情況下你設(shè)置了太多的state或props變化酣胀,不停地調(diào)用render()
會使頁面反應(yīng)緩慢,react有個解決辦法:如果你創(chuàng)建了一個方法shouldUpdateComponent()
然后返回false娶聘,你的組件就不會被重新渲染闻镶。
為了使用這個方法,你要么可以放一些業(yè)務(wù)邏輯在shouldUpdateComponent()
按照你的需要返回true或者false丸升∶或者總是返回false然后調(diào)用this.forceUpdate()
來重新渲染頁面。這個方法會強(qiáng)制調(diào)用render即使shouldUpdateComponent()
返回false狡耻。