我在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. 在没有onClick触发器的情况下,在渲染中发出AJAX请求
- 6. 在不创建新缓冲区的情况下渲染对象
- 7. 在不渲染的情况下对模型应用变换
- 8. 在不渲染JSON的情况下创建ajax应用程序
- 9. 如何在不渲染页面的情况下使用Openfaces/JSF调用方法?
- 10. 阵营JS视图不会重新渲染上的setState()
- 11. React JS - setState和不需要的重新渲染
- 12. 如何在不重新渲染的情况下使用Layoutmanager对嵌套视图进行重新排序/排序?
- 13. 在什么情况下不会调用Sybase触发器?
- 14. 在不渲染性能的情况下在textarea中显示xml
- 15. window.onload不是由richfaces中的重新渲染触发的?
- 16. 部分视图可否在没有回传的情况下重新渲染?
- 17. 反应:componentDidMount + setState不重新渲染组件
- 18. 反应是不是重新渲染,以反映setState
- 19. 即使在我调用setState之后组件还会重新渲染?
- 20. 在不渲染的情况下测量SVG文本大小
- 21. 如何在不刷新页面的情况下在EmberJS 1.13.8中渲染视图?
- 22. 如何在ReactJS的模型更改中触发重新渲染?
- 23. Redux&React:调用componentDidUpdate,但不会发生重新渲染
- 24. 如何在没有express.js的情况下使用jade渲染partials?
- 25. 如何触发反应,用套接字重新渲染UI?
- 26. backbone.js事件在重新渲染后没有触发
- 27. AngularJS + Rails $ scope模型已更新,但未触发重新渲染
- 28. 在不重新发明轮子的情况下保护REST API
- 29. 在没有着色器的情况下在bgfx中渲染?
- 30. 在某些情况下禁用更新触发器
听起来像你想破解组件的行为。你怎么看,它会持续多久,直到你需要破解黑客?你为什么不解释你到底在做什么以及你有什么问题。或者换句话说,真正的问题会导致你正在尝试的这种黑客行为。 – Thomas
实际上,我不是故意要_hack_ ..我只是想知道我是否可以避免不必要的渲染......即使渲染发生,也不会出错:) – Dane