2017-04-06 28 views
1

在我的状态更改处理我应该需要做到以下几点:如果prev和next状态相同,会引发状态变化吗?

deviceSize = ... 
this.setState((prevState) => { 
    if (prevState.deviceSize != deviceSize) { 
    return { 
     deviceSize 
    } 
    } else { 
    return null 
    } 
}) 

或者是下面的足够

this.setState((prevState) => { 
    return { 
     deviceSize 
    } 
}) 

我担心的是,如果我回来的东西会做一些UI更新。

+0

如果状态是一样的上调用setState只能调用,那么会有什么更新。 TL; DR你的第二个例子就足够了,如果你的组件是纯的 – FuzzyTree

+0

如果没有状态变化,你为什么要调用set状态?你不应该这样做 –

+0

如果shouldComponentUpdate返回true(或者没有shouldComponentUpdate),调用setState将**总是**触发一个shouldComponentUpdate和render函数的完整运行。 –

回答

1

你错了。 setState从不检查值。当它被调用时,它只是重新渲染视图。

要检查组件应重新渲染或没有,检查shouldComponentUpdate() method.

`shouldComponentUpdate(nextProps, nextState)` { 

    1. it is triggered before the re-rendering process . 
    2. It tells render() method should be called or not. 
    3. If nothing changed, you can avoid re-render by returning false. 
} 
+0

shouldComponentUpdate的问题是下面的所有东西将不再更新根据此... https://www.bennadel.com/blog/2904-shouldcomponentupdate-will-short-circuit-an-entire-subtree-of-components-in-reactjs.htm –

+0

是的。如果没有改变,你为什么担心?如果国家相同,技术上没有任何改变。 – Ved

+0

由于呈现的组件可能会使用'this.state'值,在这种情况下,这并不重要 –

0

我不会在所有走这条路线。除非你知道setState的时间,否则你不应该调用setState。

You should read the docs on setState

使用componentDidUpdate知道什么时候上调用setState。像文档说

一般来说,我们建议使用componentDidUpdate()这样的逻辑,而不是 。

例如

componentDidUpdate(prevProps, prevState) { 
    if (prevState.something !== something) { // you can compare previous state or props with current state or props 
     this.setState({something: something}); 
    } 
} 

通知,当你真正想要