Javascript 调用setState而不触发重新渲染
我将UI状态存储在React组件的状态中,比如说。state。receivedElements,它是一个数组。我希望在将元素推送到receivedElements时重新渲染。我的问题是,当数组变为空时,是否可以不触发渲染? 或者通常,我可以只调用一次setState而不重新渲染,而在其他所有时间重新渲染吗?有什么选择和解决办法吗? 我已经通读了这篇文章,但什么也没找到 我希望在将元素推送到receivedElements时重新渲染 请注意,如果使用以下选项,则不会重新渲染:Javascript 调用setState而不触发重新渲染,javascript,reactjs,Javascript,Reactjs,我将UI状态存储在React组件的状态中,比如说。state。receivedElements,它是一个数组。我希望在将元素推送到receivedElements时重新渲染。我的问题是,当数组变为空时,是否可以不触发渲染? 或者通常,我可以只调用一次setState而不重新渲染,而在其他所有时间重新渲染吗?有什么选择和解决办法吗? 我已经通读了这篇文章,但什么也没找到 我希望在将元素推送到receivedElements时重新渲染 请注意,如果使用以下选项,则不会重新渲染: this.state
this.state.receivedElements.push(newElement); // WRONG
这违反了您不能直接修改状态的限制。您需要:
this.setState(function(state) {
return {receivedElements: state.receivedElements.concat([newElement])};
});
它需要是回调版本,因为它依赖于当前状态来设置新状态
我的问题是,当数组变为空时,是否可以不触发渲染
是-在这种情况下不调用setState
听起来好像receivedElements不应该是您所在州的一部分,而是您单独管理并在适当情况下反映在州中的信息。例如,组件本身可能有receivedElements,而状态为displayedElements。然后:
…和
// (...some operation that removes from `receivedElements`...), then:
if (this.receivedElements.length) {
this.setState({displayedElements: this.receivedElements.slice()});
}
请注意,如果this.receivedElements为空,我们如何不调用setState
我希望在将元素推送到receivedElements时重新渲染
请注意,如果使用以下选项,则不会重新渲染:
this.state.receivedElements.push(newElement); // WRONG
这违反了您不能直接修改状态的限制。您需要:
this.setState(function(state) {
return {receivedElements: state.receivedElements.concat([newElement])};
});
它需要是回调版本,因为它依赖于当前状态来设置新状态
我的问题是,当数组变为空时,是否可以不触发渲染
是-在这种情况下不调用setState
听起来好像receivedElements不应该是您所在州的一部分,而是您单独管理并在适当情况下反映在州中的信息。例如,组件本身可能有receivedElements,而状态为displayedElements。然后:
…和
// (...some operation that removes from `receivedElements`...), then:
if (this.receivedElements.length) {
this.setState({displayedElements: this.receivedElements.slice()});
}
请注意,如果this.receivedElements为空,我们如何不调用setState。听起来像是要修改组件的行为。你觉得呢,它会持续多久,直到你需要破解这个破解程序?你为什么不解释一下你到底在建什么,你有什么问题。或者换句话说,是什么真正的问题导致了你正在尝试的黑客行为。事实上,我并不是故意的。。我只是想知道我是否可以避免不必要的渲染。。。即使出现渲染也不会出错:这应该由shouldComponentUpdate解决。听起来你想破解组件的行为。你觉得呢,它会持续多久,直到你需要破解这个破解程序?你为什么不解释一下你到底在建什么,你有什么问题。或者换句话说,是什么真正的问题导致了你正在尝试的黑客行为。事实上,我并不是故意的。。我只是想知道我是否可以避免不必要的渲染。。。即使出现渲染,也不会出错:这应该由shouldComponentUpdate解决。虽然此解决方案有效且不会调用新渲染,但我强烈建议不要直接修改状态,每次都使用setState。如果出于某种原因,您不想在状态更改后调用render,则应使用shouldComponentUpdate。@patotoma:我不同意避免上述情况;如果对元素的更改有时不应该呈现,那么在我看来,它们不应该是状态的一部分,不过,这是另一种可行的方法;你可以发布一个关于这个的答案。@T.J.Crowder非常解释性!谢谢我已经知道了关于“突变状态不会导致渲染”和“它需要是回调版本”的内容,但现在我对状态中存储什么和不存储什么有了全新的看法:@patotoma:我知道如何使用shouldComponentUpdate。。看来你不明白这个蠢货?我在这里问的问题。。我只是想知道我是否可以跳过一次渲染,或者,我是否可以调用setState而不触发一次重新渲染。虽然此解决方案有效,并且不会调用新渲染,但我强烈建议不要直接修改状态,每次都使用setState。如果出于某种原因,您不想在状态更改后调用render,则应使用shouldComponentUpdate。@patotoma:我不同意避免上述情况;如果对元素的更改有时不应该呈现,那么在我看来,它们不应该是状态的一部分,不过,这是另一种可行的方法;你可以发布一个关于这个的答案。@T.J.Crowder非常解释性!谢谢我已经知道了关于“突变状态不会导致渲染”和“它需要是回调版本”的内容,但现在我对状态中存储什么和不存储什么有了全新的看法:@patotoma:我知道如何使用shouldComponentUpdate。。看来你不明白这个蠢货?我在这里问的问题。。我 我只是想知道我是否可以跳过一次渲染,或者,我是否可以调用setState而不触发一次重新渲染。