Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用setState而不触发重新渲染_Javascript_Reactjs - Fatal编程技术网

Javascript 调用setState而不触发重新渲染

Javascript 调用setState而不触发重新渲染,javascript,reactjs,Javascript,Reactjs,我将UI状态存储在React组件的状态中,比如说。state。receivedElements,它是一个数组。我希望在将元素推送到receivedElements时重新渲染。我的问题是,当数组变为空时,是否可以不触发渲染? 或者通常,我可以只调用一次setState而不重新渲染,而在其他所有时间重新渲染吗?有什么选择和解决办法吗? 我已经通读了这篇文章,但什么也没找到 我希望在将元素推送到receivedElements时重新渲染 请注意,如果使用以下选项,则不会重新渲染: this.state

我将UI状态存储在React组件的状态中,比如说。state。receivedElements,它是一个数组。我希望在将元素推送到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

我希望在将元素推送到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而不触发一次重新渲染。