Confusing setState() documentation
還沒有人認領這個 Issue。
- 主要語言
- JavaScript
- 星號
- 11.8k
- 分支
- 7.9k
- 平均合併
- 1 天 11 小時
- 30 天內合併 PR
- 11
描述
I have a general question about setState() because the documentation about this is a little bit confusing:
I have a component with a state. This state should only be updated (re-rendered) when a condition met. If not then there is no need to re-render the component. Reading the docs about setState tells me that reading this.state right after calling setState() is a potential pitfall. Instead I should use setState with an updater function because there prevState is guaranteed to has the right value. So my first approach was:
class MyComponent extends React.Component {
onSomething = () => {
this.setState(prevState => {
if (prevState.counter < 10) {
return { counter: prevState.counter + 1 };
}
return prevState;
});
}
}
But with that approach my component always get re-rendered because setState() always forces a re-render (in the beginning I thought that when I return the same prevState object React does nothing. But I was wrong). So what else can I do to avoid re-rendering?
Again in the same doc we can read that calling setState() only when the new state differs from the previous state will avoid unnecessary re-renders. So I could re-write my code into following:
class MyComponent extends React.Component {
onSomething = () => {
if (this.state.counter < 10) {
this.setState(prevState => {
return { counter: prevState.counter + 1 };
});
}
}
}
But then if (this.state.counter < 10) could have a different value than prevState.counter
So on the one side the docs recommend to not read from this.state directly because the calls to setState() could be batched and this.state has an outdated value but on the other side it recommends to call setState() only when the new state differs from the old state. But how can I check if the state differs when it could be potentially outdated?
In the end I don't know actually how to set my state and avoid a re-rerender when a condition met. Any help here would be great.
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
先查看連結的 setState() 文件和此 issue 中的範例,然後確認其中如何描述 updater 函式、批次處理和重新渲染。當文件清楚地解決表面上的矛盾,並說明如何在條件滿足時避免不必要的重新渲染時,即表示完成。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- javascript, react
- 領域
- documentation
- Issue 類型
- 文件
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 需要釐清
- 新手友好度
- 35/100