我在React組件的state
中存儲UI狀態,比如this.state.receivedElements
這是一個數組。每當元素被推到receivedElements
時,我都想重新渲染。我的問題是,我可以不觸發渲染時,數組變成空的?
或者一般來說,我可以撥打setState()
一次,而無需重新渲染,而重新渲染所有其他時間? (有沒有任何選擇,解決方法?)
我已閱讀此主題:https://github.com/facebook/react/issues/8598但沒有找到任何內容。在不觸發重新渲染的情況下調用setState
回答
我想要重新呈現一個元素被推到
receivedElements
。
請注意,您不會得到重新繪製,如果你使用:
this.state.receivedElements.push(newElement); // WRONG
有違反您不能直接修改狀態的限制。你需要:
this.setState(function(state) {
return {receivedElements: state.receivedElements.concat([newElement])};
});
(它需要回調的版本,因爲它依賴於當前的狀態來設置新的狀態。)
我的問題是,我可以不觸發渲染時數組變空了?
是 —在這種情況下,沒有要求setState
。
這聽起來好像receivedElements
不應該是你的國家的一部分,但你分開管理和反映在state
適當的代替信息。例如,組件本身可能有receivedElements
,state
可能有displayedElements
。然後:
this.receivedElements.push(newElement);
this.setState({displayedElements: this.receivedElements.slice()});
...和
// (...some operation that removes from `receivedElements`...), then:
if (this.receivedElements.length) {
this.setState({displayedElements: this.receivedElements.slice()});
}
注意我們如何不叫setState
如果this.receivedElements
是空的。
雖然此解決方案有效並且不會調用新的渲染,但我**強烈**建議不要直接修改狀態,每次使用setState()。如果由於某種原因,您不想在狀態更改後調用渲染,則應該使用** shouldComponentUpdate **。 – patotoma
@patotoma:我不同意上面應該避免;如果對元素的更改有時不應該呈現,那麼在我看來,它們不應該成爲「狀態」的一部分。儘管如此,['shouldComponentUpdate'](https://reactjs.org/docs/react-component.html#shouldcomponentupdate)是另一種可行的方法。你可能會發表一個關於這個的答案。 –
@ T.J.Crowder非常具有說服力!謝謝!!我已經知道'變異狀態不會導致渲染'和'它需要成爲回調版本',但現在我有了一個全新的角度來看待'狀態'中的內容以及不應該:) – Dane
- 1. setState()不觸發重新渲染
- 2. 在什麼情況下,setState()不會導致React Component中的重新渲染?
- 3. 當數據被修改時,setState不會觸發重新渲染
- 4. ReactJS不會在setState後重新渲染
- 5. React SetState不會調用渲染
- 6. 在沒有onClick觸發器的情況下,在渲染中發出AJAX請求
- 7. 如何在不重新渲染BackboneJs的情況下更新視圖?
- 8. 如何在不重新渲染的情況下更新視圖marionette.js
- 9. 在不創建新緩衝區的情況下渲染對象
- 10. React組件不在setState上重新渲染
- 11. 在不渲染的情況下對模型應用變換
- 12. 在不使用VBO的情況下渲染opengl 3.1+
- 13. 在不渲染JSON的情況下創建ajax應用程序
- 14. 是否可以在不渲染HTML的情況下使用React?
- 15. 如何在不渲染頁面的情況下使用Openfaces/JSF調用方法?
- 16. React JS - setState和不需要的重新渲染
- 17. 的setState改變狀態,但不會重新渲染
- 18. 陣營JS視圖不會重新渲染上的setState()
- 19. 如何在不重新渲染的情況下使用Layoutmanager對嵌套視圖進行重新排序/排序?
- 20. 在backbone.js中重新渲染後不會觸發事件
- 21. 在什麼情況下不會調用Sybase觸發器?
- 22. 在不渲染性能的情況下在textarea中顯示xml
- 23. window.onload不是由richfaces中的重新渲染觸發的?
- 24. 反應:componentDidMount + setState不重新渲染組件
- 25. 反應是不是重新渲染,以反映setState
- 26. 部分視圖可否在沒有回傳的情況下重新渲染?
- 27. 即使在我調用setState之後組件還會重新渲染?
- 28. 如何在不渲染頁面的情況下點擊鏈接?
- 29. 在不渲染的情況下測量SVG文本大小
- 30. 如何在不觸發驗證的情況下觸發p:fileDownload
聽起來像你想破解組件的行爲。你怎麼看,它會持續多久,直到你需要破解黑客?你爲什麼不解釋你到底在做什麼以及你有什麼問題。或者換句話說,真正的問題會導致你正在嘗試的這種黑客行爲。 – Thomas
實際上,我不是故意要_hack_ ..我只是想知道我是否可以避免不必要的渲染......即使渲染髮生,也不會出錯:) – Dane